redis(11)——主从复制的原理

来源:互联网 发布:ncut算法代码 编辑:程序博客网 时间:2024/05/17 15:21

        在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器( master ),而对主服务器进行复制的服务器则被称为从服务器( slave )

        2.8版本之前与之后版本的主从复制的功能实现方法不同。主要掌握新版本的复制功能

一、新版复制功能的实现

        从服务器对主服务器的同步操作需要通过向主服务器发送PSYNC命令来完成,PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partialresynchronization)两种模式:

        完整重同步用于处理初次复制情况:通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。

部分重同步则用于处理断线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。

二、部分重同步的实现

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

       主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。

       主服务器的复制积压缓冲区(replication backlog )

       服务器的运行ID ( run ID)。

1、复制偏移量

        执行复制的双方——主服务器和从服务器会分别维护一个复制偏移量:主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N。从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值加上N。

        通过对比主从服务器的复制偏移量,程序可以很容易地知道主从服务器是否处于一致状态

 

2、复制积压缓冲区   

        复制积压缓冲区是由主服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。

        当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令入队到复制积压缓冲区里面。

  

        当从服务器重新连上主服务器时,从服务器会通过PSYNC命令将自己的复制偏移量offset发送给主服务器,主服务器会根据这个复制偏移量来决定对从服务器执行何种同步操作:

        如果offse七偏移量之后的数据(也即是偏移量offset+1开始的数据)仍然存在于复制积压缓冲区里面,那么主服务器将对从服务器执行部分重同步操作)

        相反,如果offset偏移量之后的数据已经不存在于复制积压缓冲区,那么主服务器将对从服务器执行完整重同步操作。

3、服务器运行ID

        每个Redis服务器,不论主服务器还是从服务,都会有自己的运行ID。

        运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成。

        当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,而从服务器则会将这个运行ID保存起来。

        当从服务器断线并重新连上一个主服务器时,从服务器将向当前连接的主服务器发送之前保存的运行ID。

三、PSYNC命令的实现


四、复制的实现步骤

1:设置主服务器的地址和端口步骤

        从服务器首先要做的就是将客户端给定的主服务器IP地址以及端口保存到服务器状态的masterhost属性和masterport属性里面。

2:建立套接字连接步骤

        主服务器在接受( accept)从服务器的套接字连接之后,将为该套接字创建相应的客户端状态,并将从服务器看作是一个连接到主服务器的客户端来对待,这时从服务器将同时具有服务器( server)和客户端(client )两个身份:从服务器可以向主服务器发送命令请求,而主服务器则会向从服务器返回命令回复。

3:发送PING命令步骤

        通过发送PING命令可以检查套接字的读写状态是否正常,检查主服务器能否正常处理命令请求。


4:身份验证步骤

        在需要进行身份验证的情况下,从服务器将向主服务器发送一条AUTH命令,命令的参数为从服务器masterauth选项的值。如果从服务器没有设置masterauth选项,那么不进行身份验证。


5:发送端口信息步骤

6:同步步骤

        如果PSYNC命令执行的是完整重同步操作,那么主服务器需要成为从服务器的客户端,才能将保存在缓冲区里面的写命令发送给从服务器执行。

        如果PSYNC命令执行的是部分重同步操作,那么主服务器需要成为从服务器的客户端,才能向从服务器发送保存在复制积压缓冲区里面的写命令。

7:命令传播

        当完成了同步之后,主从服务器就会进人命令传播阶段,这时主服务器只要一直将自己执行的写命令发送给从服务器,而从服务器只要一直接收并执行主服务器发来的写命令,就可以保证主从服务器一直保持一致了。

 

四、心跳检测

        在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令

1、检测主从服务器的网络连接状态

2、辅助实现min-slaves配置选项

        Redis的min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。

3、检测命令丢失

原创粉丝点击