
什么是 CAP 定理?
在讨论 CAP 定理之前,我们需要了解什么是分布式系统以及为什么要使用它。
如你所知,在移动时代,请求量和数据量呈指数级增长。
在这种情况下,数据库环境也产生了易于扩展和快速交付数据的需求。
为了满足这些需求,分布式系统环境应运而生。
CAP 定理也被称为布鲁尔定理(Brewer’s Theorem),因为它最初是由 Eric A. Brewer 教授在 2000 年的一次关于分布式计算的演讲中提出的。
两年后,麻省理工学院(MIT)的 Seth Gilbert 和 Nancy Lynch 教授发表了对“布鲁尔猜想”的证明。
CAP 定理
让我们来看看 CAP 定理所涉及的三种分布式系统特性。
一致性 (Consistency)
这意味着所有客户端在同一时间看到相同的数据。
这个词可以有多种解释。请不要将其与 ACID 中的一致性混淆。
从数据库的角度来看
它指的是“事务”。事务是此类数据库系统中的交互单位。实际上,数据库事务具有 ACID 属性。
从原子的角度来看
单次请求/响应操作序列。
所有客户端在同一时间看到相同的数据。
可用性 (Availability)
这意味着任何发起数据请求的客户端都能得到响应,即使一个或多个节点发生故障。
另一种表述方式是——分布式系统中的所有正常运行的节点都会对任何请求返回有效响应,无一例外。
分区容错性 (Partition tolerance)
分区是指分布式系统内的通信中断——即两个节点之间连接丢失或暂时延迟。分区容错性意味着尽管系统中节点之间发生了任何数量的通信故障,集群仍必须继续工作。
基于 CAP 定理的 NoSQL 数据库类型
如今,NoSQL(非关系型)数据库不仅考虑垂直扩展,还考虑水平扩展。此外,它们可以在由多个互连节点组成的不断增长的网络中快速扩展。
根据对 CAP 三个属性的取舍,主要有以下几种类型:
-
CP 数据库:CP 数据库在牺牲可用性的情况下提供一致性和分区容错性。当任意两个节点之间发生分区时,系统必须关闭不一致的节点(即使其不可用),直到分区问题解决。
-
AP 数据库:AP 数据库在牺牲一致性的情况下提供可用性和分区容错性。当发生分区时,所有节点保持可用,但处于分区错误端的节点可能会返回比其他节点旧的数据版本。(当分区解决后,AP 数据库通常会同步节点以修复系统中所有的不一致性)
-
CA 数据库:CA 数据库在所有节点上提供一致性和可用性。然而,如果系统中任何两个节点之间存在分区,它就无法做到这一点,因此无法提供容错性。(容错性是指系统在某些组件发生故障时仍能继续正常运行的特性。)
如你所知,在分布式系统中,分区是无法避免的。因此,CA 分布式数据库实际上并不存在。但这并不意味着如果你需要,就不能为分布式应用程序提供 CA 数据库。许多关系型数据库(如 PostgreSQL)提供一致性和可用性,并可以通过复制(Replication)部署到多个节点,还可以使用分片(Sharding)。
MongoDB 与 CAP 定理 (CP)
MongoDB 是一种流行的 NoSQL 数据库管理系统,它以 BSON(二进制 JSON)文档的形式存储数据。它经常用于在多个不同地点运行的大数据和实时应用程序。相对于 CAP 定理,MongoDB 是一个 CP 数据存储——它通过维护一致性来解决网络分区,同时在可用性上做出妥协。
MongoDB 是单主系统——每个副本集只能有一个主节点(Primary),负责接收所有的写操作。同一副本集中的所有其他节点都是从节点(Secondary),它们复制主节点的各种操作日志并将其应用到自己的数据集中。默认情况下,客户端也从主节点读取数据,但也可以指定读取偏好(Read Preference)以允许从从节点读取。
当主节点变得不可用时,具有最新操作日志的从节点将被选举为新的主节点。一旦所有其他从节点都跟上新主节点的进度,集群就会再次变得可用。由于客户端在此间隔期间无法发出任何写请求,因此数据在整个网络中保持一致。
Cassandra (AP)
Apache Cassandra 是由 Apache 软件基金会维护的开源 NoSQL 数据库。它是一个宽列数据库,允许你在分布式网络上存储数据。然而,与 MongoDB 不同,Cassandra 采用无主架构(Masterless Architecture),因此它具有多个故障点,而不是单个故障点。
相对于 CAP 定理,Cassandra 是一个 AP 数据库——它提供可用性和分区容错性,但不能始终提供一致性。因为 Cassandra 没有主节点,所以所有节点都必须持续可用。然而,Cassandra 通过允许客户端随时写入任何节点并尽快调解不一致性来提供最终一致性。
由于数据仅在网络分区的情况下才会变得不一致,且不一致性会很快得到解决,Cassandra 提供了“修复”功能来帮助节点同步。然而,持续的可用性带来了一个高性能的系统,这在许多情况下是值得折衷的。
结论
通过观察分布式系统中基于 CAP 理论的数据库,我们可以更好地理解每种数据库的优势。最后,我要感谢 IBM 对 CAP 理论、分布式处理系统和数据库进行的整理。
求知若渴,虚心若愚