第六周作业
请简述 CAP 原理
CAP原理
一致性Consistency
可用性Availability
分区耐受性(分区容错性)Partition tolerance
一致性是说,每次读取的数据都应该是最近写入的数据或者返回一个错误(Every read receives the most recent write or an error),而不是过期数据,也就是说,数据是一致的。
可用性是说,每次请求都应该得到一个响应,而不是返回一个错误或者丢失响应,不过这个响应不需要保证数据是最近写入的(Every request receives a (non-error)response,without the guarantee that it contains the most recent write),也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。
分区耐受性Partition tolerance
分区耐受性说,即时因为网络原因,部分服务器节点之间消息丢失或者延迟了,系统依然应该是可以操作的(The system continues to operate despite an arbitrary number of messages being dropper(or delayed)by the network between nodes)
CAP原理
当网络分区失效发生的时候,我们要么取消操作,这样数据就是一致的,但是系统却不可用;要么我们继续写入数据,但是数据的一致性就得不到保证。
对于一个分布式系统而言,网络失效一定会发生,也就是说,分区耐受性是必须要保证的,是必须存在的,那么在可用性和一致性上就必须二选一。
当网络分区失效,也就是网络不可用的时候,如果选择了一致性,系统就可能返回一个错误码或者干脆超时,即系统不可用。如果选择了可用性,那么系统总是可以返回一个数据,但是并不能保证这个数据是最新的。
所以,关于CAP原理,更准确的说法是,在分布式系统必须要满足分区耐受性的前提下,可用性(A)和一致性(C)无法同时满足。
如下图所所示:
CAP原理中的CP和AP
首先,数据存储中,有三个节点A、B、C,其中节点A和节点B通信失败,发生了分区耐受性,节点A和节点B在不同的网络里面。节点C宕机失效。
这时,有一个客户端1,他执行一个更新操作,将id=55的数据,更新为了99。另外有一个客户端3,他执行一个操作,将id=55的数据,更新为了75。客户端2查询节点A返回结果99,客户端4查询节点B返回结果75。此时发生了选择:
如果客户端1、客户端3都能将数据更新成功,客户端2、客户端4都能查询成功,那么在P(分区耐受性)发生的情况下,系统保证了A(可用性),但是由于网络通信失败,节点A和节点B之间数据不一致,客户端2和客户端4的数据不一致,那么C(一致性)没有得到满足。
那么,系统为了保证一致性(C)就必须只能让客户端1或者客户端3一个写入成功,假如让客户端1写入成功,客户端3写入失败,那么客户端3的写入操作就会返回一个错误或者失去响应,客户端4的查询操作也会返回一个错误或者失去响应,那么A(可用性)就无法满足。
结论:所以分区耐受性(网络不可用)是必然存在的,分布式系统只能满足可用性或者一致性,而不能同时满足两点,也就是AP和CP只能二选一。
简述Doris失效处理过程
针对 Doris 案例,请用 UML 时序图描述 Doris 临时失效的处理过程(包括判断系统进入临时失效状态,临时失效中的读写过程,失效恢复过程)。
Doris的关键技术点-可用性关键场景
瞬时失效
临时失效
服务器端升级或者网络暂时不可用
失效机器在短时间内可恢复(例如:2小时内)
恢复后数据和失效前一致
永久失效
机器下线
判断系统进入临时失效状态:
存储服务器访问失效,应用服务器会在间隔一段时间后再次发起访问
对存储服务器的多次重试失败,则向管理中心config-server发起存储服务器失效仲裁
管理中心向存储服务器发送健康心跳检测、失效仲裁检测
检测成功,管理中心反馈,判断存储服务器进入临时失效状态
临时失效期间的读写及恢复过程
写数据时,正常服务的机器依然可以正常写入,发生故障的机器需要将数据写入到临时存储服务器
应用服务器从正常的数据服务器读取数据
应用服务器写入数据到正常服务器、临时服务器。其中临时服务器是集群中专门部署的服务器,(根据可用性规划,临时服务器也可以部署为多台机器的集群),正常情况下,该服务器不会有数据写入,处于空闲状态,只有在临时失效的时候,才会写入数据。任何时候该服务器都不会提供读操作。
失效恢复期间,临时服务器的数据会写入到故障服务器
写入操作会同时写入正常节点和故障恢复节点
总结:
读:正常节点
写:正常节点、恢复节点
数据恢复:临时节点往恢复节点写入
由于临时节点恢复数据和正常数据都同时往里面写入,数据会有不一致的情况发生,那么就需要比较数据的时间戳,已最新的时间戳为基准。
评论