《大型网络架构》摘要

 

大型网站面对的问题

1.高并发 2.高可用 3.海量数据 4.用户分布广泛,设备情况复杂 5.安全环境恶劣 6.需求快速变更 7.渐进式发展

演化历程

1.最简单的是,应用程序、数据库、静态文件都在一台服务器上。 2.三者分离,分别在一台服务器上。应用程序服务器要求更好的计算能力,数据库服务器要求快速检索能力,文件服务器要求大容量储存。 3.大量访问数据库造成延迟,使用缓存解决:在应用程序服务器增加本地缓存,容量有限;增加分布式缓存服务器,作为远程缓存。 4.大量访问应用程序造成延迟,使用集群解决:增加负载均衡调度服务器;应用程序服务器集群中任一机器都提供相同的完整功能,可以不断增加服务器数量来改善性能,实现可伸缩性。 5.使用缓存后数据库仍然有压力,使用读写分离解决:写数据时访问主数据库,主数据库通过主从热备功能把数据同步到从数据库;读数据时访问从数据库。 6.使用CDN缓解网络延迟、减轻后端压力:数据缓存在网络提供商的机房,用户从距离自己最近的机房获取数据。 7.使用反向代理缓解网络延迟、减轻后端压力:数据缓存在反向代理服务器,用户从反向代理服务器获取数据。 8.使用分布式数据库解决海量数据的需求。 9.使用分布式文件系统解决海量文件的需求。 10.使用NoSQL和搜索引擎加速数据库检索。 11.业务拆分,独立部署维护。各业务之间通过消息队列进行数据分发。 12.把共用业务提取出来,为上层API提供服务,叫做分布式服务。

常用模式

1.分层:横向划分系统,下层为上层提供服务。 2.分割:纵向划分系统,按业务划分为高内聚低耦合的模块单元,独立开发部署维护。 3.分布式:分层和分割后可以进行分布式,把不同模块单元部署到不同的服务器上,通过远程调用协同工作。 4.分布式的缺点:网络延迟带来性能下降;维护可用性的成本上升;如何保证数据一致性;开发维护难度加大。 5.应用、文件、数据、计算均可分布式。 6.集群:多台服务器部署相同的应用,通过负载均衡设备共同对外提供服务。优点是实现伸缩性和增加可用性。 7.缓存:前提是访问热点不均衡、数据在一段时间内有效。CDN、反向代理、本地缓存、分布式缓存。 8.异步:一个业务操作划分为不同阶段,各阶段之间通过共享数据的方式异步协作。一台服务器内部可使用共享内存的消息队列;多台服务器之间可使用分布式消息队列。 9.消息队列的优点:提高可用性;加快响应速度;消除并发高峰。 10.冗余:目的是提高可用性。冷备份、热备份、灾备数据中心。 11.自动化:代码管理、测试、安全检测、部署、监控、失效转移恢复、分配资源等,均可自动化实现。

评价要素

性能

指标:响应时间、并发数(能同时处理多少请求)、吞吐量(单位时间能处理多少请求)。

1.前端优化: 减少http请求:合并CSS、合并JS、合并图片。 使用浏览器Cache,缓存一些静态资源。 压缩:在服务器对文件压缩,在浏览器解压 CSS在上,JS在下:浏览器会下载完全部CSS后再渲染页面;JS在加载后会立即执行,可能阻塞页面。 减少Cookie传输:静态资源使用独立域名。

2.应用服务器优化: 缓存: 异步: 集群: 代码:

3.存储优化:

可用性

手段:冗余备份、失效转移。 应用服务器:负载均衡+集群,当某台服务器不可用时,将其从集群列表中去除,将请求分发到其它服务器,使整个集群保持可用。 服务层服务器:分布式服务调用框架+集群,逻辑同上。 数据服务器:写入主服务器时同步到多台备份服务器,当主服务器宕机时,访问备用。 网站升级时,需要关闭服务,相当于宕机,所以一定要考虑可用性。

