《从零开始学架构》七: 高可用计算和存储
存储高可用方案的本质都是通过将数据复制到多个存储设备,通过数据冗余的方式来实现高可用,其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。
高可用存储方案需要从以下几个方面去进行思考和分析:
数据如何复制?
各个节点的职责是什么?
如何应对复制延迟?
如何应对复制中断
常见的双机高可用架构:主备、主从、主备 / 主从切换和主主。
1 高可用存储架构:双机架构
1.1 主备复制
主备架构中的“备机”主要还是起到一个备份作用,并不承担实际的业务读写操作,如果要把备机改为主机,需要人工操作。
优点:简单
缺点:
备机仅仅只为备份,并没有提供读写操作,硬件成本上有浪费。
故障后需要人工干预,无法自动恢复。
内部的后台管理系统使用主备复制架构的情况会比较
1.2 主从复制
主机负责读写操作,从机只负责读操作,不负责写操作。
与主备复制相比的优点:
主从复制在主机故障时,读操作相关的业务可以继续运行。
主从复制架构的从机提供读操作,发挥了硬件的性能。
缺点:
主从复制架构中,客户端需要感知主从关系,并将不同的操作发给不同的机器进行处理,复杂度比主备复制要高。
主从复制架构中,从机提供读业务,如果主从复制延迟比较大,业务会因为数据不一致出现问题。
故障时需要人工干预。
一般情况下,写少读多的业务使用主从复制的存储架构比较多
1.3 双机切换
主备复制和主从复制方案存在两个共性的问题:
- 主机故障后,无法进行写操作。
- 如果主机无法恢复,需要人工指定新的主机角色。
因此引入了双机切换
关键设计点:主备间状态判断、切换决策、数据冲突的解决
常见的主备切换架构有三种形式:互连式、中介式和模拟式。
互连式:主备机直接建立状态传递的渠道
中介式:在主备两者之外引入第三方中介,主备机之间不直接连接,而都去连接中介,并且通过中介来传递状态信息
模拟式:主备机之间并不传递任何状态数据,而是备机模拟成一个客户端,向主机发起模拟的读写操作,根据读写操作的响应情况来判断主机的状态
1.4 主主复制
主主复制指的是两台机器都是主机,互相将数据复制给对方,客户端可以任意挑选其中一台机器进行读写操作:
主主复制架构复杂性表现在:如果采取主主复制架构,必须保证数据能够双向复制,而很多数据是不能双向复制的,因此,主主复制架构对数据的设计有严格的要求,一般适合于那些临时性、可丢失、可覆盖的数据场景。
2 高可用存储架构:集群和分区
2.1 数据集群
主备、主从、主主架构本质都是假设一台主机能够存储所有数据
当这个假设被打破的时候,就需要集群了,就是多(3及以上)台机器组合在一起形成一个统一的系统
集群可以分为两类:数据集中集群、数据分散集群。
数据集中集群:1 主多备或者 1 主多从,数据都只能往主机中写,而读操作可以参考主备、主从架构进行灵活多变
复杂度:
主机如何将数据复制给备机
备机如何检测主机状态
主机故障后,如何决定新的主机
以 ZooKeeper 为典型,ZooKeeper 通过 ZAB 算法来解决上述提到的几个问题
数据分散集群:多个服务器组成一个集群,每台服务器都会负责存储一部分数据;同时,为了提升硬件利用率,每台服务器又会备份一部分数据。
复杂度:
均衡性:算法需要保证服务器上的数据分区基本是均衡的,不能存在某台服务器上的分区数量是另外一台服务器的几倍的情况。
容错性:当出现部分服务器故障时,算法需要将原来分配给故障服务器的数据分区分配给其他服务器。
可伸缩性:当集群容量不够,扩充新的服务器后,算法能够自动将部分数据分区迁移到新服务器,并保证扩容后所有服务器的均衡性。
数据分散集群中的每台服务器都可以处理读写请求,因此不存在数据集中集群中负责写的主机那样的角色。
但在数据分散集群中,必须有一个角色来负责执行数据分配算法,这个角色可以是独立的一台服务器,也可以是集群自己选举出的一台服务器;
如果是集群服务器选举出来一台机器承担数据分区分配的职责,则这台服务器一般也会叫作主机,但需要知道这里的“主机”和数据集中集群中的“主机”,其职责是有差异的。
典型为Hadoop
数据集中集群适合数据量不大,集群机器数量不多的场景;
例如,ZooKeeper 集群,一般推荐 5 台机器左右,数据量是单台服务器就能够支撑。
数据分散集群,由于其良好的可伸缩性,适合业务数据量巨大、集群机器数量庞大的业务场景;
例如,Hadoop 集群、HBase 集群,大规模的集群可以达到上百台甚至上千台服务器。
2.2 数据分区
之前的存储高可用架构都是基于硬件故障的场景去考虑和设计的,主要考虑当部分硬件可能损坏的情况下系统应该如何处理。
但对于一些影响非常大的灾难或者事故来说,有可能所有的硬件全部故障,因此需要基于地理级别的故障来设计高可用架构,这就是数据分区架构产生的背景。
数据分区指将数据按照一定的规则进行分区,不同分区分布在不同的地理位置上,每个分区存储一部分数据,通过这种方式来规避地理级别的故障所造成的巨大影响。
复杂性:
数据量的大小
分区规则
复制规则:常见的分区复制规则有集中式、互备式和独立式
3 计算高可用架构的设计
设计目标:当出现部分硬件损坏时,计算任务能够继续正常运行。
因此本质就是通过增加更多服务器来达到计算高可用。
复杂度:主要体现在任务管理方面,即当任务在某台服务器上执行失败后,如何将任务重新分配到新的服务器进行执行。因此,计算高可用架构设计的关键点有下面两点:哪些服务器可以执行任务、任务如何重新执行
常见的计算高可用架构:主备、主从和集群。
主备:
主从:任务分配器需要将任务进行分类,确定哪些任务可以发送给主机执行,哪些任务可以发送给备机执行,除了故障同样需要人工来切换
集群:可以自动完成切换操作
高可用计算的集群方案根据集群中服务器节点角色的不同,可以分为两类:
一类是对称集群,即集群中每个服务器的角色都是一样的,都可以执行所有任务;
另一类是非对称集群,集群中的服务器分为多个不同的角色,不同的角色执行不同的任务,例如最常见的 Master-Slave 角色。
对称集群/负载均衡集群:
复杂性:任务分配器需要选取分配策略和检测服务器状态
非对称集群:不同服务器的角色是不同的,不同角色的服务器承担不同的职责。
以 Master-Slave 为例,部分任务是 Master 服务器才能执行,部分任务是 Slave 服务器才能执行。
相比对称集群的复杂性:任务分配策略更加复杂、角色分配策略实现比较复杂
注意:存储高可用集群把双机架构和集群架构进行了区分;而在计算高可用集群架构中,2 台服务器的集群和多台服务器的集群,在设计上没有本质区别,因此不需要进行区分。