深刻理解大型分布式网站你应该知道那些概念

深刻理解大型分布式网站你应该知道这些概念css

1. I/O优化html

增长缓存,减小磁盘的访问次数。前端

优化磁盘的管理系统,设计最优的磁盘方式策略,以及磁盘的寻址策略,这是在底层操做系统层面考虑的。java

设计合理的磁盘存储数据块,以及访问这些数据库的策略,这是在应用层面考虑的。例如,咱们能够给存放的数据设计索引,经过寻址索引来加快和减小磁盘的访问量,还能够采用异步和非阻塞的方式加快磁盘的访问速度。web

应用合理的RAID策略提高磁盘I/O。算法

2. Web前端调优数据库

减小网络交互的次数(屡次请求合并)后端

减小网络传输数据量的大小(压缩)浏览器

尽可能减小编码(尽可能提早将字符转化为字节,或者减小从字符到字节的转化过程。)缓存

使用浏览器缓存

减小Cookie传输

合理布局页面

使用页面压缩

延迟加载页面

CSS在最上面,JS在最下面

CDN

反向代理

页面静态化

异地部署

3.服务降级(自动优雅降级)

拒绝服务和关闭服务

4.幂等性设计

有些服务自然具备幂等性,好比讲用户性别设置为男性,无论设置多少次,结果都同样。可是对转帐交易等操做,问题就会比较复杂,须要经过交易编号等信息进行服务调用有效性校验,只有有效的操做才能继续执行。

(注:幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部屡次调用对系统的影响是一致的. 声明为幂等的接口会认为外部调用失败是常态, 而且失败以后必然会有重试.)

5.失效转移

若数据服务器集群中任何一台服务器宕机,那么应用程序针对这台服务器的全部读写操做都须要从新路由到其余服务器,保证数据访问不会失败,这个过程叫失效转移。

失效转移包括:失效确认(心跳检测和应用程序访问失败报告)、访问转移、数据恢复。

失效转移保证当一个数据副本不可访问时,能够快速切换访问数据的其余副本,保证系统可用。

6.性能优化

根据网站分层架构,性能优化可分为:web前端性能优化、应用服务器性能优化、存储服务器性能优化。

1. web前端性能优化

浏览器访问优化:减小http请求;使用浏览器缓存;启用压缩;css放在页面最上面、javaScript放在页面最下面;减小Cookie传输

CDN加速

反向代理

2. 应用服务器性能优化

分布式缓存(Redis等)

异步操做(消息队列)

使用集群(负载均衡)

代码优化

3. 存储性能优化

机械硬盘vs固态硬盘

B+树 vs LSM树

RAID vs HDFS

7. 代码优化

多线程(Q:怎么确保线程安全?无锁机制有哪些?)

资源复用(单例模式,链接池,线程池)

数据结构

垃圾回收

8. 负载均衡

HTTP重定向负载均衡

当用户发来请求的时候,Web服务器经过修改HTTP响应头中的Location标记来返回一个新的url,而后浏览器再继续请求这个新url,实际上就是页面重定向。经过重定向,来达到“负载均衡”的目标。例如,咱们在下载PHP源码包的时候,点击下载连接时,为了解决不一样国家和地域下载速度的问题,它会返回一个离咱们近的下载地址。重定向的HTTP返回码是302。

优势:比较简单。

缺点:浏览器须要两次请求服务器才能完成一次访问,性能较差。重定向服务自身的处理能力有可能成为瓶颈,整个集群的伸缩性国模有限;使用HTTP302响应码重定向,有可能使搜索引擎判断为SEO做弊,下降搜索排名。

DNS域名解析负载均衡

DNS(Domain Name System)负责域名解析的服务,域名url其实是服务器的别名,实际映射是一个IP地址,解析过程,就是DNS完成域名到IP的映射。而一个域名是能够配置成对应多个IP的。所以,DNS也就能够做为负载均衡服务。

事实上,大型网站老是部分使用DNS域名解析,利用域名解析做为第一级负载均衡手段,即域名解析获得的一组服务器并非实际提供Web服务的物理服务器,而是一样提供负载均衡服务的内部服务器,这组内部负载均衡服务器再进行负载均衡,将请求分发到真是的Web服务器上。

