一致性模式

分布式系统中的一致性模型:

在分布式数据系统的三个属性(一致性、可用性和分区容错性)中选择两个。
- Eric Brewer,CAP 定理

分布式系统具有可扩展性和容错性等优点。然而,维持分布式系统的一致性并非易事。一致性对于实现可靠性、确定性系统状态和改善用户体验至关重要。

分布式系统跨多个服务器复制数据,以提高容错性、可扩展性和可靠。一致性模式(一致性模型)是分布式系统中数据存储和数据管理的一组技术4。一致性模式决定了分布式系统中的数据传播。因此,一致性模式将影响分布式系统2的可扩展性和可靠性。

分布式系统中有多种一致性模式。一致性模式的选择取决于系统要求和用例,因为每种一致性模式都有其优点和缺点。一致性模式必须是多数据中心系统架构的关键,因为维护多个数据中心的一致性并非易事。一致性模式可大致分为以下:

  • 强一致性
  • 最终一致性
  • 弱一致性

对于注重高可用性和性能而不是一致性的分布式系统来说,最终一致性模型是最佳选择。当相同的数据视图必须在分布式系统中无延迟地可见时,强一致性是最佳的一致性模型。总之,每个一致性模型都适合不同的用和系统要求。

强一致性
在强一致性模式中,在任何服务器上执行的读操作必须始终检索最新写操作中包含的数据。强一致性模式通常跨多个服务器同步复数据。换句话说,当在一台服务器上执行写操作时,后续在其他服务器上执行的读操作必须返回最新写入的数据。
强一致性的好处有以下:

  • 简化的应用逻辑
  • 提高数据持久性
  • 保证整个系统数据视图的一致性

强一致性的局限性如下:
  • 服务可用性降低
  • 延迟降低
  • 资源密集型

数据复制达到强一致性的工作流程如下:

  1. 服务器(客户端)对主数据库实例执行写操作
  2. 主实例将写入的数据传播到副本实例
  3. 副本实例向主实例发送确认信号
  4. 主实例向客户端发送确认信号

强一致性模型的流行用例有以下:
  • 文件系统
  • 关系数据库
  • 银行等金融服务
  • 半分布式共识协议,例如两阶段提交(2PC)
  • 完全分布式共识协议,例如Paxos

例如,对用户银行帐户余额的任何更改都必须立即复制,以提高耐用性和可靠性。Google的Bigtable和Google的Spanner数据库是强一致性的现实应用。

最终一致性
在最终一致性模式中,当对某个服务器执行写操作时,紧随其后的对其他服务器的读操作不一定返回最新写入的数据1。系统最终将收敛到相同的状态,并且最新的数据将由其他服务器在后续的读取操作中返回。最终一致性模式通常跨多个服务器异步复制数据。通俗地说,任何数据更改最终只会在整个系统中传播,并且在数据收敛发生之前预计会出现过时的数据视图。

最终一致性可以通过多领导者或无领导者复制拓扑来实现。系统通常在几秒钟内收敛到相同状态,但时间范围取决于实施和系统要求。最终一致性模式的好处如下:

  • 简单的
  • 高可用
  • 可扩展
  • 低延迟

最终一致性的缺点有以下:
  • 弱一致性模型
  • 潜在的数据丢失
  • 潜在的数据冲突
  • 数据不一致

实现数据复制最终一致性的工作流程如下所示:

  1. 客户端对主数据库实例执行写操作
  2. 主实例向客户端发送确认信号
  3. 主实例最终将写入的数据传播到副本实例

最终一致性模式是数据陈旧性和可扩展性之间的权衡。最终一致性的典型用例如下:
  • 搜索引擎索引
  • 域名服务器(DNS)
  • 简单邮件传输协议(SMTP)
  • 对象存储,例如Amazon S3
  • Facebook 等社交媒体平台上的评论或帖子
  • 分布式通信协议,例如Gossip 协议
  • 领导者-跟随者和多领导者复制

例如,对域名记录的任何更改最终都会由 DNS 复制。Amazon Dynamo 和 Apache Cassandra 等分布式数据库是最终一致性模式的现实应用程序。最终一致性不是设计缺陷,而是满足某些用例的功能。业务所有者应该确定应用程序数据是否是最终一致性模式的候选者。

弱一致性
在弱一致性模式下,当对某个服务器执行写操作时,后续对其他服务器的读操作可能会返回最新写入的数据,也可能不会返回最新写入的数据。换句话说,执行尽力而为的数据传播方法——数据可能不会立即传播。分布式系统必须满足各种条件,例如时间的流逝,才能返回最新写入的数据1
弱一致性的优点有以下:

  • 高可用性
  • 低延迟

弱一致性的缺点如下:
  • 潜在的数据丢失
  • 数据不一致
  • 数据冲突

后写(回写)缓存模式是弱一致性的一个示例。如果在将数据传播到数据库之前缓存崩溃,数据将会丢失。后写式缓存模式的工作流程如下:

  1. 客户端对缓存服务器执行写操作
  2. 缓存将接收到的数据写入消息队列
  3. 缓存向客户端发送确认信号
  4. 事件处理器将数据异步写入数据库

弱一致性的常见用例有以下:
  • 实时多人视频游戏
  • 互联网协议语音 ( VoIP )
  • 直播
  • 缓存服务器
  • 数据备份

例如,由于网络连接不良而丢失的视频帧不会在直播流中重传。