多机数据库的实现----------01复制(主从服务器)

redis的复制功能包括:同步和命令传播

  • 同步:是将从服务器的数据库状态更新与主服务器当前所处的数据库状态
  • 命令传播:当主服务器的数据库状态被修改,导致主从不一致,让主从重新一致

同步:

当客户端向服务器发送slaveof命令,(假设现在有127.0.0.1:12345和127.0.0.1:6379两个服务器)

127.0.0.1:12345>SLAVEOF 127.0.0.1 6379

OK

则127.0.0.1:12345变成127.0.0.1 6379的从服务器

具体步骤:(同步操作需要向主服务器发送SYNC命令(旧版同步)

  1. 从服务器向主服务器发送SYNC命令
  2. 收到后主服务器执行BGSAVE命令,在后台生成RDB文件,并用缓冲区记录从现在开始的所有写命令
  3. 当主服务器BGSAVE命令执行完毕后,将RDB文件发送给从服务器,从服务器载入这个RDB文件
  4. 主服务器将记录再缓冲区的所有命令发送从服务器,从服务器执行这些命令更新自己

旧版同步命令有个缺陷:

当从服务器断线重启后,即便只有大部分相同,也会从头到尾再同步一次

新版复制(PSYNC):

PSYNC:具有完整同和部分同步:

完整同步:发生在第一次同步

部分同步:发生在断线重连

部分重同步的实现:

1.主服务器和从服务器的复制偏移量

2.主服务器的复制积压缓冲区

3.服务器的运行ID

复制偏移量:

主服务器每次发送后(假设当前未10086+33=10109(33为本次发送后增加的量)),更新自己的复制偏移量,若从服务器正常更新后复制偏移量应该也为10109,若挂了,则为上次的10086

复制积压缓冲区:

复制积压缓冲区是服务器维护的一个固定长度的先进先出的队列,默认大小为1mb,因此每次存储的都是最新的1mb数据

多机数据库的实现----------01复制(主从服务器)_第1张图片

当从服务器连上主服务器后,PSYNC命令会发送自己的复制偏移量offset给主服务器,主服务器根据这个进行何种同步操作

1.若复制偏移量任然存在于复制积压缓冲区,则部分同步

2.若已有部分不存在,则完整同步

多机数据库的实现----------01复制(主从服务器)_第2张图片

服务器运行ID

每个服务器都有自己的ID,主服务器通过保存从服务器的ID,判断连接的从服务器是否自己的从服务器,如果不是,直接完整同步

心跳检测,默认从服务器每秒一个桑主服务器发送命令

  1. 检测主从服务器的网络连接状态:默认0~1秒,若超过则说明主从故障
  2. 辅助实现min-slaves配置选项(min-slavers-to-write 3和min-slaves-max-lag 10),当从服务器数量少于3个或延迟大于等于10秒,主服务器拒绝执行写命令
  3. 检测命令丢失,主服务器发送复制偏移量给从服务器,检测是否丢失

 

你可能感兴趣的:(redis设计与实现)