对于mysql进行水平分库分表,原则是按照用户id进行hash分发,如何保证数据不倾斜,求大神解答? - 知乎
作者:程序员历小冰
链接:https://www.zhihu.com/question/423104852/answer/1503301484
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
基本上分表都是根据Hash取模法来进行分配的,也就是字段的hash值 % 表数量,因为线上业务特性往往会出现数据倾斜问题。
如果数据倾斜特别严重时,就需要考虑二次分表,也就是添加一定数量的表,将数据进行迁移,就像HashMap的 rehash 一样。
可以使用一致性哈希算法进行分表,可以对局部倾斜数据进行两次分表,实现起来方便,且只影响部分表数据。
首先,一致性哈希算法在应对增加一张表这种场景时,只会引发部分数据迁移,不会像普通的hash算法一样导致大量数据迁移。
其次,一致性哈希算法可以动态添加虚拟节点映射,在不增加表的情况下,减少数据倾斜。
有了虚拟节点,就像是两次分表一样,落在虚拟节点上的数据会被分发到它指定的节点上。如上图所示,如果没有虚拟节点,则最底部三个红色圈代表的数据都会分发到分表3,有了虚拟节点,其中两个会被分发到分表2,从而减少了数据倾斜。