- CAP 定理是系统设计面试中一个重要的数据库概念。CAP 代表一致性、可用性和分区容忍性,因此得名 CAP 定理。
id:: 63eb007d-e404-4950-aa61-3e20077a5856- 一致性指的是所有用户能够在同一时间看到相同的数据。
- 可用性意味着系统在节点故障的情况下始终可以进行读取或写入。
- 分区容忍性意味着即使节点之间的通信失败,系统仍然可以继续运行。
- 该定理指出,在分布式系统中只能确保这三种属性中的两种。
- 我们的一个假设是网络分区会发生,因此为了提供任何可靠的服务,分区容忍性是必要的。因此,您不能选择放弃 CAP 中的 P。这使我们必须在确保一致性和可用性之间进行权衡。
id:: 63eb0459-f049-4ba1-9ce7-5449b9144de8 - 一致性
- 一致性是指在向数据库发送写入后,发送到任何节点的所有读取请求应返回该更新的数据。
- 想象一个场景,其中存在网络分区,节点 A 和节点 B 都会拒绝发送给它们的任何写入请求。这将确保这两个节点的数据状态相同。否则,只有节点 A 拥有更新的数据,而节点 B 拥有过时的数据。
- 有时您会听到 “强一致性” 这个术语。CAP 定理中的一致性不一定指强一致性。在强一致性的数据库中,如果数据被写入后立即读取,理论上它应该始终返回更新的数据。
- 然而,在分布式系统中,网络通信并不是瞬时发生的,因为节点在物理上彼此分离,传输数据需要一些时间。
- 这就是为什么不可能拥有一个完美的强一致性分布式数据库的原因。
id:: 63eb08ce-93b6-45b2-84c7-252f2d2afee3 - 在现实世界中,当我们谈论优先考虑一致性的数据库时,通常指的是最终一致性且节点之间的延迟时间非常短的数据库。
id:: 63eb0a3e-118c-4dae-8d3e-fca205c2f385 - 所以再总结一下,CAP 定理中的一致性意味着所有用户能够在同一时间看到相同的数据。
- 可用性
- 在优先考虑可用性的数据库中,节点之间存在不一致的数据是可以接受的,其中一个节点可能包含过时的数据,而另一个节点则拥有更新的数据。
- 可用性意味着我们优先考虑节点完成发送给它们的请求。可用的数据库往往具有最终一致性,这意味着在网络分区解决后,所有节点最终会相互同步以拥有相同的更新数据。在这种情况下,节点 A 会首先接收更新,过一段时间后,节点 B 也会更新。
- 一致性还是可用性?
- 那么,什么时候应该优先考虑一致性或可用性?如果您处理的数据需要保持最新,那么您应该优先考虑一致性。另一方面,如果查询的数据可以稍微过时,那么将其存储在可用的数据库中可能是更好的选择。
- 这里有一些例子以便更好地理解。
- 想象一下,您正在构建一个类似亚马逊的应用程序,购物者可以浏览产品目录,然后在有库存时购买它们。您希望确保产品实际上有库存,否则您将不得不为缺货的商品退款给购物者。
- 存储产品信息的数据库应该优先考虑一致性还是可用性?在这里,您应该选择一致性。在网络分区的情况下,节点无法相互同步,您宁愿不允许任何购物者购买任何产品,也不希望两个或更多购物者在只有一个商品可用时购买同一产品。
- 可用的数据库将允许后者,然后至少有一个购物者的订单将不得不被取消或退款。
- 让我们想象另一个场景,假设同样的亚马逊式产品,假设一个产品经理决定在网络故障期间退款给购物者比显示缺货更具成本效益。在这种情况下,您将希望优先考虑可用性,因为在网络故障期间取消和退款订单将比完全不允许购物者购买产品更可取。
id:: 63eb1f8c-43d8-40a2-94fa-9fc99a458545
- 从上述讨论中,您会注意到这里只讨论了写请求,这是因为读取请求不会改变数据的状态,也不需要在节点之间重新同步。在网络分区期间,对于一致性和可用的数据库,读取请求通常都是可以的。