一、我们要做什么?
在一台机器上(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 个配置文件
for i in {6380..6384}; do cp 6379.conf $i.conf; done3. 批量改配置(用循环搞定)
| 配置项 | 改成什么 |
|---|---|
| 端口 | 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. 加上集群配置(每个配置文件末尾追加)
cluster-enabled yes cluster-config-file nodes-端口.conf cluster-node-timeout 15000
这三行意思是:开启集群模式、保存集群状态的文件、节点超时时间 15 秒。
三、启动所有实例
for i in {6379..6384}; do redis-server /etc/redis/$i.conf; done一条命令把 6 个 redis 都跑起来。
四、组成集群(手动搓)
1. 让所有节点互相认识
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 |
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:
redis-cli -h 192.168.166.9 -p 6379 cluster nodes
然后把 slave 挂到对应的 master 上:
# 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>
五、验证集群
redis-cli -h 192.168.166.9 -p 6379 cluster nodes redis-cli -h 192.168.166.9 -p 6379 cluster info
能看到每个节点的角色(master/slave)和负责的槽位范围,就说明成功了。
六、故障恢复(自动的)
模拟故障
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 从集群。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论