Skip to content

9. 主从复制

9.1 主从配置

🏗️ 比喻:主从复制就像「总部 + 分部」——总部(Master)负责写入,分部(Slave)负责读取,数据从总部同步到分部。

bash
# 从节点配置(redis.conf)
replicaof 192.168.1.100 6379    # 指定主节点 IP 和端口
masterauth your_master_password  # 主节点密码

# 或运行时配置
REPLICAOF 192.168.1.100 6379

# 查看复制信息
INFO replication
bash
# Replication
role:slave
master_host:192.168.1.100
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:123456
slave_repl_offset:123456

9.2 复制原理

  1. 全量同步:从节点首次连接主节点时,主节点生成 RDB 快照发送给从节点
  2. 增量同步:全量同步完成后,主节点将新的写命令实时发送给从节点
  3. 断线重连:Redis 2.8+ 支持部分重同步(PSYNC),通过repl_backlog补发断线期间的增量数据

📝 备注: 生产建议:主节点也应配置合适的持久化策略,至少保留 AOF 或定期 RDB。不要简单把持久化完全交给从节点;如果主节点无持久化重启为空数据集,从节点可能同步到空数据,造成数据丢失。

9.3 哨兵(Sentinel)—— 自动故障转移

🛡️ 比喻:Sentinel 就像「值班保安」,时刻监视主节点健康状态。如果主节点挂了,哨兵们会投票选出新的主节点,自动切换。

bash
# sentinel.conf 配置
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster your_password
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
bash
# 启动哨兵(至少 3 个节点)
redis-sentinel /etc/redis/sentinel.conf

# 查看主节点信息
redis-cli -p 26379 SENTINEL master mymaster

# 查看从节点信息
redis-cli -p 26379 SENTINEL replicas mymaster

# 手动故障转移
redis-cli -p 26379 SENTINEL failover mymaster
bash
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.1.100"
5) "port"
6) "6379"
7) "runid"
8) "abc123def456"
9) "flags"
10) "master"
11) "num-slaves"
12) "2"
13) "num-other-sentinels"
14) "2"

💡 提示: 哨兵节点建议部署奇数个(至少 3 个),且分布在不同机器上,避免脑裂问题。