单机 6 节点打造Redis Cluster(3主3从)——从零到可用与踩坑速修
文章目录
- 1. 集群结构
- 2. 准备目录与配置
- 3. 启动所有实例
- 4. 打开防火墙端口
- 5. 创建集群
- 6. 测试
- 槽位机制
- 正确的做法
- 8. 查看集群节点信息
- 节点分布表
- 9. 总结
在前面我们已经体验了主从和 Sentinel,这次我们更进一步,手把手搭建一个 Redis 分片集群(Cluster)。
Redis Cluster 可以自动完成数据分片与高可用,本篇演示如何在一台服务器上用 6 个实例模拟 3 主 3 从的集群。
1. 集群结构
我们在同一台服务器 156.238.xxx.xxx
上,开启 6 个 Redis 实例:
IP | PORT | 角色 |
---|---|---|
156.238.xxx.xxx | 7001 | master |
156.238.xxx.xxx | 7002 | master |
156.238.xxx.xxx | 7003 | master |
156.238.xxx.xxx | 8001 | slave |
156.238.xxx.xxx | 8002 | slave |
156.238.xxx.xxx | 8003 | slave |
最终形成一个最小可用的分片集群,每个 master 节点都有一个对应的 slave 节点。
2. 准备目录与配置
进入工作目录 /www/server
,准备 6 个实例目录:
cd /www/server
mkdir 7001 7002 7003 8001 8002 8003
新建一个模板配置 redis.conf
,内容如下:
port 6379
cluster-enabled yes
cluster-config-file /www/server/6379/nodes.conf
cluster-node-timeout 5000
dir /www/server/6379
bind 0.0.0.0
daemonize yes
replica-announce-ip 156.238.xxx.xxx
protected-mode no
databases 1
logfile /www/server/6379/run.log# 统一密码
requirepass 1111
masterauth 1111
将模板拷贝到各个实例目录:
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
批量修改端口号和目录:
printf '%s\n' 7001 7002 7003 8001 8002 8003 \| xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
这样每个实例都有自己的配置文件。
3. 启动所有实例
执行批量启动命令:
printf '%s\n' 7001 7002 7003 8001 8002 8003 \| xargs -I{} -t /www/server/redis/src/redis-server {}/redis.conf
确认进程:
ps -ef | grep redis
如果需要关闭所有实例,可以用:
printf '%s\n' 7001 7002 7003 8001 8002 8003 \| xargs -I{} -t /www/server/redis/src/redis-cli -a 1111 -p {} shutdown
4. 打开防火墙端口
Redis Cluster 不仅需要普通服务端口(7001–7003, 8001–8003),还需要额外的 集群总线端口(端口号 = 服务端口 + 10000,例如 17001–17003, 18001–18003)。
如果这些端口没有放行,节点之间无法通信,redis-cli --cluster create
会卡住,如下图。
由于我使用的是宝塔面板,所以我在直接在宝塔界面将端口放开了
5. 创建集群
Redis 5.0+ 已经内置了集群管理命令,可以直接用 redis-cli
来完成。执行以下命令:
redis-cli -a 1111 --cluster create --cluster-replicas 1 156.238.xxx.xxx:7001 156.238.xxx.xxx:7002 156.238.xxx.xxx:7003 156.238.xxx.xxx:8001 156.238.xxx.xxx:8002 156.238.xxx.xxx:8003
命令说明:
--cluster create
:创建集群。--cluster-replicas 1
:每个 master 节点分配一个 slave 节点。- 前 3 个节点作为 master,后 3 个自动挂到不同的 master 作为 slave。
执行过程中输入 yes
确认,最终提示 [OK]
表示集群创建成功。
6. 测试
尝试连接 7001 节点,存储一个数据:
# 连接
redis-cli -a 1111 -p 7001
# 存储数据
set num 520
# 读取数据
get num
# 再次存储
set a 1
结果发现 num
正常写入,但 a
却报错了:
槽位机制
在 Redis Cluster 中,所有 key 都会通过 CRC16 算法计算出一个值,再对 16384 取模,得到一个槽位号(slot)。
集群会把 16384 个槽平均分配给不同的 master 节点。
num
这个 key 的槽位是2765
,刚好属于 7001 节点负责的区间,所以可以直接写入。a
这个 key 的槽位是15495
,分配给了 7003 节点,因此 7001 会返回MOVED
错误,告诉客户端去 7003 存储。
我们可以用命令直接查看槽位号:
redis-cli -a 1111 -p 7001 cluster keyslot num
redis-cli -a 1111 -p 7001 cluster keyslot a
输出示例:
(integer) 2765
(integer) 15495
再配合 cluster nodes
就能看到每个槽位段由哪个 master 节点负责。
正确的做法
集群模式下,必须带上 -c
参数,让 redis-cli
自动跟随槽位跳转:
redis-cli -c -a 1111 -p 7001
这次 set a 1
就能自动重定向到 7003 节点:
8. 查看集群节点信息
集群创建完成后,可以通过以下命令查看拓扑:
redis-cli -a 1111 -p 7001 cluster nodes
示例输出:
节点分布表
节点 | 角色 | 槽位范围 | 关联关系 |
---|---|---|---|
7001 | master | 0–5460 | 有从节点 8001 |
7002 | master | 5461–10922 | 有从节点 8002 |
7003 | master | 10923–16383 | 有从节点 8003 |
8001 | slave | - | 复制 7001 |
8002 | slave | - | 复制 7002 |
8003 | slave | - | 复制 7003 |
9. 总结
- 我们在单机上运行了 6 个实例,组成了一个最小可用的 Redis Cluster。
- 创建集群前必须放行 服务端口 和 总线端口,否则会卡在创建命令。
- 通过
redis-cli --cluster create
一键完成槽位分配与主从关系配置。 - 集群模式下要用
redis-cli -c
才能正确跟随槽位进行读写。 - 槽位是集群分片的核心机制,每个 key 会通过哈希计算映射到某个槽位,从而决定存在哪个节点。
- 最终集群的节点分布如下:
Master | Slot 范围 | 对应 Slave |
---|---|---|
7001 | 0–5460 | 8001 |
7002 | 5461–10922 | 8002 |
7003 | 10923–16383 | 8003 |