redis集群之hash槽分析算法

news/2024/11/8 0:35:08/

上文提过了 hash取余算法和hash一致性算法
一致性hash算法是为了减少节点数目发生改变时尽可能的减少数据迁移
将所有的存储节点排在首位相连的Hash环上,每个key在计算hash后会顺时针找到临近的存储节点。
而当有节点加入或退出时,仅影响该节点在hash环上顺时针相邻的节点。
优点

加入或删除时节点,只影响Hash环中顺时针方向的相邻节点。
加入时:将相邻的节点一部分数据转移的新节点
删除时:将相邻的节点添加删除节点的数据

缺点

数据的分布与节点位置有关,而这些节点不均匀的分布在Hash换上,所以每个
redis实例存储的数据也不均匀,会造成数据倾斜

刚刚提到一致性hash算法有数据倾斜问题,为了解决这个问题便又了
hash槽分析算法。

哈希槽

哈希槽时机就是一个数组,数组【0,2^14-1】形成了哈希槽空间。

哈希槽用来解决均匀分配问题,在数据和节点之间又加了一层,把这层称为hash槽,用于管理数据和节点之间的关系,现在就相当于节点上方的是槽,槽里放的数据。

一个集群只能有16384个槽,编号0-16383,这些槽会分配给各个主节点。同时集群会记录槽与节点的关系。解决槽和节点的映射关系后,接下来
堆key进行计算求出槽位。hash_solt=CRC16(key) mod 16384。如果要增减节点,则以槽为单位移动数据,这样数据移动问题就更加简单了

在这里插入图片描述

为什么redis集群的最大槽数是16384个?

CRC16算法可以产生的hash值有 2^16 bit,
该算法可以产生2^16个值,那为何不用
Hash_solt=CRC16(key) mod 65536呢?

正常的心跳包数据带有节点的完整配置。

原因1: 如果槽位位65536,发送心跳消息的消息头达8k,发送心跳包过于庞大。

在心跳消息的消息头中最占空间的是myslots[CLUSTER_SOLT/8]。
当槽位为65536时,这块大小是:65536/8/1024=8kb
当槽位为16384时,这块大小是:16384/8/1024=2kb

因为每一秒钟(心跳配置间隔),redis节点需要发送一定数量的ping消息作为心跳包。如果每条消息的消息就占8kb,浪费带宽。

原因2:redis cluster节点数量超过1000个

redis集群节点越多,心跳包的消息体内携带的数据越多。如果节点超过1000个,会导致网路拥堵,因此redis作者不建议将redis cluster节点数量超过1000个。那么对于节点数在1000以内的rediscluster集群,16384个槽位够用了,没必要扩展到65536个。

原因3:槽位越小,节点少的情况下,压缩比高,容易传输

redis主节点的配置信息中他所负责的hash槽是通过一张bitmap的形式来保存的,在传输过程中会对bitmap进行压缩,
bitmap的填充率=slots / N (N表示节点数)
也就是说slots越小,填充率就会越小,压缩率就会越高,传输效率就会越高

其他

redis 集群也不能保证强一致性(C)可以保证AP。在一些特定的情况下,redis集群可能会丢掉一些被系统受到到写入请求命令。就是主机突然挂了,还没来得急同步从机。


http://www.ppmy.cn/news/87589.html

相关文章

不到9万元的毫末小魔驼3.0发布,末端物流自动配送进入精耕期

末端物流自动配送行业出现了两种截然不同的演变轨迹。 大约从2022年10月份开始,国外的无人配送探索者纷纷“折戟”。末端物流自动配送在欧美,变成了一个难以实现商业化的“伪命题”。 但在太平洋对岸的中国市场,末端物流自动配送正在加速商…

怎样做一个优秀的网关技术选型报告~

1、简介 当使用单体应用程序架构时,客户端(Web 或移动端)通过向后端应用程序发起一次 REST 调用来获取数据。负载均衡器将请求路由给 N 个相同的应用程序实例中的一个。然后应用程序会查询各种数据库表,并将响应返回给客户端。微服…

【面试题】Redis缓存设计

文章目录 Redis缓存出现的问题🙎‍♂️面试官:什么是缓存雪崩?🙎‍♂️面试官:怎样解决缓存雪崩?🙎‍♂️面试官:什么是缓存击穿?🙎‍♂️面试官:…

计算机网络:HTTP状态码有哪些?分别对应什么意思?

HTTP码有哪些?分别对应什么意思? HTTP状态码是指客户端向服务器发出请求时,服务器返回的HTTP协议状态码。 根据HTTP/1.1协议,HTTP状态码分为5类,常见的状态码包括: 1xx:信息响应类&#xff0…

Python+Pandas数据清洗的步骤

一、导语二、常见步骤1. 导入 Pandas:2. 加载数据:3. 观察数据:4. 处理缺失值:5. 处理重复值:6. 数据类型转换:7. 处理异常值:8. 数据重塑:9. 数据归一化/标准化:10. 保存…

【MySQL】(12)用户管理

文章目录 用户信息创建用户用户权限给用户授权回收权限 删除用户修改密码 用户信息 MySQL 中的用户信息,都存储在系统数据库 mysql 中的 user 表中 MariaDB [mysql]> select host, user, authentication_string from user; ----------------------------------…

一文掌握python列表的所有使用方法(零基础学python(一))

列表 Python 中的列表是一种可变的数据类型,它可以存储多个值,并且可以随时添加、删除或修改其中的元素。以下是 Python 列表的基本操作和示例代码: 创建列表 可以使用方括号 [] 来创建一个空列表,也可以在方括号中添加元素来创建一个非空列表。例如: empty_list = [] …

Three.js深度冲突(模型闪烁)与解决方案

Mesh面重合渲染测试 下面代码创建两个重合的矩形平面Mesh,通过浏览器预览,当你旋转三维场景的时候,你会发现模型渲染的时候产生闪烁。 这种现象,主要是两个Mesh重合,电脑GPU分不清谁在前谁在后,这种现象&a…