考虑在5台计算机上共有5个副本的数据库。对数据库的写入涉及所有5台机器中的两阶段提交,以保持一致性。
假设一台机器发生故障。然后写入数据库仍然可以在其他4个节点上运行两阶段提交,因为它仍然占多数。
但是当羽绒机重新启动并重新连接时,它如何同步并重新加入群集?
重新加入的计算机需要获取它没有的提交日志条目。据推测,它在所有5台机器中运行某种共识算法,以便在缺少的下一个日志条目上达成一致。并且它一直这样做,直到它赶上丢失的提交日志条目。
但它如何从追赶到加入集群。虽然它正在追赶其他4台机器将提交一堆新的写入。所以它似乎永远无法捕获。
重新加入节点是否请求群集停止处理新写入以使其赶上。然后使用一致性算法重新加入(是如何重新加入的?)。这似乎会导致写入处理的主要打嗝延迟。解决这个问题的惯用方法是什么?
答案 0 :(得分:1)
这不是一个答案,我不知道。难以在评论中将其读出来。
然而。群集计算机节点具有与分布式数据库相同的一些问题。数据完整性以及制定“决策”的人与数据库有两个共同点。
跨地理位置不相交的集群成员(如Solaris geocluster)进行复制在某种程度上与SAN的工作方式相同。如果节点A具有数据集(例如zfs文件系统),则源自节点B的任何更改都将存储为增量,就像快照的工作方式一样。不一定需要完全同步,因为A的数据集的基础加上delta == B的数据集。如果需要,可以在将来某个时间完全同步A和B的数据集。因此,如果B跟踪本地数据,然后使用A的增量更新“快照”,则每个人都会同步。世界很幸福。
现在,决定。三角洲的人是谁? A或B.? A是跟踪自己的数据集还是跟踪自身加上B的增量?在群集中,仲裁管理器决定。这是一个任意选择的节点,负责决策。实际上可能发生的是每个“本地”节点都有一个唯一的数据集,然后是来自其他人的增量“快照”。群集需要奇数个节点才能正常运行。当节点数为偶数时,您不能拥有仲裁。 FWIW。
在地理集群中,如果节点A在Albuquerque中失败,则纽约的节点B几乎可以立即对节点A进行故障转移。这是因为B拥有一切。仲裁管理器决定谁在具有大量成员的集群中为谁进行故障转移,如果C被淹没,它还可以将应用程序负载从C重新分配到D和E(并且其他一些条件都是真的,就像应用程序在C,D上获得许可一样) ,和E)
重点是:2个节点没有相同的数据集,但是它们的集合数据集的总和与在等式中考虑的任何网络延迟一样相同。
答案 1 :(得分:0)
这是一个非常复杂的话题,在这里的短篇文章中可能无法理智地回答。
我建议您阅读Cassandra或其他成熟的分布式数据库的技术文档。 Cassandra特别适合您的问题,因为它具有可调整性的概念 - 您可以决定在给定事务中需要提交的所有数据库的哪一部分。
我想你会在那里找到你的问题的答案,还有你还没有的更多问题。