我有一组数据库,分布在网络中的多个位置,例如。一个客户端需要在该数据库中存储一些数据。
我需要确保我的数据始终存储。
我无法组织具有同步/异步复制的副本集,因为它会使我连接到一个主服务器,这是一个故障点,因此我将数据从客户端发送到我知道的所有数据库。显然,一个数据库可能无法存储,所以我依赖于其他数据库写入。最后,我得到了存储在DB中的不同数据集,尽管这些集合是重叠的。 (例如DB1 - > [1,2,3],DB2 - > [1,3],DB3 - > [2,3,4])
从这些数据库读取数据时如何获得一致的数据?我应该在写入数据的客户端和能够成功合并数据集的客户端上应用哪些技术(上读取器[1,2,3,4])?
答案 0 :(得分:2)
你所要求的基本上是计算机科学的一个完整分支。这是一个非常重要的问题,你会发现很多东西是不可能的。
另请注意,简单地说“一致”数据并不是一个充分的定义。存在各种级别的一致性(读取自己的写入,读取 - 跟随写入,单调读取,线性化,因果等)我认为您可能意味着(在非常宽松的意义上):一致性类似于什么只使用一个数据库就可以得到。
要直接回答您的问题,您需要决定读取仲裁大小和写入仲裁大小。必须选择这些大小,使得读取和写入将至少由一个数据库实例重叠。如果要优化写入延迟,请使用较小的写入仲裁,如果要优化读取延迟,请执行相反的操作。
可以在Weighted Voting for Replicated Data中找到有关重叠读/写仲裁的更详细说明。这被认为是复制领域的一项开创性工作。
在添加或删除数据库实例时,还要注意重叠仲裁的行为。听起来你有一个相对静态的拓扑,但如果不是这样,那么就需要做出完全不同的选择。
最后 - 这是真正的开心 - 我所描述的实际上并没有给你一致性(按照任何定义)在某些情况下(我喜欢Daniel Abadi's explanation of when andy why),但对于许多系统它给你足够好一致性。由您来决定您需要的确切程度。
答案 1 :(得分:0)
有双向/三向复制软件,不需要“主”。 您还可以使用基于事务日志的复制。
您可以使用的内容和方式取决于您使用的数据库产品。
HTH