redis集群分片中心跳包的数据有什么用

今天研究redis集群为什么有16384个槽的时候,答案给出了如下的结果
(1)、如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。如上所述,在消息头中,最占空间的是 myslots[CLUSTER_SLOTS/8]。
当槽位为65536时,这块的大小是:65536÷8÷1024=8kb,因为每秒钟redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费带宽。
(2)、redis的集群主节点数量基本不可能超过1000个。如上所述,集群节点越多,心跳包的消息体内携带的数据越多。如果节点过1000个,也会导致网络拥堵。因此不建议redis cluster节点数量超过1000个。对于节点数在1000以内的redis cluster集群,16384个槽位够用了。没有必要拓展到65536个。
(3)、槽位越小,节点少的情况下,压缩比高,Redis主节点的配置信息中,它所负责的哈希槽是通过一张bitmap的形式来保存的,在传输过程中,会对bitmap进行压缩,但是如果bitmap的填充率slots / N很高的话(N表示节点数),bitmap的压缩率就很低。如果节点数很少,而哈希槽数量很多的话,bitmap的压缩率就很低。

我想问的问题就是
一、为什么要发送如上所说的心跳包,这个心跳包发给了谁,有什么作用
二、
集群的键被分割到了16384个槽, 这个槽的算法是:

HASH_SLOT = CRC16(key) & 16384

既然算法固定,怎么确定我的key是被平均的分配到hash槽上面的,如果无法平均的分配到每个节点,那问题就是,分片的作用在哪里,比如我写的每个数据中key都通过这个算法刚好被分配到了一个节点的hash槽里面,那分片模式的意义就没有了啊
三、在这里传输过程是指的什么,是谁发起的传输,又要发送到哪里

以下内容部分参考ChatGPT模型:


1、redis集群中的心跳包是用来保证集群中各个节点之间的通信正常的。每个节点都会向其他节点发送心跳包,并接收其他节点发送的心跳包,以判断各个节点的状态是否正常,如果某个节点长时间没有发送心跳包,就会被认为是失联的节点,其他节点会开始进行重新选举等操作,以确保集群的正常运行。

2、16384个槽是一个默认值,可以通过命令进行修改。在使用HASH_SLOT = CRC16(key) & 16384这个算法进行分片的时候,如果某个节点的槽没有被平均分配到,那么就会出现数据倾斜的问题。这个问题可以通过增加节点数或者手动调整节点的槽分配情况来解决。

例如,如果有3个节点,每个节点分配到的槽如下:

节点A:0-5460

节点B:5461-10922

节点C:10923-16383

这样就能保证每个节点分配到的槽数是相近的,避免了数据倾斜的问题。

3、在这里传输过程指的是节点之间交换数据的过程。在redis集群中,每个节点之间都需要进行数据的交换,例如节点之间进行主从切换、进行数据同步等操作。这些操作都需要节点之间进行数据的传输,通过网络进行交互。在这个过程中,会对数据进行压缩等处理,以减少网络传输的数据量,提高传输效率。


如果我的建议对您有帮助、请点击采纳、祝您生活愉快

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^