本系列是极客时间《从0开始学架构》的读书笔记。
如果部分节点出现故障了,通过冗余可以提高可用性。若故障是数据无法访问,对应的就是存储高可用架构;若故障是计算失败,对应的就是计算高可用架构。
一、存储高可用架构
对应《25 | 高可用存储架构:双机架构》《26 | 高可用存储架构:集群和分区》
存储高可用,本质是将数据复制到多个存储设备,通过数据冗余的方式,来实现高可用。
复杂性主要体现在如何应对复制延迟和数据一致性。
常见的有主备、主从、主主、集群、分区。
双机架构:主备复制
备机起“备份”作用,不承担读操作,备机切换为主机时,需要人工切换。
优点是客户端无感知,主机和备机无复杂的状态,也不需要考虑主备切换动作。
缺点就是浪费硬件,需要人工切换。
通常用于后台管理系统。
双机架构:主从复制
备是备份,对外无感知;从是仆从,需要和外界联系。
一般是主机负责读写,从机负责读。
相对于主备,主从复制在主机故障时,依然可以提供读操作。正常情况下从机提供服务,没有浪费硬件。
缺点是客户端需要区分主从,若复制延迟,会出现数据不一致。并且,故障时依旧需要人工干预。
通常用于读多写少的业务。
双机架构:双机切换
主备和主从存在共同的问题:故障时无法自动切换,主机故障时无法写操作。
增加切换操作,变为主备切换和主从切换,统称双机切换。
需要确定切换的时机,就需要能够判断双机的状态。而具体如何去切换,就是切换决策。故障恢复后,数据出现不一致时,还要考虑如何解决冲突。这三点,都没有放之四海而皆准的答案。
依据状态传递的渠道,可分为互联式、中介式、模拟式。
互联式。双机之间增加一条状态传递的通道。缺点是,通道中断后,会出现双主机,并且通道出问题的概率不可避免。
中介式。引入第三方,双机不直接互联,而是将状态上报给第三方。这样,连接管理和状态管理都比互联式要简单。由于切换动作分离到中介进行,双机默认都是备机,如何升到主机由中介决定,大大降低了架构复杂度。但同时此方式要求中介高可用,若中介故障,就会变成双备机,写操作依然不可用。
开源方案中有成熟的中介式方案,如ZooKeeper,KeepAlived。
模拟式。依旧不互联,备机把自己当作一个客户端,向主机发送模拟的读写请求,由此来判断主机状态。虽然简单,但由于状态信息较少,状态判断有可能会出现偏差。
双机架构:主主复制
这样就不需要切换动作,也不需要传递状态。但是此架构要求数据能够双向复制,这是很多业务场景无法满足的。
通常用于临时性的、可丢弃的、可覆盖的数据。
数据集群
使用双机架构的前提是,主机可以存储所有数据。存不下时,使用数据集群。
数据集中集群。和主从、主备类似,也可称为一主多从、一主多备。数据依然只能往主机中写。
此架构存在多条复制通道,需要确保复制压力不会影响读写操作,同时备机之间也要保证数据一致。其他问题和双机切换类似,更复杂。
开源的数据集中集群以ZooKeeper为典型,其通过ZAB算法来解决问题。
数据分散集群。每个服务器都会存储一部分数据,也会负责备份一部分数据,所有服务器均可处理读写操作。所以关键复杂点在于,如何将数据进行分配。
设计时,需要考虑:均衡性,服务器间的数据分布是均衡的;容错性,故障时可将故障服务器的数据分配给其他服务器;可伸缩性,能够自动扩充。
和别的方案不同,此架构中不存在主机,但需要一台处理数据分配的服务器(也可叫做主机,只不过意思变了)。
Hadoop中有一台独立的服务器来处理数据分配。而ElasticSearch集群则通过选举来产生一台服务器进行数据分配工作。
数据集中集群适合数据量不大,集群机器数不多的场景,例如ZooKeeper集群,数据量是单台服务器可支撑的,一般集群内有5台机器左右。
在数据分散集群中,由于客户端可向集群内的任意服务器进行读写,具有良好的可伸缩性,所以适合数据量大,集群机器数多的场景,如Hadoop集群、HBase集群,机器数可达成百上千台。
数据分区
前面的架构都是基于硬件故障的前提去考虑的,但当对于一些非常大的事故和灾难,就不再可用了。基于地理级别来设计,就是数据分区架构。需要考虑数据量、分区规则、复制规则,等等。
常见的分区复制规则有三种:集中式,所有数据备份到一个中心;互备式,各分区互相备份;独立式,每个分区都有独立的备份中心。
二、计算高可用架构
对应《27 | 如何设计计算高可用架构?》
计算高可用架构同存储高可用架构,都需要考虑故障发生时的分发。但是存储高可用架构,还需要考虑如何保证数据的一致性,也就是说是有状态的,所以复杂度更高。
而无状态的计算高可用架构,机器之间不需要交互,只需要考虑分发和重试机制,确保计算完成即可。
所以,设计复杂度体现在任务管理上。即确定哪些服务器可执行任务(分发算法),还需要确定任务如何重新执行(重试机制)。
主备
比存储高可用的主备更简单,因为无须主备复制。
冷备,指的是备机没有启动业务服务。
温备,指的是备机启动了业务服务,但是不对外提供。
主从
和存储高可用类似,主备架构中备机不对外服务,主从架构中从机对外服务。
集群
和存储高可用类似,系统能够自动切换。计算高可用集群包括2台服务器的集群,因为不管几台,本质上没有区别,这点和存储高可用不同。
对称集群。集群中每台服务器的角色都是一样的,都可以执行计算任务。又叫做负载均衡集群。需要有一台任务分配器。关键点在于分配策略和状态监测。
非对称集群。集群中有多个角色,不同角色执行不同任务,如Master-Slave角色。以ZooKeeper为例。
由此可见,不论存储高可用,还是计算高可用,都是通过冗余来实现的。存储高可用比计算高可用复杂在,为了数据一致性,机器间需要交互,是有状态的,需要考虑上一篇所提到的CAP理论。二者相同点在于,都需要考虑状态的检测、主备或主从或不同角色之间的切换、机器的选择。ZooKeeper是这方面的一个非常典型的例子。