【问题标题】:Partitioning the database for a shared counter为共享计数器对数据库进行分区
【发布时间】:2015-01-29 09:08:46
【问题描述】:

在数据存储的设计过程中,我们正在寻找一种对条目进行分区的方法。主要瓶颈是在对共享计数器进行分区时。可以说,我们有 n 票要提供(典型的火车预订,IRCTC 等)。我们如何对数据存储进行分区,以便客户端看到它们之间的实时一致性(根据预订百分比,即当前值/x)。

每次读取的聚合成本太高,任何其他指针都会有用。

同时假设写入操作具有并发性(因此不会将读取卸载到从属设备),并且对于最终的一致性来说是可以的。 但是有没有办法可以最小化分片之间的不一致性差异。例如,100 张票的部分是像 25、25、25、25 一样跨 4 个分片完成的。 在任何给定时间点,数据库的视图都应该像 x% 一样满,以及如何最大限度地减少分片之间的不一致(如循环、散列等幼稚操作)。

【问题讨论】:

  • 共享计数器,根据定义,不能被分区。极端和最简单的解决方案是为该计数器使用单独的实例(该计数器需要多少吞吐量?)。其他方法具有不同程度的一致性和准确性,视需要而定。例如,您可以使用每个分区的 HyperLogLog 并在读取时非常有效地合并它们。
  • 在某些情况下,单个实例可能还不够,在某些时候我们可能需要分区!此外,提供概率数字可能对应用程序不利(在预订门票的情况下)。

标签: database database-design redis sharding horizontal-scaling


【解决方案1】:

如果您的用例是这样的,您希望分配共享计数器以更好地处理读取操作的负载,您可以将共享计数器保留在其自己的实例中(根据 @ItamarHaber 的建议)并支持 N 个从属实例从主实例复制。然后可以在 N 个从属设备之间对针对该共享计数器的读取操作进行负载平衡。有一些关于通过配置文件here 操纵主从设置的讨论,还有关于使用SLAVEOF 命令动态操作从设置的文档。

这里需要注意的是,您必须对仅针对主控的写操作(INCRDECR 等)进行指导,可能通过基于队列的实现。这种方法将允许分发读取操作,但我不知道有什么方法可以避免对公共资源进行序列化写入,除非您愿意允许最终的一致性。

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多