分库分表之后,因为最初的预估数据不够准确,导致后续数据增长很快,表不够了,就可能要重新分表。重新分表就需要涉及到数据迁移的,需要对老表的数据迁移到新表中。
关于数据迁移可以看:
那么,如果未来一定要迁移,有没有办法在最初的时候就想办法降低一下迁移的成本呢?
当我们在做分库分表的时候,必然要考虑的一个问题那就是二次分表的问题,比如我们根据当前的业务发展,计算出可能需要分4张表就够了,但是随着业务增长,可能认为需要更多表才行,这时候如果我们把新的分表数量定位8张表,那么在做数据迁移的时候,就可以只迁移部分数据。
假设我们最开始将订单表分成了4张表,分别是 order00、order01、order02、order03,这时候假设我们的分表算法是根据 userId取模。即 userId % 4
当数据量增长,需要将表扩展到8个时,需要将算法改为userId % 8
:
新的哈希值计算:
而在做储量数据迁移的时候,我们只需要重新分配那些原来在表0、1、2、3中,且哈希值满足 userId % 8 >= 4 的数据进行迁移就好了,userId % 8 的结果在0-3范围内的数据其实是不用动的。
也就是说,从4张表扩容到8张表其实只需要迁移一半的数据。而如果不是2的幂,比如说从5张表扩容成9张表,那每个原数据都需要重新计算哈希值并重新分配到新的表中。因为扩展后的表数量不是2的幂次,大多数数据都会被重新分配到不同的表中。
所以,使用2的幂作为分表数量的最重要的一个好处,那就是在做数据迁移时只需重新计算和迁移一半数据。这种方法不仅降低了系统扩展的复杂性,还减少了扩展过程中对系统性能的影响。
一致性哈希(Consistent Hashing)是一种用于分布式系统中数据分片和负载均衡的算法。它的目标是在节点的动态增加或删除时,尽可能地减少数据迁移和重新分布的成本。
如果在最开始做分表的时候,算法选择一致性哈希,就可以大大降低后续的迁移成本。