Redis 多机数据库的实现--复制

介绍

主从复制,可以通过 SLAVEOF 命令或 slaveof 选项设置主从服务器。

旧版复制功能的实现

  • 同步
  • 命令传播

同步

命令传播

完成同步操作后,后续的写操作同步命令传播的方式同步给从服务器。

旧版复制功能的缺陷

同步操作会在两种情况下执行:

  • 初次复制
  • 断线后复制

断线后复制也需要主服务器同步一个完整的 RDB 文件给从服务器,而不是断线期间的命令。这个过程会浪费主服务器的 CPU、内存、磁盘和网络,也会导致从服务器在载入的过程中不能相应命令请求,整个过程非常耗费资源。

新版复制功能的实现

支持完整同步和部分重同步。

部分重同步的实现

复制偏移量

主从服务器都有一个复制偏移量,主服务器发送之后更新偏移量,从服务器接受到之后更新偏移量。

复制积压缓冲区

有主服务器维护的一个固定长度先进先出队列,默认大小 1MB。写命令会同时写入缓冲区,当从服务器发出带有复制偏移量的 PSYNC 命令后,如果偏移量在缓冲区中就部分重同步,如果不在,就执行完整同步。

复制积压缓冲区大小 = second * write_size_per_second

服务器运行 ID

每个服务器都有一个 ID,为了区分是首次复制还是断线复制。

PSYNC 命令的实现

复制的实现

  1. 设置主服务器的地址和端口
  2. 建立套接字连接
  3. 发送 PING 命令
  4. 身份验证
  5. 发送端口信息
  6. 发送 PSYNC 命令执行同步,之后主服务器也成为从服务器的客户端
  7. 命令传播

心跳检测

  • 检测主从服务器的网络连接状态
  • 辅助实现 min-slaves 配置选项
  • 检测命令丢失
-------------本文结束感谢您的阅读-------------

本文标题:Redis 多机数据库的实现--复制

文章作者:

发布时间:2019年11月26日 - 00:11

最后更新:2021年12月10日 - 13:12

原始链接:http://huihui.couplecoders.tech/2019/JH85R7/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。