Redis 主从复制

97 阅读2分钟

主从复制模式

Redis提供了主从复制模式,使用读写分离,主节点负责读写,从节点负责读,主节点会将数据实时同步给从节点。

缺点:

  • 当主节点宕机了,需要手动切换主节点
  • 主节点写操作可能成为性能瓶颈
  • 没有数据分片,存储大小受到单台机器内存大小限制

主从复制的过程

  1. 从节点向主节点发起数据同步请求,传递参数runId和offset
  2. 主节点回复从节点可以同步 FULLRESYNC
  3. 主节点执行bgsave生成RDB文件,并把RDB文件发送给从节点
  4. 从节点清除自己的数据,加载主节点的RDB文件
  5. 主节点将生成RDB文件期间执行的写命令存到 replication buffer,并把发送给从节点
  6. 从节点执行主节点发来的写命令
  7. 主从同步完成,后续的写命令存到 replication buffer,并发送给从节点执行

runId 是主节点的唯一ID,首次请求从节点不知道这个ID,因此是。offset是从节点的数据同步进度,首次是0。offset 参数的作用是,当从节点连接断开并重连后,可以知道同步进度来增量同步,而不是全量同步。runId的作用是,当主节点切换后,新的主节点可能和旧主节点数据不一致,从节点需要重新全量同步一次,当从节点传递的旧runId 和新runId 不匹配,就可以判断出主节点切换了,需要全量同步

分摊主节点压力

可以使用 主-从-从 的模式来减轻主节点的同步压力,中间的从节点也是主节点。

repl_backlog_buffer

  • repl_backlog_buffer 主节点的一个环形缓冲区,当主从节点断连后,可以从中找到其中的差异
  • master_repl_offset 主节点中记录repl_backlog_buffer缓冲区的写入进度
  • slave_repl_offset 从节点中记录的同步进度

网络断开重连后,可以通过master_repl_offset和slave_repl_offset找到其中的数据差异:

  • 如果差异数据还在repl_backlog_buffer中,就增量同步 (master_repl_offset - slave_repl_offset <= repl_backlog_buffer缓冲区大小)
  • 如果差异数据不在repl_backlog_buffer中,就全量同步 (master_repl_offset - slave_repl_offset > repl_backlog_buffer缓冲区大小)