介绍
Redis 的哈希槽(Hash Slot)是 Redis 集群中的一个概念,用于将数据分布到不同的节点上。Redis 集群中使用哈希槽来实现数据的分片和负载均衡,将大量的数据分散到多个节点上,以提高系统的可扩展性和性能。
具体来说,Redis 集群会将所有的哈希槽均分到不同的节点上,每个节点负责处理一部分哈希槽的数据。例如,一个 Redis 集群有 3 个节点,每个节点负责处理 16384 个哈希槽,那么每个节点负责处理的哈希槽范围为:
第一个节点:0-5460
第二个节点:5461-10922
第三个节点:10923-16383
当客户端需要访问某个键值对时,Redis 集群会根据键名计算出哈希值,并将该哈希值映射到一个哈希槽上。然后,Redis 集群会根据哈希槽的分布情况,将该键值对传递到对应的节点上进行处理。
在 Redis 集群中,哈希槽的数量是固定的,且不可更改。默认情况下,Redis 集群中有 16384 个哈希槽,可以通过 cluster slots 命令来设置哈希槽数量。当某个节点失效或者新增节点时,Redis 集群会重新计算哈希槽的分布情况,将负载均衡到其他节点上。
在 Redis 集群中,哈希槽的分布情况是通过哈希函数计算得出的。Redis 默认使用的哈希函数是 MurmurHash2,该函数可以将任意长度的数据映射成一个 32 位的二进制数,并保证均匀分布。除了 MurmurHash2,Redis 还支持其他的哈希函数,例如 CRC16 和 CRC32 等。
总的来说,Redis 的哈希槽是 Redis 集群中的一个重要概念,用于将数据分布到不同的节点上。Redis 集群通过哈希槽的分配和负载均衡,实现了高可用性、可扩展性和高性能的分布式存储服务。
节点握手
Redis 集群中的节点握手是指节点之间建立连接时的一种协议,用于保证集群中节点之间的通信正常进行。节点握手主要包括以下几个步骤:
- 节点发现:当一个节点加入到 Redis 集群中时,它会尝试与集群中的其他节点建立连接,并发送 CLUSTER MEET 命令告知其他节点自己的地址和端口号。
- 节点确认:当一个节点收到 CLUSTER MEET 命令时,它会尝试与新节点建立连接,并向新节点发送 CLUSTER NODES 命令获取集群中所有节点的信息。如果连接成功,新节点就成为了集群的一部分。
- 节点信息同步:当一个节点加入到 Redis 集群中时,它需要从其他节点获取集群中所有节点的信息,并进行同步。为了保证信息同步的正确性和完整性,Redis 集群会使用 Gossip 协议,将节点信息在集群中广播,并通过节点握手协议来对信息进行确认和同步。
- 节点状态监测:当节点之间建立连接后,Redis 集群会定期对节点进行状态监测,以保证节点的可用性和健康状态。具体来说,Redis 集群会定期向节点发送 PING 命令,并等待节点的 PONG 响应。如果节点在一定时间内没有响应,Redis 集群会将其标记为失效节点,并进行故障转移。
通过节点握手协议,Redis 集群可以保证节点之间的通信正常进行,并实现自动化的故障转移和负载均衡。节点握手协议是 Redis 集群中的一个重要组成部分,也是保证 Redis 集群高可用性和可扩展性的关键技术之一。
特点
redis-cluster的优势
性能:
这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、异步复制、客户端重定向等设计,而牺牲了部分的一致性、使用性。
水平扩展:
集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。
可用性:
在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自动Failover能力。
集群相关配置如下:
#节点端口
port 6379
#开启集群模式
cluster-enabled yes
#节点超时时间,单位毫秒
cluster-node-timeout 15000
#集群内部配置文件
cluster-config-file “nodes-6379.conf”
分配槽
分配命令如下:
Redis 集群把所有的数据映射到16384个槽中。每个 key 会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。通过 cluster addslots 命令为节点分配槽
利用 bash 特性批量设置槽(slots),命令如下
redis-cli -h 47.98.147.49 -p 6391 cluster addslots {0..5461}
redis-cli -h 47.98.147.49 -p 6392 cluster addslots {5462..10922}
redis-cli -h 47.98.147.49 -p 6393 cluster addslots {10923..16383}