确保分布式数据库集群范围内一致性的技术

Techniques to ensure cluster wide consistency at distributed databases

阅读 an excellent article about role of the logs in distributed file systems 后,日志记录对我来说似乎是分布式数据库集群范围一致性和数据集成问题的唯一答案。

是否所有分布式系统都使用日志来实现同步、一致性、复制和恢复目的?或者它们仅在 log?

的 format/protocol 上有所不同

您能否提供分布式数据库中集群范围一致性的替代方法?

HBase and Bigtable both give another example of logs in modern databases.

他们是什么意思?其他数据库为了一致性目的不使用日志?

一致性是一个重载的术语,具有多重含义。但通常,当人们说一个系统是一致的时,他们的意思是该系统没有矛盾并且它的行为符合规范。显然,有很多不使用日志的一致性分布式系统。

示例:

  1. (笑话)如果你只写数据而从不读那么/dev/null是一致的,因为根据定义你不能读取数据所以你不会以矛盾结束

  2. 分布式版本控制系统(如Git)是一致的,因为它们通过保留两个版本(分支)并将冲突的解决委托给客户端来避免矛盾(merge/rebase).

  3. CRDT + 法定人数 reads/writes。源代码结构复杂,想出一个通用的自动合并算法是不可能的。但是使用更简单的结构是可能的。如果我们需要实现一个普通的评论系统,并且我们不关心顺序和 delete/edit 功能,那么我们可以将评论存储在一个集合中,并使用 set-union 作为自动冲突解决策略。 CRDT 防止冲突,而 quorum reads/writes 为我们提供挂钟顺序:一旦操作完成,其效果对所有后续读取都是可见的。没有冲突和挂钟时间保证没有矛盾。

  4. 法定人数reads/writes + 单个客户端。如果一个系统只有一个客户端,那么冲突也是不可能的,因此仲裁 reads/writes 也提供了一致性。

线性度

人们通常会将一致性与线性化相混淆,但即使我们谈论线性化,也有一些方法可以在没有日志的情况下使用它。最著名的实现线性化的协议是Paxos。

Paxos 是关于构建分布式一次写入寄存器(Multi-Paxos 是关于分布式只追加日志)。看起来常规 Paxos(非 Multi-Paxos)的应用范围很窄,但是:

  1. 我们仍然可以在它之上构建一致的分布式系统。例如,我们可以使用 Paxos 来克服 2PC 的缺点(如果协调器发生故障,2PC 会阻塞系统):由于协调器只需要决定中止或提交事务一次,因此可以使用一次写入寄存器来存储那个决定。

  2. 它有一个变体,允许将它用作没有日志的可重写寄存器。我在 How Paxos Works post and implemented it in the Gryadka project with 500-lines of JavaScript. Also, the idea behind it was independently checked with TLA+ by Greg Rogers and Tobias Schottdorf.

    中描述了这种方法