在阅读an excellent article about role of the logs in distributed file systems之后,对我来说,日志记录似乎是分布式数据库和数据集成问题的集群范围一致性的唯一答案。
所有分布式系统是否都使用日志进行同步,一致性,复制和恢复?或者它们的区别仅在于日志的格式/协议?
您能否在分布式数据库中提供集群范围一致性的替代方法?
HBase和Bigtable都给出了现代数据库中日志的另一个例子。
他们是什么意思?其他数据库没有使用日志来实现一致性?
答案 0 :(得分:1)
一致性是一个具有多重含义的重载术语。但通常,当人们说系统是一致的时,他们意味着系统没有矛盾,其行为符合规范。显然,有许多一致的分布式系统不能使用日志。
示例:
(笑话)如果你只是写数据但从不读,那么/ dev / null是一致的,因为按照定义你不能读取数据,所以你不能以矛盾结束
分布式版本控制系统(如Git)是一致的,因为它们通过保留两个版本(分支)并将冲突的解析委托给客户端(merge / rebase)来避免矛盾。
CRDT + Quorum读/写。源代码具有复杂的结构,并且不可能考虑通用的自动合并算法。但是结构更简单,它是可能的。如果我们需要实现一个简单的评论系统而我们不关心订单和删除/编辑功能,那么我们可以将注释存储在一个集合中,并使用set-union作为自动冲突解决策略。 CRDT可以防止冲突,而仲裁读/写为我们提供了挂钟顺序:一旦操作完成,其效果对所有后续读取都是可见的。缺乏冲突和挂钟时间保证了缺乏矛盾。
仲裁读/写+单个客户端。如果系统只有一个客户端,那么冲突也是不可能的,因此仲裁读/写也提供了一致性。
人们通常会将一致性与线性化混淆,但即使我们谈论线性化,也有办法在没有日志的情况下使用它。实现线性化的最着名的协议是Paxos。
Paxos是关于构建分布式一次写入寄存器(Multi-Paxos是关于分布式附加日志)。看起来普通的Paxos(非Multi-Paxos)有一套非常狭窄的应用程序,但是:
我们仍然可以在其上构建一致的分布式系统。例如,我们可以使用Paxos来克服2PC的缺点(如果协调器出现故障,2PC阻塞系统):由于协调器需要决定中止或提交一次只有一次事务,所以使用写入是没关系的一旦登记存储该决定。
它有一个变体,允许将它用作没有日志的可重写寄存器。我在How Paxos Works帖子中描述了这种方法,并在Gryadka项目中使用500行JavaScript实现了它。此外,它背后的想法是通过Greg Rogers和Tobias Schottdorf与TLA +进行独立检查。