【问题标题】:Techniques to ensure cluster wide consistency at distributed databases确保分布式数据库集群范围一致性的技术
【发布时间】:2017-09-02 23:34:54
【问题描述】:
【问题讨论】:
标签:
database-design
distributed-computing
distributed-system
distributed-transactions
eventual-consistency
【解决方案1】:
一致性是一个重载的术语,具有多种含义。但通常,当人们说一个系统是一致的时,他们的意思是该系统没有矛盾并且它的行为符合规范。显然,有很多一致的分布式系统不使用日志。
例子:
-
(笑话)如果你只写数据从不读,那么 /dev/null 是一致的,因为根据定义你不能读数据,所以你不能以矛盾告终
-
分布式版本控制系统(如 Git)是一致的,因为它们通过保留两个版本(分支)并将冲突的解决委托给客户端(合并/变基)来避免冲突。
-
CRDT + Quorum 读/写。源代码结构复杂,想不出通用的自动合并算法。但是使用更简单的结构是可能的。如果我们需要实现一个琐碎的评论系统并且我们不关心订单和删除/编辑功能,那么我们可以将 cmets 存储在一个集合中并使用 set-union 作为自动冲突解决策略。 CRDT 可以防止冲突,而 quorum 读/写为我们提供了挂钟顺序:一旦操作完成,其效果对所有后续读取都是可见的。没有冲突和挂钟时间保证了没有矛盾。
-
Quorum 读/写 + 单个客户端。如果一个系统只有一个客户端,那么冲突也是不可能的,因此仲裁读/写也提供了一致性。
线性化
人们通常会将一致性与线性化混淆,但即使我们谈论线性化,也有一些方法可以在没有日志的情况下使用它。实现线性化最著名的协议是 Paxos。
Paxos 是关于构建一个分布式的一次性写入寄存器(Multi-Paxos 是关于分布式仅附加日志)。似乎常规 Paxos(非 Multi-Paxos)的应用程序集非常有限,但是:
-
我们仍然可以在它之上构建一致的分布式系统。例如,我们可以使用 Paxos 来克服 2PC 的缺点(如果协调器失败,2PC 会阻塞系统):因为协调器只需要决定中止或提交事务一次,所以使用一次写入寄存器来存储就可以了这个决定。
-
它有一个变体,允许将其用作无需日志的可重写寄存器。我在How Paxos Works 帖子中描述了这种方法,并在Gryadka 项目中用500 行JavaScript 实现了它。此外,Greg Rogers 和 Tobias Schottdorf 对 TLA+ 进行了独立检查。