【问题标题】:Best way to move a data row to another shard?将数据行移动到另一个分片的最佳方法?
【发布时间】:2008-11-16 18:01:28
【问题描述】:

问题说明了一切。

示例:我打算对数据库表进行分片。该表包含标记为“活动”、“完成”和“已删除”的客户订单。我也有三个碎片,每个标志一个。

据我所知,在更改标志时,必须将一行移动到正确的分片。

我说的对吗? 最好的方法是什么? 可以使用触发器吗?

我考虑过不立即移动该行,而只是在一天/周/月结束时,但随后不确定,具有特定标志的行驻留在哪个分片中,并且必须始终完成搜索所有分片。

编辑:一些澄清:

一般来说,我必须选择一个标准来决定一行驻留在哪个分片中。在这种情况下,我希望它是上面描述的标志,因为这是对此类数据进行分片的最自然方式。 (在我看来)只有有限数量的活跃​​订单经常被访问。有大量完成的订单,很少被访问,有非常庞大的数据行几乎从不访问。

如果我想现在特定数据行所在的位置,我不必搜索所有分片。如果用户想要加载一个活动订单,我已经知道我必须查看哪个数据库。

现在,作为我的分片标准的标志发生了变化,我想知道处理这种情况的最佳方法。如果我只是将记录保留在其原始数据库中,最终所有数据都会累积在一个表中。

【问题讨论】:

  • 如果我对问题的理解是正确的...如果您立即进行表分片,您岂不是只能从表分片中受益吗?
  • 没有足够的字符来回答。 :) 在原始问题中添加了一些说明。

标签: database language-agnostic sharding


【解决方案1】:

在我看来,将所有活动记录保存在单个分片中可能不是一个好主意。在这种分片策略中,所有 IO 都将在单个数据库实例上执行,而所有其他的高度未充分利用。

替代分片策略可以是使用某种散列函数在分片之间分配新创建的行。这将允许

  • 快速查找行
  • 在所有分片实例上分配 IO。
  • 无需将数据从一个分片移动到另一个分片(您想要增加分片数量的情况除外)。

【讨论】:

    【解决方案2】:

    分片通常是指将它们分离到不同服务器上的不同数据库中。 Oracle 可以使用称为分区表的功能来做您想做的事情。

    如果您使用触发器(after/before_update/insert),这将是一个立即行动,其他方法会导致第一个分片(活动)中具有不同类型的数据,直到它被清理。

    我还建议按日期执行此操作(例如将任何非活动且超过一个月的内容移至另一个“存档”数据库的月度作业)。

    如果您这样做是为了提高性能,我想请您重新考虑这样做(除非您在此表中有数 TB 的数据)。请告诉我们您为什么要分片,我们都会想办法解决您的问题。

    【讨论】:

    • 我这样做是为了了解分片。它不适用于现实生活中的应用程序。但我想知道,为什么没有其他人回答。我认为这将是一个常见问题...
    • 它可能没有我们想象的那么广泛使用:)
    猜你喜欢
    • 2023-03-10
    • 2015-10-31
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多