本章小结

在本章中,我们考察了复制的问题。复制可以用于几个目的:

高可用性

​ 即使在一台机器(或多台机器,或整个数据中心)停机的情况下也能保持系统正常运行

断开连接的操作

​ 允许应用程序在网络中断时继续工作

延迟

​ 将数据放置在距离用户较近的地方,以便用户能够更快地与其交互

可扩展性

​ 能够处理比单个机器更高的读取量可以通过对副本进行读取来处理

​ 尽管是一个简单的目标 - 在几台机器上保留相同数据的副本,但复制却是一个非常棘手的问题。它需要仔细考虑并发和所有可能出错的事情,并处理这些故障的后果。至少,我们需要处理不可用的节点和网络中断(甚至不考虑更隐蔽的故障,例如由于软件错误导致的无提示数据损坏)。

​ 我们讨论了复制的三种主要方法:

单主复制

​ 客户端将所有写入操作发送到单个节点(领导者),该节点将数据更改事件流发送到其他副本(追随者)。读取可以在任何副本上执行,但从追随者读取可能是陈旧的。

多主复制

​ 客户端发送每个写入到几个领导节点之一,其中任何一个都可以接受写入。领导者将数据更改事件流发送给彼此以及任何跟随者节点。

无主复制

​ 客户端发送每个写入到几个节点,并从多个节点并行读取,以检测和纠正具有陈旧数据的节点。每种方法都有优点和缺点。单主复制是非常流行的,因为它很容易理解,不需要担心冲突解决。在出现故障节点,网络中断和延迟峰值的情况下,多领导者和无领导者复制可以更加稳健,但以更难以推理并仅提供非常弱的一致性保证为代价。

​ 复制可以是同步的,也可以是异步的,在发生故障时对系统行为有深远的影响。尽管在系统运行平稳时异步复制速度很快,但是在复制滞后增加和服务器故障时要弄清楚会发生什么,这一点很重要。如果一个领导者失败了,并且你推动一个异步更新的追随者成为新的领导者,那么最近承诺的数据可能会丢失。

​ 我们研究了一些可能由复制滞后引起的奇怪效应,我们讨论了一些有助于决定应用程序在复制滞后时的行为的一致性模型:

写后读

​ 用户应该总是看到自己提交的数据。

单调读

用户在一个时间点看到数据后,他们不应该在某个早期时间点看到数据。

一致前缀读

​ 用户应该将数据视为具有因果意义的状态:例如,按照正确的顺序查看问题及其答复。

​ 最后,我们讨论了多领导者和无领导者复制方法所固有的并发问题:因为他们允许多个写入并发发生冲突。我们研究了一个数据库可能使用的算法来确定一个操作是否发生在另一个操作之前,或者它们是否同时发生。我们还谈到了通过合并并发更新来解决冲突的方法。

​ 在下一章中,我们将继续研究分布在多个机器上的数据,通过复制的对应方式:将大数据集分割成分区。