强一致性和复制因子
Strong consistency and replication factor
我正在努力提高我在分布式数据库和可以实现的各种级别的一致性方面的知识。首先,让我定义一些我将使用的术语(如果我错了,请告诉我):
强一致性:据博士报告。 Kleppmann 在“设计数据密集型应用程序”中,它是“线性化”的同义词,它是一种一致性级别,它使复制的数据存储表现得好像只有一个数据项的副本,并且对它的每个操作都以原子方式进行。
复制因子:一个数据项的副本数。
假设我有一个由 3 个节点组成的集群,配置为 strong consistency 模式和 replication factor = 3 并且领导者有成功地将对数据项 X 的写入复制到它的一个追随者,我有以下问题:
1.当第二个追随者 return 重新联机时,写入将被复制到第二个追随者,不是吗?
在我看来,当领导者至少向其追随者之一成功复制写入时,数据库可以 return 对客户端应用程序“成功”。事实上,它已经达到该写入的多数法定人数,因此它不必等待第二个跟随者确认该操作。然而,给定复制因子的值,当第二个追随者在线时,写入将以相同的顺序(因此,在 X 上也是如此)应用。
2。如果客户端应用程序尝试读取尚未更新的跟随者上的 X,它会获得过时值吗?
由于数据库以强一致性方式工作,因此应该无法读取过时值。因此,如果客户端无法连接到领导者或更新后的追随者,它应该会出错。这应该是 CAP 定理的结果。
拜托,谁能告诉我我是否正确,如果不正确,为什么?谢谢!
您描述系统的方式 - 拥有一个领导者并且成功是当大多数节点接受写入时 - 这意味着您正在使用基于共识的单一领导者复制。 (请问这是否需要解释)
在基于共识的模型中,所有节点将以相同顺序更新,但无法保证特定节点何时更新。但可以保证,如果写入被接受,那么大多数节点都会接受它。共识协议本身保证所有节点最终都会获得所有写入。
我建议阅读有关 Raft 算法的论文 - 它相对简单明了,涵盖了共识的所有主要方面。
上面两段我说了对于给定的写入,有两个语句是正确的:大多数节点接受了写入;如果某些节点落后 - 他们最终将获得更新。问题是这种可能性是否具有很强的一致性?
基于共识的系统有两种读模式:最终一致性读和强一致性读。我看到很多论文把后者称为reads——linearizable reads。
最终一致性读取很简单 - reader 转到随机节点,它们可能会或可能不会看到最新值。这里一切都好。
线性化读取更复杂。要理解这一点,我们应该描述在基于共识的系统中日志是什么。日志是所有事件的顺序——每个节点最终都会有完全相同的日志——相同顺序的相同事件。所以当我们说 - 写入已被接受 - 这意味着大多数节点将 write-event 附加到他们的日志中。
这是获得强一致性又名可线性化读取的算法:
- 客户端必须连接到领导者
- 客户端告诉leader它需要强一致性读
- 领导提出了一个新的read-event要附加到日志
- 该提案是共识算法中的标准操作——提案被发送到所有节点
- 领导者等到大多数人接受这个read-event;在你的情况下,只要一个追随者接受 - 该事件被视为已接受
- 领导者将事件追加到日志中
- 一旦领导者看到 read-event 被附加到它的日志中,领导者可能会得出结论,它看到了世界的最新可能图片
- 领导者现在可以读取自己的日志来查找请求客户端的数据
- 领导找到最新数据returns给客户
上述步骤保证客户端看到最新的更新。
我正在努力提高我在分布式数据库和可以实现的各种级别的一致性方面的知识。首先,让我定义一些我将使用的术语(如果我错了,请告诉我):
强一致性:据博士报告。 Kleppmann 在“设计数据密集型应用程序”中,它是“线性化”的同义词,它是一种一致性级别,它使复制的数据存储表现得好像只有一个数据项的副本,并且对它的每个操作都以原子方式进行。
复制因子:一个数据项的副本数。
假设我有一个由 3 个节点组成的集群,配置为 strong consistency 模式和 replication factor = 3 并且领导者有成功地将对数据项 X 的写入复制到它的一个追随者,我有以下问题:
1.当第二个追随者 return 重新联机时,写入将被复制到第二个追随者,不是吗?
在我看来,当领导者至少向其追随者之一成功复制写入时,数据库可以 return 对客户端应用程序“成功”。事实上,它已经达到该写入的多数法定人数,因此它不必等待第二个跟随者确认该操作。然而,给定复制因子的值,当第二个追随者在线时,写入将以相同的顺序(因此,在 X 上也是如此)应用。
2。如果客户端应用程序尝试读取尚未更新的跟随者上的 X,它会获得过时值吗?
由于数据库以强一致性方式工作,因此应该无法读取过时值。因此,如果客户端无法连接到领导者或更新后的追随者,它应该会出错。这应该是 CAP 定理的结果。
拜托,谁能告诉我我是否正确,如果不正确,为什么?谢谢!
您描述系统的方式 - 拥有一个领导者并且成功是当大多数节点接受写入时 - 这意味着您正在使用基于共识的单一领导者复制。 (请问这是否需要解释)
在基于共识的模型中,所有节点将以相同顺序更新,但无法保证特定节点何时更新。但可以保证,如果写入被接受,那么大多数节点都会接受它。共识协议本身保证所有节点最终都会获得所有写入。
我建议阅读有关 Raft 算法的论文 - 它相对简单明了,涵盖了共识的所有主要方面。
上面两段我说了对于给定的写入,有两个语句是正确的:大多数节点接受了写入;如果某些节点落后 - 他们最终将获得更新。问题是这种可能性是否具有很强的一致性?
基于共识的系统有两种读模式:最终一致性读和强一致性读。我看到很多论文把后者称为reads——linearizable reads。
最终一致性读取很简单 - reader 转到随机节点,它们可能会或可能不会看到最新值。这里一切都好。
线性化读取更复杂。要理解这一点,我们应该描述在基于共识的系统中日志是什么。日志是所有事件的顺序——每个节点最终都会有完全相同的日志——相同顺序的相同事件。所以当我们说 - 写入已被接受 - 这意味着大多数节点将 write-event 附加到他们的日志中。
这是获得强一致性又名可线性化读取的算法:
- 客户端必须连接到领导者
- 客户端告诉leader它需要强一致性读
- 领导提出了一个新的read-event要附加到日志
- 该提案是共识算法中的标准操作——提案被发送到所有节点
- 领导者等到大多数人接受这个read-event;在你的情况下,只要一个追随者接受 - 该事件被视为已接受
- 领导者将事件追加到日志中
- 一旦领导者看到 read-event 被附加到它的日志中,领导者可能会得出结论,它看到了世界的最新可能图片
- 领导者现在可以读取自己的日志来查找请求客户端的数据
- 领导找到最新数据returns给客户
上述步骤保证客户端看到最新的更新。