Redis Cluster 手动部署
一、我们要做什么?
在一台机器上(192.168.166.9)跑 6 个 Redis 实例:
-
3 个 Master(主节点):6379、6381、6383
-
3 个 Slave(从节点):6380、6382、6384
最终形成一个 3 主 3 从 的 Redis 集群。
二、准备工作(傻瓜式操作)
1. 先搞一个模板配置文件
-
把原来的
/etc/redis.conf复制到/etc/redis/6379.conf -
这个文件里配置了端口、日志、数据目录等基本参数
2. 一键生成 6 个配置文件
bash
for i in {6380..6384}; do cp 6379.conf $i.conf; done
3. 批量改配置(用循环搞定)
| 配置项 | 改成什么 |
|---|---|
| 端口 | 6379 → 6380、6381... |
| 数据目录 | /var/lib/redis/6379 → 各自端口 |
| 日志文件 | /var/log/redis/6379.log → 各自端口 |
| PID 文件 | /var/run/redis/6379.pid → 各自端口 |
| 保护模式 | yes → no |
| 后台运行 | no → yes |
| 监听地址 | 127.0.0.1 → 192.168.166.9 |
4. 加上集群配置(每个配置文件末尾追加)
text
cluster-enabled yes
cluster-config-file nodes-端口.conf
cluster-node-timeout 15000
这三行意思是:开启集群模式、保存集群状态的文件、节点超时时间 15 秒。
三、启动所有实例
bash
for i in {6379..6384}; do redis-server /etc/redis/$i.conf; done
一条命令把 6 个 Redis 都跑起来。
四、组成集群(手动搓)
1. 让所有节点互相认识
bash
for i in {6380..6384}; do redis-cli -h 192.168.166.9 -p 6379 cluster meet 192.168.166.9 $i; done
相当于:6379 这个老大哥,去跟其他 5 个兄弟打个招呼,大家以后是一家人。
2. 分配槽位(16384 个槽,平均分给 3 个 Master)
| 节点 | 槽位范围 | 槽数量 |
|---|---|---|
| 6379 | 0 ~ 5461 | 5462 |
| 6381 | 5462 ~ 10922 | 5461 |
| 6383 | 10923 ~ 16383 | 5461 |
bash
redis-cli -h 192.168.166.9 -p 6379 cluster addslots {0..5461}
redis-cli -h 192.168.166.9 -p 6381 cluster addslots {5462..10922}
redis-cli -h 192.168.166.9 -p 6383 cluster addslots {10923..16383}
槽 = 货架编号,每个 Master 管自己的一排货架。
3. 建立主从关系(谁是谁的备胎)
先查 Master 的 ID:
bash
redis-cli -h 192.168.166.9 -p 6379 cluster nodes
然后把 Slave 挂到对应的 Master 上:
bash
# 6380 给 6379 当备胎
redis-cli -h 192.168.166.9 -p 6380 cluster replicate <6379的ID>
# 6382 给 6381 当备胎
redis-cli -h 192.168.166.9 -p 6382 cluster replicate <6381的ID>
# 6384 给 6383 当备胎
redis-cli -h 192.168.166.9 -p 6384 cluster replicate <6383的ID>
五、验证集群
bash
redis-cli -h 192.168.166.9 -p 6379 cluster nodes
redis-cli -h 192.168.166.9 -p 6379 cluster info
能看到每个节点的角色(master/slave)和负责的槽位范围,就说明成功了。
六、故障恢复(自动的)
模拟故障
bash
kill -9 <某个master的进程ID>
自动发生的事
-
集群检测到该 Master 挂了
-
它的 Slave 自动升级成新 Master
-
集群继续正常工作
恢复后
-
原来的 Master 重启后,会自动变成新 Master 的 Slave(备胎)
-
不需要手动干预
七、常用命令速查表(大白话版)
| 命令 | 大白话解释 |
|---|---|
cluster meet IP 端口 |
把某个节点拉进群 |
cluster nodes |
看看群里都有谁,谁是什么角色 |
cluster addslots 槽位 |
把一批槽分给当前节点 |
cluster replicate 节点ID |
让当前节点给指定节点当备胎 |
cluster info |
看看集群整体状态好不好 |
cluster failover |
手动让备胎上位(强制切换) |
cluster keyslot key |
看这个 key 属于哪个槽 |
cluster forget 节点ID |
把某个节点踢出群 |
八、核心注意点(避坑指南)
| 坑 | 解决办法 |
|---|---|
| 启动 Redis 不用绝对路径 | 必须用绝对路径,否则 nodes.conf 会乱 |
| 保护模式没关 | 必须设置 protected-mode no |
| 监听 127.0.0.1 | 改成真实 IP,否则其他节点连不上 |
| 槽位没分完 | 16384 个槽必须全部分配,集群才能用 |
| 主节点没有从节点 | 每个 Master 最好配一个 Slave,否则挂了就丢数据 |
九、总结一句话
手动搭 Redis Cluster = 配 6 个配置文件 → 启动 → 互相认识 → 分槽位 → 定主从 ,最后得到一个能自动故障转移的 3 主 3 从集群。