“你们的系统能实现强一致性吗?”作为过去几年一直在开发流处理系统的从业者,我经常被问到这个问题。我时常想自信地推销我们的产品,但现实情况是,回答这个问题并不简单。其中的挑战并不在于问题本身,而在于 “一致性”(Consistency) 对于不同技术背景的人来说有不同的含义。
实际上,来自以下不同背景的人:
- 数据库
- 分布式系统
- 流处理系统
对“一致性”都有自己的理解。没有了解清楚背景就回答可能会导致误解。在本文中,我将澄清在这些不同的数据系统中“一致性”究竟意味着什么。
1. 数据库中的“一致性”
在传统数据库中,“一致性”是 ACID 原则(Atomicity, Consistency, Isolation, Durability)中的一个基石,它保证了每个事务将数据库从一个合法状态转换到另一个合法状态。例如,在一个银行交易中,一个账户被扣款,另一个账户被存款,“一致性”确保总余额保持不变。需要注意的是,这与“原子性”(Atomicity)不同,“原子性”指的是事务的要么成功要么失效特性。例如,“原子性”确保事务中的所有操作要么全部成功,要么全部失败,确保数据库中不会留下不完整的事务。
总而言之,数据库的“一致性”指的是确保事务处理前后数据的正确性和有效性。
2. 分布式系统中的“一致性”
在讨论分布式系统时,“一致性”常常指的是 CAP 定理中的一个基本概念,该定理最初由加州大学伯克利分校的研究人员提出,目前已成为分布式系统学术课程和专业讨论中的基础话题。
在 CAP 定理中,“一致性”具体指的是在不同节点分布的各种副本的数据一致性。在分布式系统中确保这种“一致性”尤其具有挑战性。该定理强调了三个关键属性之间的权衡:consistency, availability, 和 partition tolerance(一致性、可用性