架构师训练营第 1 期 - 第 6 周课后练习
请简述 CAP 原理。
针对 Doris 案例,请用 UML 时序图描述 Doris 临时失效的处理过程(包括判断系统进入临时失效状态,临时失效中的读写过程,失效恢复过程)。
答:
CAP原理对分布式系统的特性做了高度抽象,总结了三个指标:
一致性(Consistency)
一致性是指客户端访问分布式系统的任意一个节点,要么读取到的都是最新的数据,要么读取失败。这里强调的是数据正确。如何来理解呢?
比如我们有2个节点的分布式存储系统,K的值都是1
客户端发起请求给节点1,设置K=2
节点1的K的值更新为2
客户端发起请求给节点2,查询K的值,返回1
客户端读操作没有读到最新的值,这个时候分布式系统就不满足一致性了
如果我们同步更新节点1和节点2的K值
客户端发起请求给节点1,设置K=2
节点1的K的值更新为2
节点1发送更新请求给节点2
节点2的K的值更新为2
客户端发起请求给节点2,查询K的值,返回2
那么客户端访问任意节点都获取了最新的值,那么整个系统就满足了一致性。
但是分布式系统不是单机,当发生网络分区的时候,节点1和节点2之间的通讯可能出现问题,导致无法更新节点2。那么为保证数据一致性,当客户端读取K的值时,就会得到错误的响应结果。这个时候,因为无法正常响应客户端,分布式系统其实是不可用的,这个就是接下来介绍的可用性。
可用性(Availability)
可用性是指客户端不管访问分布式系统中的哪一个节点,都应该得到正确的响应,而不是返回一个错误,返回的数据不一定是最新的数据。这就要求即使发生网络分区,分布式系统中的每一个节点都尽可能的返回客户端的请求数据,而不是不响应,这里强调的是服务可用。
比如上面这种情况,当发生节点间通信故障的时候,保证了可用性
客户端发起请求给节点1,设置K=2
节点1的K的值更新为2
节点1发送更新请求给节点2失败
客户端发起请求给节点2,查询K的值,返回1
客户端发起请求给节点1,查询K的值,返回2
这个时候,因为读操作没有返回最新的数据,集群没有保证数据一致性
分区耐受性(Partition Tolerance)
分区耐受性是指当节点间因为网络原因导致消息丢失或者延迟的时候,系统仍然可以继续工作。这里强调的是分布式系统对分区故障的容错能力。以上面的图为例,当节点1和节点2因为通信故障,不能正常更新节点2的K的值,但是系统仍然继续工作,这个时候系统是满足分区耐受性的。
CAP不可能三角
分布式系统一旦选择了一致性,那么网络分区发生的时候,系统就无法满足可用性。反之,一旦选择了可用性,那么网络分区发生的时候,系统就无法满足一致性。如果满足了一致性和可用性,那么网络分区发生的时候,系统也无法继续工作,那么就无法满足分区耐受性。所以说,CAP中的3个指标,同时只能满足其中的2个。但是,分布式系统不是单机,始终会面临网络分区的问题,所以分区耐受性是一定要考虑的,那么一致性和可用性只能选择其中一个了。所以当我们设计分布式系统的时候,到底是选择一致性还是可用性,需要结合具体的业务场景来权衡考虑。
比如满足CA的应用,因为放弃了分布式系统,如单机版的关系型数据库系统MySQL就属于这种。满足CP的应用有Etcd,Consul和HBase。满足AP的应用有Cassandra和DynamoDB。
Doris临时失效的处理过程的时序图如下:
客户端发送请求给配置服务器进行失效仲裁,配置服务器对物理节点1进行检测,判断物理节点1不可用,配置服务器通知客户端物理节点1不可用,物理节点1进入失效状态
物理节点1失效开始,客户端可继续读写物理节点2
失效期间,客户端把所有的写操作写入备份节点
物理节点1开始恢复,迁移备份节点的数据到物理节点1,物理节点1发送状态到配置服务器,配置服务器通知客户端物理节点1开始恢复
失效开始恢复期间,客户端只能写入物理节点1
失效开始恢复期间,客户端可接续读写物理节点2
待备份节点的数据完全同步到物理节点1后,物理节点1发送状态到配置服务器,配置服务器通知客户端物理节点1完全恢复
完全恢复后,客户端可读写物理节点1
完全恢复后,客户端可读写物理节点2
评论