天天看点

《从0开始学架构》——高可用:存储高可用和计算高可用一、存储高可用架构二、计算高可用架构

本系列是极客时间《从0开始学架构》的读书笔记。

如果部分节点出现故障了,通过冗余可以提高可用性。若故障是数据无法访问,对应的就是存储高可用架构;若故障是计算失败,对应的就是计算高可用架构。

一、存储高可用架构

对应《25 | 高可用存储架构:双机架构》《26 | 高可用存储架构:集群和分区》

存储高可用,本质是将数据复制到多个存储设备,通过数据冗余的方式,来实现高可用。

复杂性主要体现在如何应对复制延迟和数据一致性。

常见的有主备、主从、主主、集群、分区。

双机架构:主备复制

备机起“备份”作用,不承担读操作,备机切换为主机时,需要人工切换。

优点是客户端无感知,主机和备机无复杂的状态,也不需要考虑主备切换动作。

缺点就是浪费硬件,需要人工切换。

通常用于后台管理系统。

双机架构:主从复制

备是备份,对外无感知;从是仆从,需要和外界联系。

一般是主机负责读写,从机负责读。

相对于主备,主从复制在主机故障时,依然可以提供读操作。正常情况下从机提供服务,没有浪费硬件。

缺点是客户端需要区分主从,若复制延迟,会出现数据不一致。并且,故障时依旧需要人工干预。

通常用于读多写少的业务。

双机架构:双机切换

主备和主从存在共同的问题:故障时无法自动切换,主机故障时无法写操作。

增加切换操作,变为主备切换和主从切换,统称双机切换。

需要确定切换的时机,就需要能够判断双机的状态。而具体如何去切换,就是切换决策。故障恢复后,数据出现不一致时,还要考虑如何解决冲突。这三点,都没有放之四海而皆准的答案。

依据状态传递的渠道,可分为互联式、中介式、模拟式。

互联式。双机之间增加一条状态传递的通道。缺点是,通道中断后,会出现双主机,并且通道出问题的概率不可避免。

中介式。引入第三方,双机不直接互联,而是将状态上报给第三方。这样,连接管理和状态管理都比互联式要简单。由于切换动作分离到中介进行,双机默认都是备机,如何升到主机由中介决定,大大降低了架构复杂度。但同时此方式要求中介高可用,若中介故障,就会变成双备机,写操作依然不可用。

开源方案中有成熟的中介式方案,如ZooKeeper,KeepAlived。

模拟式。依旧不互联,备机把自己当作一个客户端,向主机发送模拟的读写请求,由此来判断主机状态。虽然简单,但由于状态信息较少,状态判断有可能会出现偏差。

双机架构:主主复制

这样就不需要切换动作,也不需要传递状态。但是此架构要求数据能够双向复制,这是很多业务场景无法满足的。

通常用于临时性的、可丢弃的、可覆盖的数据。

数据集群

使用双机架构的前提是,主机可以存储所有数据。存不下时,使用数据集群。

数据集中集群。和主从、主备类似,也可称为一主多从、一主多备。数据依然只能往主机中写。

此架构存在多条复制通道,需要确保复制压力不会影响读写操作,同时备机之间也要保证数据一致。其他问题和双机切换类似,更复杂。

开源的数据集中集群以ZooKeeper为典型,其通过ZAB算法来解决问题。

数据分散集群。每个服务器都会存储一部分数据,也会负责备份一部分数据,所有服务器均可处理读写操作。所以关键复杂点在于,如何将数据进行分配。

设计时,需要考虑:均衡性,服务器间的数据分布是均衡的;容错性,故障时可将故障服务器的数据分配给其他服务器;可伸缩性,能够自动扩充。

和别的方案不同,此架构中不存在主机,但需要一台处理数据分配的服务器(也可叫做主机,只不过意思变了)。

Hadoop中有一台独立的服务器来处理数据分配。而ElasticSearch集群则通过选举来产生一台服务器进行数据分配工作。

数据集中集群适合数据量不大,集群机器数不多的场景,例如ZooKeeper集群,数据量是单台服务器可支撑的,一般集群内有5台机器左右。

在数据分散集群中,由于客户端可向集群内的任意服务器进行读写,具有良好的可伸缩性,所以适合数据量大,集群机器数多的场景,如Hadoop集群、HBase集群,机器数可达成百上千台。

数据分区

前面的架构都是基于硬件故障的前提去考虑的,但当对于一些非常大的事故和灾难,就不再可用了。基于地理级别来设计,就是数据分区架构。需要考虑数据量、分区规则、复制规则,等等。

常见的分区复制规则有三种:集中式,所有数据备份到一个中心;互备式,各分区互相备份;独立式,每个分区都有独立的备份中心。

二、计算高可用架构

对应《27 | 如何设计计算高可用架构?》

计算高可用架构同存储高可用架构,都需要考虑故障发生时的分发。但是存储高可用架构,还需要考虑如何保证数据的一致性,也就是说是有状态的,所以复杂度更高。

而无状态的计算高可用架构,机器之间不需要交互,只需要考虑分发和重试机制,确保计算完成即可。

所以,设计复杂度体现在任务管理上。即确定哪些服务器可执行任务(分发算法),还需要确定任务如何重新执行(重试机制)。

主备

比存储高可用的主备更简单,因为无须主备复制。

冷备,指的是备机没有启动业务服务。

温备,指的是备机启动了业务服务,但是不对外提供。

主从

和存储高可用类似,主备架构中备机不对外服务,主从架构中从机对外服务。

集群

和存储高可用类似,系统能够自动切换。计算高可用集群包括2台服务器的集群,因为不管几台,本质上没有区别,这点和存储高可用不同。

对称集群。集群中每台服务器的角色都是一样的,都可以执行计算任务。又叫做负载均衡集群。需要有一台任务分配器。关键点在于分配策略和状态监测。

非对称集群。集群中有多个角色,不同角色执行不同任务,如Master-Slave角色。以ZooKeeper为例。

由此可见,不论存储高可用,还是计算高可用,都是通过冗余来实现的。存储高可用比计算高可用复杂在,为了数据一致性,机器间需要交互,是有状态的,需要考虑上一篇所提到的CAP理论。二者相同点在于,都需要考虑状态的检测、主备或主从或不同角色之间的切换、机器的选择。ZooKeeper是这方面的一个非常典型的例子。