数据分区设计(3)-根据键的Hash分区

举报
JavaEdge 发表于 2022/08/31 23:45:54 2022/08/31
【摘要】 由于数据倾斜和热点问题,许多分布式系统采用基于K散列函数来分区。好的散列函数可处理倾斜数据并使其均匀分布。数据分区目的的hash函数无需健壮的加密能力,如Cassandra 和 MongoDB 使用 MD5。许多编程语言也有内置的简单哈希函数(主要用于哈希表),但可能不适合分区:如Java 的 Object.hashCode(),同一K可能在不同进程中有不同哈希值。确定合适的hash函数后,...

由于数据倾斜和热点问题,许多分布式系统采用基于K散列函数来分区。

好的散列函数可处理倾斜数据并使其均匀分布。

数据分区目的的hash函数无需健壮的加密能力,如Cassandra 和 MongoDB 使用 MD5。许多编程语言也有内置的简单哈希函数(主要用于哈希表),但可能不适合分区:如Java 的 Object.hashCode(),同一K可能在不同进程中有不同哈希值。

确定合适的hash函数后,就能为每个分区分配一个hash范围(而不是直接就是K的范围),每个K通过hash散列落在不同分区,如图-3: 图-3:基于K的hash来分区

这种方案擅长在分区之间均匀分配K。分区边界可以是均匀间隔,也可以是伪随机选择(也称为一致性哈希)。

一致性哈希

一种平均分配自己负载的方法,最初用于内容分发网络(CDN)等互联网缓存系统。 采用随机选择的分区边界来规避中央控制或分布式共识。此处的一致性与副本一致性或ACID一致性无任何关联 ,它只描述了数据动态平衡的一种方法。

正如“分区再平衡” 中所见,这种特殊分区方法对于DB实际上效果并非很好,所以目前很少使用(虽然某些DB的文档仍会使用一致性哈希说法,但其实不准确)。 因为有可能产生混淆,所以最好避免使用一致性哈希这个术语,而只是把它称为 散列分区(hash partitioning)

但通过hash分区,失去高效的执行范围查询的能力:即使相邻的K,经过hash后也会分散在不同分区。MongoDB中,若使用hash分区,则范围查询都必须发送到所有分区。而Couchbase或Voldemort干脆直接不支持K的范围查询。

Cassandra在两种分区策略之间采取折中。 Cassandra的表可使用由多个列组成的复合主键。键中只有第一部分可用于 hash 分区,而其他列则被用作 Casssandra 的 SSTables 中排序数据的联合索引。尽管不支持复合主键的第一列的范围查询,但若第一列已指定固定值,则可对其他列执行高效的范围查询。

联合索引为一对多关系提供一个优雅的数据模型。如社交网站,一个用户可能发布很多消息更新。若更新的K被设置为 (user_id,update_timestamp),则能高效检索某用户在某时间段内,按时间戳排序的所有更新。不同用户可存储在不同分区,但对某一用户,消息会按时间戳顺序存储在同一分区。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。