对于mysql进行水平分库分表,原则是按照用户id进行hash分发,如何保证数据不倾斜,求大神解答?

对于mysql进行水平分库分表,原则是按照用户id进行hash分发,如何保证数据不倾斜,求大神解答? - 知乎

作者:程序员历小冰
链接:https://www.zhihu.com/question/423104852/answer/1503301484
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

基本上分表都是根据Hash取模法来进行分配的,也就是字段的hash值 % 表数量,因为线上业务特性往往会出现数据倾斜问题。

如果数据倾斜特别严重时,就需要考虑二次分表,也就是添加一定数量的表,将数据进行迁移,就像HashMap的 rehash 一样。

可以使用一致性哈希算法进行分表,可以对局部倾斜数据进行两次分表,实现起来方便,且只影响部分表数据。

首先,一致性哈希算法在应对增加一张表这种场景时,只会引发部分数据迁移,不会像普通的hash算法一样导致大量数据迁移。

其次,一致性哈希算法可以动态添加虚拟节点映射,在不增加表的情况下,减少数据倾斜。

有了虚拟节点,就像是两次分表一样,落在虚拟节点上的数据会被分发到它指定的节点上。如上图所示,如果没有虚拟节点,则最底部三个红色圈代表的数据都会分发到分表3,有了虚拟节点,其中两个会被分发到分表2,从而减少了数据倾斜。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值