1

我有一组数据库,分布在网络中的多个位置,例如。一个需要在该数据库中存储一些数据的客户端。

我需要确保我的数据将始终被存储。

我无法使用同步/异步复制组织副本集,因为它会使我连接到一个故障点的主服务器,因此我将数据从客户端发送到我知道的所有数据库。显然,一个数据库可能无法存储,所以我依赖于其他数据库的写入。最后,尽管这些数据集是重叠的,但我得到了存储在 DB 中的不同数据集。(例如 DB1 -> [1, 2, 3],DB2 -> [1, 3],DB3 -> [2,3,4])

从这些数据库读取时如何获得一致的数据?我应该在写入数据的客户端和读取的客户端上应用哪些技术才能成功合并数据集(获取阅读器 [1,2,3,4])?

4

2 回答 2

2

您要问的基本上是计算机科学的整个分支。这是一个非常重要的问题,您会发现数量惊人的事情是不可能的。

另请注意,仅说“一致”数据是不够的定义。有各种级别的一致性(read-your-own-writes、reads-follow-writes、单调读取、线性化、因果等)我认为您可能的意思是(在非常松散的意义上):一致性类似于什么当您只使用一个数据库时,您会得到。

要直接回答您的问题,您需要决定读取仲裁大小和写入仲裁大小。必须选择这些大小,以便读取和写入将由至少一个数据库实例重叠。如果您想针对写入延迟进行优化,请使用较小的写入仲裁,如果您想针对读取延迟进行优化,请执行相反的操作。

可以在复制数据的加权投票中找到有关重叠读/写仲裁的更详细说明。这被认为是复制领域的开创性工作。

在添加或删除数据库实例时,还要注意重叠仲裁的行为。听起来您有一个相对静态的拓扑,但如果不是这种情况,则需要做出一组完全不同的选择。

最后——这是真正的咬牙切齿——我所描述的在某些情况下实际上并没有给你一致性(根据任何定义)(我喜欢丹尼尔阿巴迪对何时安迪为什么的解释),但对于许多系统来说它给了你很好的足够的一致性。由您决定您需要的一致性级别。

于 2013-03-12T14:37:54.647 回答
0

There are two-way/three-way replication software that do not require a "master". You can also use transaction log based replications.

What and how you can use will depend on the database product you use.

HTH

于 2013-03-12T14:20:28.397 回答