联系hashgameCONTACT hashgame
地址:广东省广州市
手机:13988889999
电话:020-88889999
邮箱:admin@qq.com
查看更多
Rhashgamehashgame
你的位置: 首页 > hashgame

分布式 DBLE 分片算法之 hash 分片 - 个人文章 - SegmentFault 思否HASH GAMEOnline Skill Game ET 300

发布时间:2025-03-16 19:42:59  点击量:

  HASH GAME - Online Skill Game GET 300

分布式 DBLE 分片算法之 hash 分片 - 个人文章 - SegmentFault 思否HASH GAME - Online Skill Game GET 300

  社区有大佬分享过跳增 hash 的文章,但是当时并不理解跳增 hash 使用的场景。刚接触分布式数据库中间件 dble 的时候,最迷惑的概念之一是 hash 分片算法。看到哈希,第一印象是散列表,感觉是存储相关的。hash 一个重要的特征是需要不同输入产生不同输出,但是在分片算法里,是需要多个值映射到一个分片节点上。这么大的差异,为什么可以用 hash 来对分布式数据库做逻辑分片,并且还命名叫 hash 分片!!!它们之间有哪些神似呢?

  要理解他们之间的相似和差异,先从对 hash 最初的认识——散列表说起。散列表是一种数据结构,通过散列函数(也就是 hash 函数)将输入映射到一个数字,一般用映射出的数字作为存储位置的索引。数组在查找时效率很高,但是插入和删除却很低。而链表刚好反过来。设计合理的散列函数可以集成链表和数组的优点,在查找、插入、删除时实现 O(1) 的效率。散列表的存储结构使用的也是数组加链表。执行效率对比可以看下图 1.3:

  2. 数据分布均匀3. 扩容方便主要是扩容时尽可能移动较少的数据。扩容之后实现新的数据分布均匀。想要实现动态扩容,尽可能不影响业务并保证效率,需要做到移动尽可能少的数据,一致性 hash 就是为了解决移动较少数据的问题,但是一致性 hash 的缺点是数据分布的均匀性较差。为了解决这个问题,聪明的 dev 们又设计了跳增一致性 hash 算法。到这里,可以看出 hash 与分片最紧密或者说最神似的点在于:1. 固定的输入有固定的输出2. 值呈均匀分布如果分布式数据库的分片数据分布不均匀,最糟情况就像散列表的极端冲突一样,落在最终数据库上的压力跟不使用分布式相同。

  取模 hash,举个最简单的例子就能明白:分片数设置为 2,要把数据均匀分布在这 2 个分片上,直接对分片 key 取模 2,这样模值为 0 的数据落在分片 1,模值为 2 的数据落在分片 2。只要输入的数据奇偶均匀,分片数据就保证均衡。取模 hash 在 dble 里还做了一些变种支持,比如可以指定每个分片的连续值的数量,比如自然数 0-99 放分片 1,自然数 100-599 放分片 2,具体配置方式参考官方文档。这样做主要目的是改善 hash 在范围查询时的效率问题。Hash 取模分片非常简单,均衡性比较好,能分散数据热点,并且能快速人为识别数据所在分片。缺点也很明显。1\. 在业务上范围查询效率比较低2\. 扩容不便因为取模 hash 强依赖于分片数,当新增或删减分片节点——即扩缩容时,大量的数据在重新映射后都需要挪动。比如上面的 2 分片数据,如果增加到 3 分片,原来分片 1 上的数据只有 1/3 的数据可以保留不动,另外 2/3 的数据都需要挪到新的分片上,分片 2 也是如此。如果真的使用了 hash 取模分片,为了后期在扩容时移动尽可能少的数据,dble 的建议是:取模的基数不能大于 2880,原因是:2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 32, 36, 40, 45, 48, 60, 64, 72, 80, 90, 96, 120, 144, 160, 180, 192, 240, 288, 320, 360, 480, 576, 720, 960, 1440 是 2880 的约数。

【返回列表页】

顶部

地址:广东省广州市  电话:020-88889999 手机:13988889999
Copyright © 2018-2025 哈希游戏(hash game)官方网站 版权所有 非商用版本 ICP备案编: