主从架构很常见,一主一从。有时候也会有主备架构,一主一备。要看业务场景选择。

复制

成为从服务器:slaveof 127.0.0.1 6379

旧版复制功能实现:

  • 同步操作,将从服务器的数据库状态更新至主服务器当前所在数据库状态
  • 命令传播操作,主服务器数据库状态被修改,主从不一致时重新回到一致状态

同步操作

旧版缺点:断线后重复复制,需要重头开始复制,效率非常低。

新版复制功能实现(从2.8版本开始):

  • 使用psync命令代替sync命令执行同步操作,psync有完整重同步和部分同步模式
    • 完整同步,跟sync命令的执行步骤基本一样,主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步
    • 部分重同步,断开出开始写。

部分重同步的实现

部分重同步功能由三部分构成:

  • 主从服务器偏移量
  • 主服务器的复制积压缓冲区
  • 服务器的运行ID

复制偏移量:主从服务器各自维护一个偏移量,主发送一波就记录自己偏移量,从收到就更新自己的偏移量

复制积压缓冲区:由主服务器维护的一个固定长度先进先出队列,默认大小为1MB;当主服务器进行命令传播时,不仅发送给所有从服务器,还要写入命令入队到复制积压缓冲区,如果从的偏移量在缓冲区则部分同步,否则完整同步。

服务器ID:每个服务器都有id,保证可以区分不同服务器

PSYNC命令执行情况:

命令操作

命令传播,从服务器会以每秒一次的频率,向主服务器发送命令:replcconf ack <从服务器偏移量>,作用如下:

  • 检测主服务器的网络连接状态
  • 辅助实现min-slaves选项
  • 检测命令丢失

更多源码注释说明见https://github.com/dalaizhao/redis/tree/feature_code_comment