Redis 有三种集群方式:主从复制、哨兵模式和 Cluster 集群。

主从复制(Master-Slave)

原理

  1. Slave 连接 Master,发送 SYNC 命令
  2. Master 执行 BGSAVE 生成 RDB 快照,同时记录写命令到缓冲区
  3. Master 将快照发给 Slave,Slave 载入快照
  4. Master 将缓冲区中的写命令发给 Slave 执行
  5. 之后 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>

参考