【问题标题】:How do you deal with denormalization / secondary indexes in database sharding?您如何处理数据库分片中的非规范化/二级索引?
【发布时间】:2010-05-02 03:14:58
【问题描述】:

假设我有一个带有 2 个二级索引的“消息”表:

  • “recipient_id”
  • “sender_id”

我想通过“recipient_id”对“message”表进行分片。这种方式来检索发送给某个收件人的所有消息,我只需要查询一个分片。

但同时,我希望能够进行查询,询问某个发件人发送的所有消息。现在我不想将该查询发送到“消息”表的每个分片。一种方法是复制数据并使用“sender_id”对“message_by_sender”表进行分片。

这种方法的问题在于,每次发送消息时,我都需要将消息插入“message”和“message_by_sender”表中。

但是如果插入“message”后插入“message_by_sender”失败了怎么办?在这种情况下,消息存在于“message”中,但不存在于“message_by_sender”中。

我如何确保如果一条消息存在于“消息”中,那么它也存在于“消息_by_sender”中而不诉诸两阶段提交?

对于任何对其数据库进行分片的人来说,这一定是一个非常普遍的问题。你怎么处理它?

【问题讨论】:

    标签: database scalability denormalization sharding distributed-transactions


    【解决方案1】:

    这个问题没有“灵丹妙药”。一些选项:

    1. 使用消息队列发布更改。最终,这些更改将应用​​于不同的分区。
    2. 在消息表分区上有一个触发器,在表中创建“需要索引条目”行。其他东西会定期扫描它并创建索引。

    您可能想阅读这篇关于在 Google App Engine 上进行分布式事务的博客文章:http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine。基本上,如果您不想要 2phase 提交或 Paxos 或类似的东西,那么您需要使用某种最终一致的模型。

    -戴夫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2011-05-30
      • 1970-01-01
      • 2017-04-01
      相关资源
      最近更新 更多