一、架构设计原理
- 分布式数据分片
哈希槽机制:Redis Cluster 将数据划分为 16384 个槽位,每个主节点负责部分槽位(如主节点1管理槽0-5460,主节点2管理5461-10922等)。
自动负载均衡:数据按哈希值分配到不同节点,避免单点性能瓶颈。
高可用基础:每个主节点配置至少一个从节点,主节点故障时自动切换从节点接替。 - 故障转移流程
哨兵协同:3个哨兵节点通过投票机制(quorum=2)决策主节点状态。
状态检测:哨兵每隔1秒向主节点发送PING,若5秒内无响应标记为主观下线,超过半数哨兵确认则触发客观下线。
选举新主:优先选择数据同步最完整的从节点晋升为新主。
二、部署实施步骤 - 节点规划
角色 IP地址 端口 说明
主节点1 10.0.1.10 6379 管理槽位0-5460
主节点2 10.0.1.11 6379 管理槽位5461-10922
主节点3 10.0.1.12 6379 管理槽位10923-16383
从节点1 10.0.1.20 6379 复制主节点1数据
从节点2 10.0.1.21 6379 复制主节点2数据
从节点3 10.0.1.22 6379 复制主节点3数据
哨兵节点 10.0.1.30-32 26379 监控所有主节点状态 - 配置文件核心参数
主从节点配置:
plaintext
Copy Code
cluster-enabled yes # 启用集群模式
cluster-node-timeout 5000 # 节点超时时间(毫秒)
requirepass maple168 # 访问密码
masterauth maple168 # 主从同步密码
哨兵节点配置:
plaintext
Copy Code
sentinel monitor master1 10.0.1.10 6379 2
sentinel auth-pass master1 maple168
sentinel down-after-milliseconds master1 5000
- 集群初始化命令
bash
Copy Code
在所有节点启动Redis服务
redis-server /etc/redis/redis.conf
使用redis-cli工具创建集群
redis-cli -a maple168 --cluster create
10.0.1.10:6379 10.0.1.11:6379 10.0.1.12:6379
10.0.1.20:6379 10.0.1.21:6379 10.0.1.22:6379
–cluster-replicas 1
注:–cluster-replicas 1表示每个主节点分配1个从节点
三、关键验证操作
- 集群状态检查
bash
Copy Code
查看槽位分配与节点角色
redis-cli -a maple168 --cluster check 10.0.1.10:6379
输出示例:
M: 10.0.1.10:6379 (主节点) slots:[0-5460]
S: 10.0.1.20:6379 (从节点) replicates 10.0.1.10
- 数据路由测试
bash
Copy Code
写入数据观察自动路由
redis-cli -a maple168 -c -h 10.0.1.10 set user:1001 “data”
返回响应:-> Redirected to slot [9842] located at 10.0.1.11:6379
跨节点读取验证
redis-cli -a maple168 -c -h 10.0.1.12 get user:1001
- 故障模拟恢复
手动关闭主节点1:
bash
Copy Code
redis-cli -a maple168 -h 10.0.1.10 shutdown
观察哨兵日志:
log
Copy Code
+sdown master master1 10.0.1.10:6379 # 主观下线
+odown master master1 10.0.1.10:6379 # 客观下线
+vote-for-leader 哨兵ID # 选举新主
+failover-end master1 10.0.1.20:6379 # 从节点1晋升
验证新主节点:
bash
Copy Code
redis-cli -a maple168 -h 10.0.1.20 info replication | grep role
预期输出:role:master
四、运维优化建议
- 网络层面
带宽保障:主从节点间建议使用万兆内网,减少同步延迟。
端口开放:
主从通信:TCP 6379
集群总线:TCP 16379(端口=6379+10000)
哨兵通信:TCP 26379 - 内存与持久化
内存限制:配置maxmemory 16gb(根据物理内存80%设置),防止OOM。
持久化策略:
主节点关闭AOF(appendonly no),避免写放大。
从节点开启AOF(appendonly yes),追加写入保障数据安全。 - 监控告警
指标采集:
内存使用率(used_memory)
键空间命中率(keyspace_hits/keyspace_misses)
主从延迟(master_repl_offset与slave_repl_offset差值)
推荐工具:Prometheus + Redis Exporter + Grafana 可视化仪表盘。
五、典型故障处理 - 脑裂问题(Split-Brain)
现象:网络分区导致多个主节点同时写入。
解决方案:
设置min-replicas-to-write 1,主节点需至少1个从节点在线才允许写入。
配置cluster-require-full-coverage no,部分槽位不可用时仍提供服务。 - 数据同步延迟
排查步骤:
检查主从节点网络带宽(iftop或nload)。
查看repl_backlog_size是否过小(建议≥512MB)。
检查从节点是否执行耗时命令(如KEYS *阻塞进程)。 - 节点无法加入集群
常见原因:
防火墙拦截集群总线端口(16379)。
密码不一致(requirepass与masterauth需完全相同)。
节点时间不同步(需配置NTP服务)。
通过以上方案,可实现具备自动分片、故障秒级切换的 Redis 三主三从生产级集群,支撑高并发读写与数据高可用需求。