cap算法
简介:
- 一致性: 在写操作完成之后开始的读操作,必须返回该值,或者以后写操作的值。(在一致的系统中,客户端将值写入任何服务器并获得响应后,它希望能够从其读取的任何服务器读取该值)。
- 可用性: 系统中每个非故障的节点收到的请求必须获得响应。(在可用的系统中,如果我们客户端向服务器发送请求,且该服务器没有崩溃,则服务器必须响应客户端,并不允许服务器忽略客户端的请求)。
- 分区容错性: 网络将被允许任意丢失从一个节点发送另一节点的许多消息。
为什么不存在一个同时支持cap的服务?
-
我们先假设存在一个服务同时支持“一致性”,“可用性”,“分区容错性”。 如图下:
- 这个时候出现了网络分区(即G1服务器和G2服务器不能交流)。客户端先向G1服务器提交请求,需要把v0改成v1。因为服务需要满足可用性。所以G
1 需要正确响应服务的请求,把v0 改成v1,但是网络分区了,G2服务器并不能收到变更,在G2中服务还是v0。 - 此时客户端去G2请求值,G2依然返回v0,所以并不满足一致性的要求,所以此服务不存在。
- 综上所述,不可能存在同时满足cap的服务。
cap结论:
分布式服务必定会发生网络分区的问题(服务器间状态不能同步)。此时只能在一致性 和 可用性 中作出一个取舍。 如果要求强一致性,那么只能牺牲可用性,拒绝客户端的写请求,如果要求服务的可用性,那么服务之间的状态必定不能同步,所以一定会牺牲一致性。