Redis 主从复制与哨兵模式
Redis 主从复制与哨兵模式一、主从复制是什么一台 Redis 当**主库Master负责写多台 Redis 当从库Slave**负责读。主库的数据会自动同步到从库。┌──────────┐ │ Master │ ← 写 └────┬─────┘ ┌────────┼────────┐ ▼ ▼ ▼ ┌──────┐ ┌──────┐ ┌──────┐ │Slave1│ │Slave2│ │Slave3│ ← 读 └──────┘ └──────┘ └──────┘能解决什么问题读写分离主库扛写从库扛读分担压力数据备份从库就是主库的实时备份主库挂了数据不丢高可用基础哨兵和集群都依赖主从复制同步过程重点分两个阶段阶段一全量同步首次连接从库连上主库说我要同步数据主库执行BGSAVE后台生成 RDB 快照文件主库把 RDB 文件发给从库从库清空自己的旧数据加载 RDB加载期间主库的新写命令先存到replication buffer里从库加载完 RDB 后主库把 buffer 里的命令发给从库执行追上进度阶段二增量同步日常运行全量同步完成后进入增量同步阶段主库每执行一条写命令就同步发给从库从库执行同样命令保持跟主库一致断线重连怎么办Redis 2.8 之前断了就重新全量同步太慢。Redis 2.8 之后引入repl_backlog_buffer环形缓冲区主库会把最近一段时间的写命令存在这个缓冲区里从库断线重连后告诉主库我上次同步到哪儿了offset如果 offset 还在缓冲区范围内主库只把差的那部分发给从库不用全量同步如果 offset 超出缓冲区断太久了就只能重新全量同步关键配置# 从库配置replicaof主库IP主库端口# 认主# 主库配置repl-backlog-size 1mb# 环形缓冲区大小越大越能容忍断线一句话总结主库写从库读。先全量快照再增量追日志。断线重连靠环形缓冲区尽量增量同步。二、哨兵模式Sentinel是什么哨兵是一个独立的进程监视 Redis 主从节点主库挂了就自动把某个从库升级为新主库。相当于给主从复制加了个自动漂移的能力。┌──────────────┐ │ Sentinel │ ← 盯着下面这群 Redis └──────┬───────┘ ┌───────────┼───────────┐ ▼ ▼ ▼ ┌──────┐ ┌────────┐ ┌────────┐ │Master│ │ Slave1 │ │ Slave2 │ └──────┘ └────────┘ └────────┘生产环境哨兵也要部署多个至少 3 个不然哨兵自己挂了就没人管了。能解决什么问题自动故障转移主库挂了自动切不用半夜起来手动切库服务发现客户端连哨兵问现在谁是主库不用硬编码地址核心流程三步第一步主观下线SDOWN每个哨兵定期 PING 主库。如果某个哨兵发现主库超时没回就自己判定它挂了——这叫主观下线。但此时还不能行动万一是这个哨兵自己网络有问题呢第二步客观下线ODOWN这个哨兵去问其他哨兵“你们也觉得主库挂了吗” 如果超过quorum法定人数个哨兵都认为挂了就判定为客观下线——这次是真的挂了开始故障转移。第三步故障转移哨兵们选出一个领头哨兵Raft 算法投票领头哨兵在所有健康的从库中按以下优先级选一个新主库优先级高的replica-priority配置数据最新的offset 最大的如果都一样选 runid 最小的领头哨兵对选中的从库执行SLAVEOF NO ONE它就成了新主库其他从库改为复制新主库旧主库如果恢复了自动变成新主库的从库关键配置# sentinel.confsentinel monitor mymaster127.0.0.163792# 监视主库最后那个 2 是 quorumsentinel down-after-milliseconds mymaster5000# 5 秒超时判定主观下线sentinel failover-timeout mymaster180000# 故障转移超时 3 分钟一句话总结哨兵盯着主从集群主库挂了就投票表决确认真挂后自动选个新主库客户端无感知。三、两者关系维度主从复制哨兵模式解决什么问题数据备份、读写分离自动故障转移能自动切主吗不能得手动能自动选举角色数据同步机制监控 切换机制依赖关系独立可用依赖主从复制作为基础简单说主从复制是跑车哨兵是自动驾驶系统。没有哨兵主从复制照样跑但翻了得手动扶有了哨兵翻了自动扶。