优势:将负载均衡的工做转交给DNS,省掉了网站管理维护负载均衡服务器的麻烦,同时许多DNS还支持基于地理位置的域名解析,即会将域名解析成举例用户地理最近的一个服务器地址,这样能够加快用户访问速度,改善性能。

缺点:不能自由定义规则,并且变动被映射的IP或者机器故障时很麻烦,还存在DNS生效延迟的问题。并且DNS负载均衡的控制权在域名服务商那里,网站没法对其作更多改善和更强大的管理。

反向代理负载均衡

反向代理服务能够缓存资源以改善网站性能。实际上,在部署位置上,反向代理服务器处于Web服务器前面(这样才可能缓存Web相应,加速访问),这个位置也正好是负载均衡服务器的位置,因此大多数反向代理服务器同时提供负载均衡的功能,管理一组Web服务器,将请求根据负载均衡算法转发到不一样的Web服务器上。Web服务器处理完成的响应也须要经过反向代理服务器返回给用户。因为web服务器不直接对外提供访问,所以Web服务器不须要使用外部ip地址,而反向代理服务器则须要配置双网卡和内部外部两套IP地址。

优势:和反向代理服务器功能集成在一块儿,部署简单。

缺点:反向代理服务器是全部请求和响应的中转站,其性能可能会成为瓶颈。

LVS-NAT:修改IP地址

LVS-TUN: 一个IP报文封装在另外一个IP报文的技术。

LVS-DR:将数据帧的MAC地址改成选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。

9.缓存

缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,如今CPU愈来愈快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在不少方面都使用了缓存设计。

CDN: 及内容分发网络,部署在距离终端用户最近的网络服务商,用户的网络请求老是先到达他的网络服务商哪里,在这里缓存网站的一些静态资源(较少变化的数据),能够就近以最快速度返回给用户,如视频网站和门户网站会将用户访问量大的热点内容缓存在CDN中。

反向代理:反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最早访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户。

本地缓存:在应用服务器本地缓存着热点数据,应用程序能够在本机内存中直接访问数据,而无需访问数据库。

分布式缓存:大型网站的数据量很是庞大,即便只缓存一小部分,须要的内存空间也不是单机能承受的,因此除了本地缓存,还须要分布式缓存,将数据缓存在一个专门的分布式缓存集群中,应用程序经过网络通讯访问缓存数据。

使用缓存有两个前提条件,一是数据访问热点不均衡,某些数据会被更频繁的访问,这些数据应该放在缓存中;二是数据在某个时间段内有效,不会很快过时,不然缓存的数据就会因已经失效而产生脏读,影响结果的正确性。网站应用中,缓存处理能够加快数据访问速度,还能够减轻后端应用和数据存储的负载压力,这一点对网站数据库架构相当重要,网站数据库几乎都是按照有缓存的前提进行负载能力设计的。

10. 负载均衡算法

轮询 Round Robin

增强轮询 Weight Round Robin

随机 Random

增强随机 Weight Random

最少链接 Least Connections

增强最少链接

源地址散列 Hash

其余算法

最快算法(Fastest):传递链接给那些响应最快的服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP 就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

观察算法(Observed):链接数目和响应时间以这两项的最佳平衡为依据为新的请求选择服务器。当其中某个服务器发生第二到第7 层的故障,BIG-IP就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。

预测算法(Predictive):BIG-IP利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。(被BIG-IP 进行检测)

动态性能分配算法(Dynamic Ratio-APM):BIG-IP 收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。

动态服务器补充算法(Dynamic Server Act.):当主服务器群中因故障致使数量减小时,动态地将备份服务器补充至主服务器群。

服务质量算法(QoS):按不一样的优先级对数据流进行分配。

服务类型算法(ToS): 按不一样的服务类型(在Type of Field中标识)负载均衡对数据流进行分配。

规则模式算法:针对不一样的数据流设置导向规则,用户可自行

11. 扩展性和伸缩性的区别

