8.4.3 Redis Cluster分片与高可用实践
Redis Cluster分片与高可用实践#
本节围绕 Redis Cluster 的分片机制、高可用与实操落地,给出架构草图、完整安装与部署流程、关键命令解释、排错与练习,确保可直接上手验证。
原理与架构草图(哈希槽+主从故障切换)
安装与目录规划(6节点本机演示)
# 1) 安装 Redis
sudo yum install -y redis
# 或编译安装
# tar -xf redis-7.x.tar.gz && cd redis-7.x && make && sudo make install
# 2) 规划目录
sudo mkdir -p /data/redis/{7000,7001,7002,7003,7004,7005}
配置示例(每个端口一份配置)
以 7000 为例,其余节点修改 port 与 dir:
# /etc/redis/redis-7000.conf
port 7000
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis_7000.log
dir /data/redis/7000
# Cluster 关键参数
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
# AOF建议开启
appendonly yes
启动 6 个节点
redis-server /etc/redis/redis-7000.conf
redis-server /etc/redis/redis-7001.conf
redis-server /etc/redis/redis-7002.conf
redis-server /etc/redis/redis-7003.conf
redis-server /etc/redis/redis-7004.conf
redis-server /etc/redis/redis-7005.conf
创建集群(3主3从)
# 3主3从,自动分配槽
redis-cli --cluster create \
127.0.0.1:7000 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 \
--cluster-replicas 1
# 预期输出包含:
# [OK] All 16384 slots covered.
关键命令与解释
# 查看集群状态
redis-cli -p 7000 cluster info
# cluster_state:ok 说明集群健康
# 查看槽位分布
redis-cli -p 7000 cluster slots
# 查看节点角色与关系
redis-cli -p 7000 cluster nodes
# 连接测试(-c 支持重定向)
redis-cli -c -p 7000
> set user:1 alice
> get user:1
分片路由示例(MOVED/ASK 解释)
# 未使用 -c 的客户端可能收到 MOVED
redis-cli -p 7000 set order:1001 x
# (error) MOVED 1234 127.0.0.1:7002
# 说明 key 对应槽在 7002,客户端需更新路由
# ASK 通常在 reshard 迁移中出现,需先 ASKING 再写入
redis-cli -p 7000
> ASKING
> set order:1001 x
扩容与槽迁移(示例)
# 新增一主一从
redis-server /etc/redis/redis-7006.conf
redis-server /etc/redis/redis-7007.conf
# 加入集群
redis-cli -p 7000 cluster meet 127.0.0.1 7006
redis-cli -p 7000 cluster meet 127.0.0.1 7007
# 让 7007 成为 7006 从节点
redis-cli -p 7007 cluster replicate $(redis-cli -p 7006 cluster myid)
# 迁移槽位到新主 7006
redis-cli --cluster reshard 127.0.0.1:7000
# 交互中输入迁移槽数、目标节点ID、源节点ID
缩容示例
# 1) 先把 7006 的槽迁出
redis-cli --cluster reshard 127.0.0.1:7000
# 2) 忘记节点
redis-cli -p 7000 cluster forget <node-id-7006>
redis-cli -p 7000 cluster forget <node-id-7007>
高可用与故障切换验证
# 模拟主节点 7000 故障
redis-cli -p 7000 shutdown
# 观察 7003 是否晋升
redis-cli -p 7003 info replication
# role:master 表示晋升成功
# 恢复 7000 后会成为从节点(默认)
redis-server /etc/redis/redis-7000.conf
排错指南(含命令)
- 集群状态 fail:
redis-cli -p 7000 cluster info | grep cluster_state
# 若 fail,检查是否缺少槽或多数派失效
redis-cli -p 7000 cluster slots
# 若未覆盖 16384 槽,需 reshard 补齐
- 节点频繁下线:
# 查看网络与超时
grep "cluster-node-timeout" /etc/redis/redis-7000.conf
# 适当增大超时,如 5000 -> 10000
# 检查系统负载
top -p $(cat /var/run/redis_7000.pid)
- 重定向过多:
# 客户端需启用集群模式或更新路由缓存
# redis-cli -c -p 7000
监控与运维指标
redis-cli -p 7000 info | egrep "cluster_state|connected_slaves|instantaneous_ops_per_sec"
redis-cli -p 7000 info replication | egrep "master_repl_offset|slave_repl_offset"
练习
1. 在本机或 3 台主机部署 3主3从集群,记录 cluster slots 输出与主从关系图。
2. 执行一次 reshard,观察 MOVED/ASK 的触发并解释原因。
3. 手动关闭一个主节点,验证从节点晋升及业务读写连续性。