Redis 有三种集群方式:主从复制、哨兵模式和 Cluster 集群。
主从复制(Master-Slave)
原理
- Slave 连接 Master,发送 SYNC 命令
- Master 执行 BGSAVE 生成 RDB 快照,同时记录写命令到缓冲区
- Master 将快照发给 Slave,Slave 载入快照
- Master 将缓冲区中的写命令发给 Slave 执行
- 之后 Master 每执行一条写命令就同步给 Slave
优缺点
优点:支持读写分离,分担 Master 读压力,非阻塞同步
缺点:不具备自动故障转移;主从数据可能不一致;不支持在线扩容
Demo
cd /usr/local/redis && mkdir m-s-model && cd m-s-model
cp ../etc/redis.conf ./master.conf
cp ../etc/redis.conf ./slave.conf
# master.conf: port 6380
# slave.conf: port 6381 / slaveof 127.0.0.1 6380
redis-server ./master.conf
redis-server ./slave.conf
redis-cli -p 6380 info replication
哨兵模式(Sentinel)
在主从基础上增加自动故障转移。哨兵持续监控 Master/Slave,Master 宕机后自动将某个 Slave 升为新 Master。
工作方式
- 每秒向所有节点发送 PING
- 超时未响应则标记为主观下线(SDOWN)
- 足够数量的哨兵确认后标记为客观下线(ODOWN),触发故障转移
优缺点
优点:继承主从优点,自动切换
缺点:不支持在线扩容
Demo
cd /usr/local/redis && mkdir sentinel-model && cd sentinel-model
# 创建 4 个 redis.conf(1 master + 3 slave)和 2 个 sentinel.conf
# sentinel 配置关键内容:
# daemonize yes
# port 26379
# sentinel monitor mymaster 127.0.0.1 6382 1
redis-server ./redis01.conf # master: 6382
redis-server ./redis02.conf # slave: 6383
# ...
redis-sentinel ./sen01.conf
redis-sentinel ./sen02.conf
Redis Cluster
每个节点存储不同数据(分片),解决内存浪费问题。采用无中心结构,共 16384 个 hash slot。
工作方式
- key 通过 CRC16 算法映射到 0~16383 的 slot
- 每个主节点负责一段 slot,附带从节点实现高可用
- 主节点宕机由其从节点接管
Demo
cd /usr/local/redis && mkdir redis-cluster && cd redis-cluster
mkdir redis0{1..6}
# 每个目录复制一份 redis.conf,修改端口,并添加:
# cluster-enabled yes
# cluster-config-file nodes.conf
# cluster-node-timeout 15000
# 启动所有节点后,创建集群(3 master + 3 slave):
../bin/redis-cli --cluster create \
127.0.0.1:6386 127.0.0.1:6388 127.0.0.1:6390 \
127.0.0.1:6387 127.0.0.1:6389 127.0.0.1:6391 \
--cluster-replicas 1
# 连接并查看集群状态:
../bin/redis-cli -p 6386 -c
> CLUSTER NODES
节点管理
# 添加主节点
redis-cli --cluster add-node 127.0.0.1:6392 127.0.0.1:6386
# 添加从节点
redis-cli --cluster add-node 127.0.0.1:6392 127.0.0.1:6386 --cluster-slave
# 删除节点
redis-cli --cluster del-node 127.0.0.1:6386 <node-id>