【问题标题】:Consistency for read from distributed databases从分布式数据库读取的一致性
【发布时间】:2013-03-12 13:23:00
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: distributed-computing eventual-consistency distributed-database data-consistency


    【解决方案1】:

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

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

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

    可以在Weighted Voting for Replicated Data 中找到有关重叠读/写仲裁的更详细说明。这被认为是复制领域的开创性工作。

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

    最后 - 这是真正的咬牙切齿 - 我所描述的在某些情况下(我喜欢Daniel Abadi's explanation of when andy why)实际上并没有给你一致性(根据任何定义),但对于许多系统它给你足够好一致性。完全由您决定您需要什么级别的一致性。

    【讨论】:

    • 感谢您的好评。我已经阅读了 Werner 关于最终一致性类型的文章,其中他谈到了 read-your-own-writes、单调读取等。这都是关于副本集 EC 的,因此每个实例最终都会获得与其他实例相同的数据。我可能不需要它,因为该存储的主要目的是低写入延迟,我只想能够从所有节点读取并重新创建从客户端发送的数据集。现在我看到了一个解决方案,我为每个发送到节点的批次分配编号,以便稍后在阅读器上我可以检测到唯一的数据项。
    • 我明白了。我有点误解了你问题的主旨。您可能会考虑使用矢量时钟作为检测冲突的方法。然后问题变成了在读取时应用确定性合并函数(即读取分辨率)
    【解决方案2】:

    有不需要“主”的双向/三向复制软件。 您还可以使用基于事务日志的复制。

    您可以使用什么以及如何使用取决于您使用的数据库产品。

    HTH

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 2015-01-09
      • 2012-05-08
      • 2018-05-14
      • 2017-09-02
      • 2022-01-27
      • 2020-01-18
      • 2019-10-20
      • 2011-08-16
      相关资源
      最近更新 更多