应用服务器无状态、完全对等。用Session管理状态。单机由Web容器管理Session。 集群的方案: 1.Session复制:在集群中同步Session对象。优点是简单、本机读取Session快速。缺点是占用大量网络和存储资源。 2.Session绑定:用特定的负载均衡算法,使源于同一IP的请求始终分发到同一台服务器上。缺点是不符合高可用。 3.利用Cookie记录Session:Session记录在浏览器,请求时发送到服务器,服务器返回时把修改后到Session也返回。缺点是大小受限、影响性能。 4.Session服务器:应用服务器每次读写Session时,都访问共享的Session服务器。Session服务器可以在分布式缓存、数据库服务器的基础上包装,也可以开发独立的服务器。

服务服务器无状态。 1.分级管理:服务器分级管理,核心应用和服务优先使用更好的硬件。隔离部署,避免连锁反应。 2.超时设置:一旦超时,抛出异常,重试或调度到其它服务器。 3.异步:应用对服务对调用通过消息队列等异步方式完成。 4.降级:高峰期拒绝服务或关闭其它非核心功能。 5.幂等性设计:必须在服务层保证重复调用和调用一次的效果相同。

数据服务器不可任意切换。高可用的手段是数据备份、失效转移。 CAP原理:存储系统无法同时满足一致性、可用性、分区耐受性(数据可以跨网络分区线性伸缩)。 实践中会强化可用性和伸缩性,放弃一致性。

数据冷备的优点是简单廉价,缺点是不能保证数据最终一致性、不能保证可用性。 异步热备(主从热备):只向一台主服务器写入,然后返回成功。主再异步地向多台从写入。读只访问从。 同步热备:同时向多个数据服务器写入,都写入成功再返回成功。总写入延迟是响应最慢的那台服务器,性能和异步热备差不多。

失效转移包括失效确认、访问转移、数据恢复。 确认的手段有心跳检测、访问失败报告。

更新时的宕机处理: 1.关闭负载均衡服务器上的一台或一部分路由。 2.关闭这些服务器。 3.更新这些服务器的代码。 4.启动这些服务器。 5.打开路由。 6.重复,直到所有服务器更新完成。

伸缩性

应用服务器:负载均衡。实现手段: 1.HTTP重定向:根据用户的HTTP请求计算一台真实的Web服务器地址,并将该地址写入重定向响应中返回给浏览器。优点是简单。缺点是要请求两次,性能差;重定向服务器自身可能成为性能瓶颈;可能被搜索引擎判定为SEO作弊,降低搜索排名。 2.DNS域名解析:在DNS服务器中配置多个A记录,每次域名解析请求都会根据负载均衡算法计算出一个IP地址返回。优点是省去了维护负载均衡服务器的麻烦。缺点是A记录可能被缓存,从而路由到已下线的服务器。实践中可作为一级负载均衡。 3.反向代理:反向代理服务器在应用层转发请求。在优点是简单。缺点是自身可能成为性能瓶颈。 4.IP负载均衡:反向代理服务器在IP层转发请求,修改数据包的源IP和目的IP。缺点是自身可能成为性能瓶颈。 5.链路层负载均衡:反向代理服务器在链路层转发请求,修改数据包的目的mac地址。优点是响应数据不必通过反向代理服务器,避免自身成为性能瓶颈。

负载均衡算法: 1.轮询:依次分发到每台服务器,每台服务器接收的请求数相同,适用于服务器硬件相同的场景。 2.加权轮询:根据硬件情况加权。 3.随机:随机分配。 4.最少链接:新的请求分发给链接数最少的服务器。 5.源地址散列:根据请求来源的IP进行Hash计算,这样来自同一IP的请求总在同一台服务器上处理,实现会话粘滞。

分布式缓存集群 余数Hash:当扩容时会造成缓存不命中。 一致性Hash:每台物理服务器虚拟为一组服务器,将虚拟服务器的Hash值构造为一个一致性Hash环。根据KEY得到Hash值,在Hash环上顺时针找离Hash值最近的虚拟服务器节点,再得到物理服务器信息。实践中一台物理虚拟为150台。

数据服务器: 分布式关系数据库的访问代理:Amoeba、Cobar。 应用程序通过JDBC驱动访问Cobar集群,Cobar服务器根据SQL和分库规则分解SQL,分发到不同的MySQL数据库上执行。 Cobar集群伸缩:Cobar可以看作无状态的应用服务器,所以采用负载均衡。 MySQL集群伸缩:以Schema为单位,从每个旧的服务器迁移部分到新的。 无法进行Join操作。

NoSQL:Apache HBase。

扩展性