- 基本概念
1. 异常类型
服务器宕机、网络异常、磁盘故障。
2. 超时
在分布式系统中,机器交互有三个结果,即成功、失败、超时。超时单作为一小节讲述,表明了其特殊性。节点间交互超时返回,并不意味着失败,也可能成功,这种不确定性需要特殊的设计机制保证系统的确定性。一个典型的解决方案是,所有的操作是幂等的,这样重试即可。
3. 一致性
分片内数据的一致性,可以从用户角度和存储系统两个角度描述。
用户角度:强一致、弱一致、最终一致(弱一致的特例)。
最终一致包括:读写一致(同一个客户端读写一致)、会话一致、单调读一致、单调写一致。
存储系统角度:副本一致(弱一致有时间窗口)、更新顺序一致。
注:总感觉本章的介绍逻辑不清晰,更新顺序一致性 与 分片内一致性 不是对等的概念,在这里介绍略微不妥。
4. 衡量指标
性能:QPS、UPS、延迟(平均、长尾-99.9%)。
可用性:99.99%——全年52.56min不可用,99.97%——全年52.54min不可用。
一致性
可扩展性:线性可扩展是理想情况,即系统性能随着机器数量线性变化。
- 性能分析
性能分析的目标是在设计阶段找到系统的瓶颈点,针对瓶颈点权衡多种设计方案,确定最终方案。
性能分析的结果,既是设计目标,这样可以防止设计阶段出现重大Bug。系统运行阶段,性能分析的结果,更是性能优化的目标(靠近设计目标)。性能分析是比较复杂的过程,与具体实际情况密切相关(网络、CPU、内存等等,不同外部环境,瓶颈点会变换)。系统运行阶段,性能分析的核心是找到系统的平静点。
注:性能分析是RD的核心能力之一。
- 数据分布
Hash分布
Amazon Dynamo 典型的Hash分布(一致性hash)。Hash分布有如下两个问题:
1. 评价散列函数优劣的标准是散列程度,很难有较好的散列函数,一般都会有“数据倾斜”的问题(数据集中),解决版本有两个,第一是业务手动拆分,第二个是自动拆分,算法能够动态调整。
2. Hash值与机器数量N取摸,机器数量变更直接导致大量hash失效。解决办法有两个,第一是hash值与机器映射关系作为meta信息,第二是一致性hash,尽量减少rehash的数据量。
顺序分布
Table存储系统常用的分布方式(很好地支持扫描),例如,BigTable、CockRoachDB。
常见的做法是,将大表按顺序拆分为N个子表存储在不同的节点,映射关系作为Meta信息。随着删除、插入,伴随着子表的合并与拆分,极大的增加了系统的复杂度。
负载均衡
常见的做法是,节点通过心跳将本地信息上报给Master,Matser做全局调度。需要注意的是负载均衡需要平滑完成,否则影响可用性。上报的信息可以是CPU、磁盘使用等等。
- 复制
这部分主要说的是分片内数据的一致性,主要分为,强一致、弱一致、NWR等。
需要注意的是,一致性与可用性是一对矛盾的性质。强一致性会由于节点故障影响可用性。高可用性需要牺牲一定程度的一致性。
CAP理论中,P代表分区容忍性(脑裂)是分布式系统一定要解决的,所以绝大部分实在C(一致性)和A(高可用)之间在取舍。
- 容错
故障检测
中心配置的分布式系统,常见的故障检测方式是心跳,节点向Master汇报心跳可以方便Master掌握节点的情况,但是节点可能临时故障后由自动恢复,这种情况需要节点知道他自己下线,所以单程的交互是不够的,常用的办法是租约,双程通信,节点汇报心跳后,Master会返回一个带超时时间的Token。租约机制需要注意时间差。
另外,如果是追加写系统,即数据只要存在就是最新的数据,不存在数据过期的问题,此时可以只用单程的心跳,及时旧机器回归也不会引入脏数据。
故障恢复
本部分所述的故障恢复,指的是分片的Failover。常见的存储系统分为两种,第一种是单层结构,进行中就切换即可,第二种是两层结构,类似BigTable(服务层 + 存储层),方式其实差不多。
- 可扩展性
中心节点
随着数据量的增加,中心化配置的分布式服务,中心节点可能单机是不够用的,例如Hadoop。常见的分布式存储系统,合理的设计方案单机中心节点能够支持1w台以内的集群规模。中心节点数据量过大,就需要中心节点也需要一定的扩展性。常见的解决方案,增加一个小集群专门存储元数据,类似Haddoop 的 AN等。另外一种将元数据分级,中心节点存储一部分,数据节点存储一部分。
注:随着业务的发展,需要提高系统的吞吐量,需要中心节点具备更高的性能,目前超大规模的分布式系统(1w台机器以上)不仅拆分元数据,还将中心节点的功能模块拆分成集群的方式来满足预期目标。
数据扩容
最理想的扩容方式就是按需扩容,或线性扩容。但是在常规的数据库扩容中,常常面临如下三个问题(传统数据库扩展性差的原因):
1. 扩容不灵活:常见的是成倍扩容,浪费资源。
2. 扩容不够自动化:数据库的拆分与业务强耦合,扩容需要业务制定计划很难做到自动化。
3. 增加副本时间长:传统的数据库扩容(或副本恢复),需要大量的数据CP,耗时很长。
异构系统
本部分的叙述内容,指的是节点间数据是否异构,例如A机器存储数据分片1、2、3,B机器也是1、2、3,那么A与B同构,并不是机器硬件的异构同构,显然同构模型容错性更差。
- 分布式协议
2PC vs. Paxos
两者的区别,2PC是一种分布式事务,可以保证分布式系统中一个事务要么全执行,要么全部执行。Paxos主要是用来保证分布式系统中节点间数据的一致性。
Paxos主要用来选主、分布式锁等。例如Google Chubby、ZK等。2PC最主要的问题是无法处理机器宕机问题,即无法做到协调的问题。Paxos做协调保证数据状态机一致,2PC保证操作的原子性。
- 跨机房部署
整集群切换:机房主从互备,意义不大
单个集群跨机房:目前比较流行的跨机房部署。
- 总结
本章介绍的内容乍一看逻辑想不强,仔细品味一番可能是本书是五年前出版的,很多相同意思的表达有一些变化,细细理解还是可以找到脉络。另一方面,随着数据量增长,很多大公司技术发展很快,领先本书。但是书中介绍的基础知识还是技术人员应该夯实的。
本部分先是介绍了分布式系统中常见的异常情况,与单机有所不同,主要是对超时的理解和处理方式。接着说明了性能分析的重要性,性能分析表面看是一个很虚的东西,但是它直接表示了技术人员的技术水平,更是进阶道路上的核心技能。
揭下来,从数据分片(数据分布)、分片内一致性(复制)、扩展性、分片Failover(容错)4个方面介绍了分布式存储系统。同时介绍了两个分布式协议2PC、Paxos,着重理解他们的功能与区别。
最后,介绍了一下跨机房部署的常见方式。