Post

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和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.