Redis Cluster 哈希槽分片机制与 Linux 集群搭建实操
Redis Cluster 通过 16384 个哈希槽实现数据分片,利用 Gossip 协议进行节点通信及 MOVED/ASK 重定向处理路由。其核心原理,并提供在 CentOS 环境下使用 redis-cli 命令搭建 3 主 3 从集群的完整步骤,涵盖配置文件编写、集群创建、扩容缩容操作及常见故障排查方法,帮助开发者掌握高可用 Redis 部署方案。

Redis Cluster 通过 16384 个哈希槽实现数据分片,利用 Gossip 协议进行节点通信及 MOVED/ASK 重定向处理路由。其核心原理,并提供在 CentOS 环境下使用 redis-cli 命令搭建 3 主 3 从集群的完整步骤,涵盖配置文件编写、集群创建、扩容缩容操作及常见故障排查方法,帮助开发者掌握高可用 Redis 部署方案。

Redis Cluster 将数据分片存储在不同节点,核心载体是16384 个哈希槽(0-16383),这个数量是基于集群灵活性与性能的权衡结果(过多槽位会增加节点通信开销,过少则分片粒度不足)。
核心规则:
CRC16(key) % 16384 计算,得到对应的哈希槽,再将数据路由到负责该槽位的节点。优势:哈希槽机制让数据分布更均匀,后续集群扩容/缩容时,只需迁移槽位对应的数据集,无需修改客户端配置。
Redis Cluster 节点之间通过 Gossip(流言)协议实现信息同步,无需依赖中心节点,去中心化设计提升集群可用性。
核心特性:
客户端访问 Redis Cluster 时,可能会遇到数据不在当前连接节点的情况,此时会通过 MOVED 或 ASK 重定向获取正确节点地址,两者适用场景不同:
MOVED 槽位 节点 BIP:端口,客户端收到后,后续请求直接转向节点 B。ASK 槽位 节点 BIP:端口,客户端需先向节点 B 发送 ASKING 命令,再执行原请求(仅本次有效,后续请求仍需按槽位路由)。节点规划:6 个 Redis 节点(3 主 3 从),部署在同一台 Linux 服务器(实际生产环境建议部署在不同服务器,这里为演示方便单台部署,通过不同端口区分)
| 节点角色 | 端口 | 配置文件路径 | 数据存储路径 |
|---|---|---|---|
| 主节点 1 | 7001 | /etc/redis/7001.conf | /var/redis/7001 |
| 主节点 2 | 7002 | /etc/redis/7002.conf | /var/redis/7002 |
| 主节点 3 | 7003 | /etc/redis/7003.conf | /var/redis/7003 |
| 从节点 1 | 7004 | /etc/redis/7004.conf | /var/redis/7004 |
| 从节点 2 | 7005 | /etc/redis/7005.conf | /var/redis/7005 |
| 从节点 3 | 7006 | /etc/redis/7006.conf | /var/redis/7006 |
yum install -y gcc gcc-c++ make
wget https://download.redis.io/releases/redis-6.2.7.tar.gz
tar -zxvf redis-6.2.7.tar.gz -C /usr/local/
cd /usr/local/redis-6.2.7/
make && make install PREFIX=/usr/local/redis
# 创建配置文件目录
mkdir -p /etc/redis
# 创建数据存储目录
mkdir -p /var/redis/{7001,7002,7003,7004,7005,7006}
# 创建日志目录
mkdir -p /var/log/redis
以 7001 端口(主节点 1)为例,创建 /etc/redis/7001.conf,内容如下:
# 端口号
port 7001
# 绑定 IP(生产环境建议绑定内网 IP,这里允许所有 IP 访问)
bind 0.0.0.0
# 开启集群模式
cluster-enabled yes
# 集群配置文件(自动生成,无需手动修改)
cluster-config-file nodes-7001.conf
# 集群节点超时时间(毫秒,超过该时间视为节点故障)
cluster-node-timeout 15000
# 数据存储目录
dir /var/redis/7001
# 日志文件路径
logfile /var/log/redis/7001.log
# 后台运行
daemonize yes
# 允许跨网段访问(如果集群节点在不同网段)
protected-mode no
# 开启 AOF 持久化(可选,根据需求配置)
appendonly yes
appendfilename "appendonly-7001.aof"
# 禁用 protected-mode(避免外部无法访问)
protected-mode no
将 7001.conf 复制到其他 5 个节点的配置文件路径,然后批量修改端口号、目录等关键信息:
# 复制配置文件
for port in {7002..7006}; do
cp /etc/redis/7001.conf /etc/redis/$port.conf
# 替换端口号
sed -i "s/7001/$port/g" /etc/redis/$port.conf
done
# 批量启动 6 个节点
for port in {7001..7006}; do
/usr/local/redis/bin/redis-server /etc/redis/$port.conf
done
ps -ef | grep redis-server | grep -v grep
正常情况下,会显示 6 个 redis-server 进程,分别对应 7001-7006 端口。
Redis 5.0+ 版本提供了 redis-cli --cluster 命令(原 redis-trib.rb 工具的替代方案),可快速创建集群。
/usr/local/redis/bin/redis-cli --cluster create \
127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 \
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
--cluster-replicas 1
--cluster-replicas 1:表示每个主节点对应 1 个从节点,6 个节点会自动分配为 3 主 3 从。执行命令后,会显示哈希槽分配方案(默认 3 个主节点平均分配 16384 个槽位),输入 yes 确认:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0-5460
Master[1] -> Slots 5461-10922
Master[2] -> Slots 10923-16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b 127.0.0.1:7001 slots:[0-5460] (5461 slots) master
M: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master
M: 2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master
S: 3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b 127.0.0.1:7004 replicates 0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b
S: 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b 127.0.0.1:7005 replicates 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
S: 5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b 127.0.0.1:7006 replicates 2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b
Can I set the above configuration? (type 'yes' to accept): yes
-c 表示启用集群模式)/usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 7001
127.0.0.1:7001> cluster info
# 正常输出如下(关键字段:cluster_state:ok 表示集群健康)
cluster_state:ok
class_slots_assigned:16384
class_slots_ok:16384
class_slots_pfail:0
class_slots_fail:0
class_known_nodes:6
class_size:3
class_current_epoch:6
class_my_epoch:1
class_stats_messages_ping_sent:102
class_stats_messages_pong_sent:98
class_stats_messages_meet_sent:3
class_stats_messages_sent:203
class_stats_messages_ping_received:93
class_stats_messages_pong_received:105
class_stats_messages_meet_received:0
class_stats_messages_received:198
127.0.0.1:7001> cluster nodes
# 输出所有节点信息,包含角色、槽位、复制关系等
至此,Linux 环境下 3 主 3 从 Redis Cluster 集群搭建完成!
新增两个节点(7007 主节点、7008 从节点),创建配置文件并启动:
# 复制配置文件并修改端口
cp /etc/redis/7001.conf /etc/redis/7007.conf
cp /etc/redis/7001.conf /etc/redis/7008.conf
sed -i "s/7001/7007/g" /etc/redis/7007.conf
sed -i "s/7001/7008/g" /etc/redis/7008.conf
# 启动新增节点
/usr/local/redis/bin/redis-server /etc/redis/7007.conf
/usr/local/redis/bin/redis-server /etc/redis/7008.conf
# 向集群中添加 7007 为主节点(连接任意已存在节点)
/usr/local/redis/bin/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
# 执行槽位迁移命令(进入交互模式)
/usr/local/redis/bin/redis-cli --cluster reshard 127.0.0.1:7001
交互步骤:
# 添加 7008 为 7007 的从节点
/usr/local/redis/bin/redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id 7007 节点 ID
将 7007 主节点的槽位迁移到其他主节点(步骤同扩容迁移,只是目标节点为其他主节点):
/usr/local/redis/bin/redis-cli --cluster reshard 127.0.0.1:7001
注意:必须将待移除主节点的所有槽位迁移完成,才能移除该节点。
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7008 7008 节点 ID
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7007 7007 节点 ID
# 停止 7007 和 7008 节点
/usr/local/redis/bin/redis-cli -p 7007 shutdown
/usr/local/redis/bin/redis-cli -p 7008 shutdown
cluster-node-timeout 为 30000(30 秒);解决:检查所有节点进程,关闭防火墙(或开放 7001-7006 端口):
# 关闭防火墙(CentOS)
systemctl stop firewalld
systemctl disable firewalld
-c 参数);-c 参数,如:redis-cli -c -h 127.0.0.1 -p 7001。cluster info),确保节点正常,重新执行迁移命令。本文详细讲解了 Redis Cluster 集群的核心原理(哈希槽分片、Gossip 协议、重定向机制),并结合 Linux 环境完成了 3 主 3 从集群的搭建实操,同时演示了集群扩容/缩容的完整流程。Redis Cluster 通过去中心化设计和灵活的分片机制,有效解决了单节点 Redis 的高可用和高并发问题,是生产环境中 Redis 集群的首选方案。
后续使用过程中,需重点关注集群状态、槽位分配和节点健康,避免因节点故障导致集群不可用。建议结合实际业务场景,合理规划集群节点数量和槽位分配,确保数据安全和服务稳定。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online