✅分库分表后怎么设计可以降低数据迁移的难度?

典型回答

分库分表之后,因为最初的预估数据不够准确,导致后续数据增长很快,表不够了,就可能要重新分表。重新分表就需要涉及到数据迁移的,需要对老表的数据迁移到新表中。

关于数据迁移可以看:

✅如何做平滑的数据迁移?

那么,如果未来一定要迁移,有没有办法在最初的时候就想办法降低一下迁移的成本呢?

分库分表的数量选择2的幂?

✅分库分表的数量为什么一般选择2的幂?

当我们在做分库分表的时候,必然要考虑的一个问题那就是二次分表的问题,比如我们根据当前的业务发展,计算出可能需要分4张表就够了,但是随着业务增长,可能认为需要更多表才行,这时候如果我们把新的分表数量定位8张表,那么在做数据迁移的时候,就可以只迁移部分数据。

假设我们最开始将订单表分成了4张表,分别是 order00、order01、order02、order03,这时候假设我们的分表算法是根据 userId取模。即 userId % 4

  • order_00:userId % 4 == 0
  • order_01:userId % 4 == 1
  • order_02:userId % 4 == 2
  • order_03:userId % 4 == 3

当数据量增长,需要将表扩展到8个时,需要将算法改为userId % 8

新的哈希值计算:

  • order_00:userId % 8 == 0
  • order_01:userId % 8 == 1
  • order_02:userId % 8 == 2
  • order_03:userId % 8 == 3
  • order_04:userId % 8 == 4
  • order_05:userId % 8 == 5
  • order_06:userId % 8 == 6
  • order_07:userId % 8 == 7

而在做储量数据迁移的时候,我们只需要重新分配那些原来在表0、1、2、3中,且哈希值满足 userId % 8 >= 4 的数据进行迁移就好了,userId % 8 的结果在0-3范围内的数据其实是不用动的。

  • 从表0迁移到表4:如果 hash % 8 == 4
  • 从表1迁移到表5:如果 hash % 8 == 5
  • 从表2迁移到表6:如果 hash % 8 == 6
  • 从表3迁移到表7:如果 hash % 8 == 7

也就是说,从4张表扩容到8张表其实只需要迁移一半的数据。而如果不是2的幂,比如说从5张表扩容成9张表,那每个原数据都需要重新计算哈希值并重新分配到新的表中。因为扩展后的表数量不是2的幂次,大多数数据都会被重新分配到不同的表中。

所以,使用2的幂作为分表数量的最重要的一个好处,那就是在做数据迁移时只需重新计算和迁移一半数据。这种方法不仅降低了系统扩展的复杂性,还减少了扩展过程中对系统性能的影响。

一致性 hash

✅什么是一致性哈希?

一致性哈希(Consistent Hashing)是一种用于分布式系统中数据分片和负载均衡的算法。它的目标是在节点的动态增加或删除时,尽可能地减少数据迁移和重新分布的成本。

如果在最开始做分表的时候,算法选择一致性哈希,就可以大大降低后续的迁移成本。

原文: https://www.yuque.com/hollis666/xkm7k3/uaazc62zm0bey0qr