扩展性:指对现有系统影响最小的状况下,系统功能可持续扩展或替身的能力。表如今系统基础设施稳定不须要常常变动,应用之间较少依赖和耦合,对需求变动能够敏捷响应。它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑将来功能扩展,当系统增长新功能时,不须要对现有系统的结构和代码进行修改。

衡量网站架构扩展性好坏的主要标准就是在网站增长新的业务产品时,是否能够实现对现有产品透明无影响,不须要任何改动或者不多改动既有业务功能就能够上线新产品。不一样产品之间是否不多耦合,一个产品改动对其余产品无影响,其余产品和功能不须要受牵连进行改动。

伸缩性:所谓网站的伸缩性指是不须要改变网站的软硬件设计,仅仅经过改变部署的服务器数量就能够扩大或者缩小网站的服务处理能力。

指系统可以增长(减小)自身资源规模的方式加强(减小)本身计算处理事务的能力。若是这种增减是成比例的,就被称做线性伸缩性。在网站架构中,一般指利用集群的方式增长服务器数量、提升系统的总体事务吞吐能力。

衡量架构伸缩性的主要标准就是能够用多台服务器构建集群,是否容易向集群中添加新的服务器。加入新的服务器后是否能够提供和原来服务无差异的服务、集群中的可容纳的总的服务器数量是否有限制。

12.分布式缓存的一致性hash

具体算法过程:先构造一个长度为2^32的整数环(这个环被称做一致性Hash环)根据节点名称的Hash值(其分布范围为[0,2^32 - 1])将缓存服务器阶段设置在这个Hash环上。而后根据须要缓存的数据的Key值计算获得Hash值(其分布范围也一样为[0,2^32 - 1]),而后在Hash环上顺时针查找举例这个KEY的hash值最近的缓存服务器节点,完成KEY到服务器的Hash映射查找。

优化策略:将每台物理服务器虚拟为一组虚拟缓存服务器,将虚拟服务器的Hash值放置在Hash环上,key在换上先找到虚拟服务器节点,再获得物理服务器的信息。

一台物理服务器设置多少个虚拟服务器节点合适呢?经验值:150。

13. 网络安全

1. XSS攻击

跨站点脚本攻击(Cross Site Script),指黑客经过篡改网页,注入恶意的HTML脚本,在用户浏览网页时,控制用户浏览器进行恶意操做的一种攻击方式。

防范手段:消毒(XSS攻击者通常都是经过在请求中嵌入恶意脚本大道攻击的目的,这些脚本是通常用户输入中不使用的,若是进行过滤和消毒处理,即对某些html危险字符转移,如“>”转译为“& gt;”);HttpOnly(防止XSS攻击者窃取Cookie).

2. 注入攻击:SQL注入和OS注入

SQL防范:预编译语句PreparedStatement; ORM;避免密码明文存放;处理好相应的异常。

3. CSRF(Cross Site Request Forgery,跨站点请求伪造)。听起来与XSS有点类似,事实上二者区别很大,XSS利用的是站内的信任用户,而CSRF则是经过假装来自受信任用户的请求来利用受信任的网站。

防范:httpOnly;增长token;经过Referer识别。

4. 文件上传漏洞

5. DDos攻击

14. 加密技术

摘要加密:MD5, SHA

对称加密:DES算法,RC算法, AES

非对称加密:RSA

非对称加密技术一般用在信息安全传输,数字签名等场合。

HTTPS传输中浏览器使用的数字证书实质上是通过权威机构认证的非对称加密的公钥。

15. 流控(流量控制)

流量丢弃

经过单机内存队列来进行有限的等待,直接丢弃用户请求的处理方式显得简单而粗暴,而且若是是I/O密集型应用(包括网络I/O和磁盘I/O),瓶颈通常再也不CPU和内存。所以,适当的等待,既可以替身用户体验,又可以提升资源利用率。

经过分布式消息队列来将用户的请求异步化。

顺便给你们推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。相信对于已经工做和遇到技术瓶颈的同窗,在这个群里会有你须要的内容。有须要的同窗请抓紧时间加入进来,无开发经验者误入哦!

相关文章
相关标签/搜索