大型网站技术架构阅读笔记

5万无一失:网站的高可用性

6永无止境:网站的伸缩性架构

7随需应变:网站的可扩展架构

网站的可用性指标是网站架构设计中的重要指标,对外是服务承诺,对内是考核指标。所以说,一个高可用的网站架构是一个公司所需要具备的。而在影响网站可用性的众多因素中,硬件故障是常态,网站的高可用架构设计的主要目的就是保证服务器硬件故障时,服务依然可用、数据依然保存并能够被访问。

  实现上述高可用架构的主要手段是数据和服务的冗余备份及失效转移,一旦某些服务器宕机,就将服务切换到其他可用的服务器上,如果磁盘损坏,则从备份的磁盘中读取数据。一个网站架构的基本分层模型是应用层、服务层、数据层,所以要实现上述高可用架构就是要实现应用的高可用、服务的高可用、数据的高可用。

  高可用的应用。一是通过负载均衡进行无状态服务的失效转移,简单来说当多台服务器组成的集群中的某一台服务器宕机,负载均衡服务器通过心跳检测机制发现该服务器,随后将对该服务器的请求发送到这个集群的其他服务器上;二是应用服务器集群的Session管理,集群环境下,Session管理的主要手段有:1.Session复制,使集群中的每一台服务器都保存所有用户的Session信息;2.Session绑定,即利用负载均衡的源地址Hash算法将Session绑定在某台特定的服务器上,保证Session总能在这台服务器上获取,但是一旦存放Session的服务器宕机,那么该服务器上的所有Session都不复存在了,所以很少网站用这个算法。3.利用Cookie记录Session,这种方式简单易用,可用性高,但也有一些缺点限制4.Session服务器,利用独立部署的Session服务器集群统一管理Session,应用服务器每次读取Session,都访问Session服务器。

  高可用的服务。可复用的服务和应用一样,也是无状态的服务,因此可以使用类似负载均衡的失效转移策略实现高可用的服务。除此之外,还有以下几种高可用的服务策略:分级管理、超时设置、异步调用、服务降级、幂等性设计。

  高可用的数据。不同于高可用的应用和服务,一旦服务器宕机,数据访问请求不能任意切换到集群中的其他服务器上。这时不能单纯的使用失效转移机制,而是将数据备份和失效转移机制结合起来。而关于缓存服务的高可用性,我认为缓存服务不是数据存储服务,缓存服务是为了加快数据读取而产生的,解决缓存服务器宕机所带来的问题,不能通过提高缓存服务本身的高可用。

  所谓网站的伸缩性是指不需要改变网站的软硬件设置,仅仅通过改变部署的服务器数量就可以扩大或缩小网站的服务处理能力。回顾网站架构的发展史,其实就是一部不断向网站添加服务器的历史。

  那么如何设计网站的伸缩性?不同功能进行物理分离实现伸缩,具体可分为纵向分离和横向分离;单一功能通过集群规模实现伸缩,通过上面所诉的分离后,使用服务器集群,将相同服务部署在多台服务器上构成一个集群整体对外提供服务。而通过集群规模实现伸缩又分为应用服务器集群伸缩性和数据服务器集群伸缩性,数据服务器集群也可分为缓存数据服务器集群和存储数据服务器集群。要想实现应用服务器集群伸缩性就必须依赖负载均衡服务器,而实现负载均衡的基础技术有以下几种。HTTP重定向负载均衡、DNS域名解析负载均衡、反向代理负载均衡、IP负载均衡、数据链路层负载均衡。

  不同于应用服务器集群的伸缩性设计,分布式缓存集群的伸缩性不能使用简单的负载均衡手段来实现,由于分布式缓存服务器集群中不同服务器中缓存的数据各不相同,缓存访问请求不可以在缓存服务器中的任意一台处理,必须先找到缓存有需要数据的服务器,然后才能访问。所以分布式缓存集群伸缩性设计的最主要目标就是新加入缓存服务器后应使整个缓存服务器集群中缓存的数据尽可能还被访问到。和分布式缓存集群的伸缩性设计不同,数据存储服务器集群的伸缩性对数据的持久性和可用性有了更高的要求。具体分为关系数据库集群的伸缩性设计和NoSQL数据库的伸缩性设计。 

  扩展性是指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。它是系统架构设计层面的“开闭原则”。伸缩性是指系统能够通过增加(减少)自身资源规模的方式增强(减少)自己计算处理事务的能力。在网站架构中,通常值利用集群的方式增加服务器数量、提高系统的整体事物吞吐能力。我们要对二者的使用有所区分,不能混淆二者的概念。

  如何构建可扩展的网站架构。我们知道开发低耦合系统是软件设计的终极目标之一,而低耦合的系统更容易扩展,低耦合的模块更容易复用。所以说,设计网站可扩展架构的核心思想是模块化,并在此基础之上,降低模块间的耦合性,提供模块的复用性。

  利用分布式消息队列降低系统耦合性。什么是分布式消息队列?队列是一种先进先出的数据结构,分布式消息队列可以看作将这种数据结构部署到独立的服务器上,应用程序可以通过远程访问接口使用分布式消息队列,进行消息存取操作,进而实现分布式的异步调用。

  使用分布式服务是降低系统耦合性的另一个重要手段。如果说分布式消息队列通过消息对象分解系统耦合性,不同子系统处理同一个消息;那么分布式服务则通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务调用。

  那么对于我们的xxx系统来说,可能上述所说是无法实现的,但是在一些小的方面也可以提高系统的可用性和易用性。针对于可用性,我们可以针对于数据进行优化,比如数据备份、日志记录等功能;将系统的应用、服务和数据分离,可以使用ssh框架来进行重写。而针对于易用性,我们就需要从用户的角度出发,让用户感到容易使用,能让用户用键盘解决的问题就不要让其使用鼠标。

  

原文地址:https://www.cnblogs.com/yibao/p/8625540.html