CAP 定理与 Doris 临时失效处理
一、CAP定理
提起分布式系统,就不得不说说CAP定理,它又被称作 布鲁尔定理。它指出对于一个分布式系统来说,不可能同时满足一下三点,最多只能同时满足两个。
1. 一致性 Consistency
每次读取的数据都应该是最近写入的数据或者返回一个错误(Every read recevies the most recent write or an error),而不是过期数据,也就是说,数据是一致的。
2. 可用性(Availability)
每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,不过和这个响应不需要保证数据是最近写入的( Every request receives a (non-error) response,without the guarantee that it contains the most recent wirite),也就是说系统需要一直都可以正常使用,不会引起调用者的异常,但并不保证响应的数据是最新的。
这里“可用性”和“一致性”完全是矛盾的逻辑:
1. 一致性是说每次请求,要么返回错误,要么就是正确的数据。不保证服务一定是可用的,但保证返回的数据一定是正确的。
2.可用性是说每次请求,不会返回错误,返回的数据可以不是最新的。不保证数据是正确的,但保证服务一定可用。
3. 分区耐受性(Partition tolerance)
即使因为网络原因,部分服务器节点之间消息丢失或者延迟了,系统依然应该是可以操作的. ( The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes )
总结一下,当网络分区失效发生的时候,
我们要么取消操作,这样数据就是一致的,但是系统却不可用;
要么我们继续写入数据,但是数据的一致性就得不到保证。
对于一个分布式系统而言,网络失效一定会发生,也就是说,分区耐受形是必须要保证的,那么在可用性和一致性上就必须二选一。
当网络分区失效,也就是网络不可用的时候,如果选择了一致性,系统就可能返回一个错误吗或者干脆超时,即系统不可用。如果选择了可用性,那么系统总是可以返回一个数据,但是并不能包含保证这个时间是最新的。
所以,关于CAP原理,更准确的说法儿是,在分布式系统必须要满足“分区耐受性”的前提下,可用性和一致性无法同时满足。
4.可用性和一致性的取舍
场景1: 12306买火车票
买火车票的场景,我们很多人都体验过。秒杀火车票的时候,本来看到的是还有一张票,其实在这个时刻已经被买走了,当填好了信息准备买的时候却发现系统已经没有票了,这个就是牺牲了一致性的场景,即获取到的票数有可能是不对的,因为12306上买票的人太多了,系统已经不得不采用分布式系统。
场景2: 微信转账
张三给李四转了100块钱,这时必须保证张三的账户上少了100,李四的账户多了100。因此需要数据的一致性,而且什么时候转钱都可以,也需要可用性。但是可以转钱失败是可以允许的,这种场景下就牺牲了可用性。
所以,满足CP舍弃A,也就是满足一致性和容错性,舍弃可用性。如果你的系统允许有段时间的访问失效等问题,这个是可以满足的。就好比多个人并发买票,后台网络出现故障,你买的时候系统就崩溃了,这个不符合业务实际的。
满足AP舍弃C,也就是满足可用性和容错性,舍弃一致性。这也就是意味着你的系统在并发访问的时候可能会出现数据不一致的情况。
对于上述的两种舍弃方案,是要看实际的业务场景的。
二、Doris 临时失效处理
评论