Redis Master and Slave
Redis Master and Slave
Redis Master and Slave
- 主从模式优势
- 防止单点故障
- 提高读并发性能
slaveof
- slaveof no one 成为master
- slaveof host port 成为master(host:port)的slave
- 一个slave只能有一个master, 一个master可以有多个slave
- slave节点也可以是别的节点的master
- 通过哨兵机制(Sentinel)进行主从切换
主从复制
- 主从读写分离
- master节点可以进行读写, 并且将写操作同步给slave节点
- slave一般是只读的, 接受主服务器同步过来写操作命令, 然后执行这条命令
同步过程
- psync {runid} {offset}
- 第一次同步 (全量同步)
- 命令传播
- 增量同步
全量同步
- 场景
- 第一次同步
- psync ? -1
- slave重连
- slave可能因网络问题等, 断开连接后重连回来, 此时进度落下太多, 已经在repl_backlog_buf中失效
- 第一次同步
- 过程
- master生成rdb快照(fork()一个子进程进行bgsave)
- slave等待rdb快照生成
- master生成rdb完成后, 将rdb传输给slave
- slave清空当前数据, 载入rdb快照
- 在rdb生成、传输、载入过程中, 可能会有新的写命令, 这些命令是无法被快照的
- 将这些命令写入replication buf中
- master将buf中这些新命令发给slave
- slave执行新命令
- master生成rdb快照(fork()一个子进程进行bgsave)
命令传播
- 完成第一次同步后, master和slave之间维护tcp长连接
- 后续master接收到的新写入命令通过tcp传播
增量同步
- slave短暂掉线后重连
- psync {runid} {offset}
- master会维护repl_backlog_buf这个环形缓冲区
- 同步命令时, master会将命令也写到repl_backlog_buf中
- 通过slave发送的psync中的offset, 可以知道现在slave落后的进度
- 将落后的部分写入replication buf中, 进行命令传播
This post is licensed under CC BY 4.0 by the author.