一, 主从复制简介

      1,主服务器和从服务器

            在redis中,用户可以通过执行slaveof或者配置slaveof选项,让一个服务器去复制另一个服务器,被复制的服务器称为主服务器,复制的服务器称为从服务器;关系如下所示:

redis 主从复制 java连接 redis主从复制如何实现_redis


      2,举例

            那么就会使得主服务器和从服务器中保存的数据是一样的;

redis 主从复制 java连接 redis主从复制如何实现_linux_02

二,旧版复制功能的实现

      1,redis的复制功能
            分为两步操作,第一步是同步操作,第二步是命令传播操作;
            a,同步:就是将主服务器的数据复制到从服务器中;
            b,命令传播:当主服务器中保存的内容执行了写命令,那么就会导致从服务器和主服务器中的内容不一致,那么此时使其恢复到一致状态,这个操作称为明令传播
      2,同步操作的步骤
            a,当从服务器执向主服务器发送一个slaveof,从服务器首先会执行同步操作,向主服务器发送一个SYNC命令;
            b,当主服务器收到SYNC命令之后,会执行BGSAVE明令,与此同时创建一个缓冲区用来接收之后主服务器收到的写命令;
            c,当主服务器的rdb文件创建完成之后,就会将rdb文件发送给从服务器,从服务器收到rdb文件,开始进行同步,还原主服务器中的数据;
            d,当还原完主服务器的的数据库状态之后,主服务器将缓冲区中积压的命令发送给从服务器,使其完成主从数据的彻底一致;
      3,命令传播操作
            当执行完同步操作之后,主从服务器的数据达到一致,但是这个一致只是暂时的,因为主服务器在执行完写命令之后,就会使得和从服务器之间数据库状态不一致;
解决办法:将发送给主服务器的写命令,主服务器也会传送给从服务器,使得主从数据库状态保持一致;
      4,旧版复制功能的缺陷
            主从复制可以分为两种情况,一种是初次复制,一种是断线后重复制;
            a,初次复制:从服务器第一复制主服务器的数据;
            b,断线后重复制:因为网络问题导致主从服务器之前断开了连接,之后重新连接上进行的复制;
            分析:对于初次复制,旧版复制功能可以很好的胜任,但是对于断线后重复制,那么就会效率是比较低的,如果主服务器只是改动了很少量的数据,从服务器又将主服务器上所有的数据全部复制一遍,其实效率很低,也是没有必要这样做的,因此这就是旧版复制的缺陷;

三,新版复制功能的实现

      1,PSYNC命令介绍

            redis2.8之后为了解决旧版复制功能的缺陷,使用PSYNC命令代替SYNC命令执行复制操作;PSYNC命令具有两种模式:一种是完整重同步,一种是部分重同步;

            a,完整重同步:主要用于解决初次复制情况,该执行步骤和SYNC命令的步骤基本一致;

            b,部分重同步:主要用于解决断线后重新复制的情况,主服务器会将在从服务器在短信后这段时间执行的写命令发送给从服务器,使得主从服务器的数据重新恢复到一致;

      2,PSYNC命令的优点

            解决了旧版复制功能低效的问题

      3,部分重同步功能的组成

            a,主服务器的复制偏移量和从服务器的复制偏移量

            b,主服务器的复制积压缓冲区

            c,主服务器的运行ID

      4,复制偏移量

当主服务器向从服务器发送N个字节的数据时,那么主服务器的复制偏移量就会增加N;当从服务器收到主服务器发送的N个字节数据时,那么从服务器的复制偏移量也会加N;

redis 主从复制 java连接 redis主从复制如何实现_redis 主从复制 java连接_03


      5,复制积压缓冲区

            a,介绍:是一个固定长度的先进先出的队列,默认大小为1MB;

            b,工作过程:当主服务器在执行写命令的时候,不仅会将写命令写给从服务器,也会写到复制积压缓冲区,因此复制积压缓冲区会记录一部分的写命令;而且,复制积压缓冲区会为每一个字节记录相应的复制偏移量;

redis 主从复制 java连接 redis主从复制如何实现_linux_04


redis 主从复制 java连接 redis主从复制如何实现_java_05


            c,使用复制积压缓冲区判断执行哪一种同步操作

                  当从服务器断线重连接后,会发送从服务器记录的复制偏移量给主服务器,主服务器获取到这个偏移量之后,就会判断该偏移量在复制积压缓冲区上是否存在,如果存在,执行部分重同步,向从服务器发送continue命令,然后将复制积压缓冲区对应偏移量之后的数据发送给从服务器;如果不存在那么执行完整重同步;

            d,启示

                  复制积压缓冲区的默认大小为1MB,但是这个大小不一定能满足我们的需求,因此需要我们根据实际情况进行调整;如果写命令比较频繁,或者断线后很长时间才回复连接,那么我们可以将复制积压缓冲区的大小设置的大一点;相反的可以设置的小一点;

      6,服务器运行ID

            a,介绍:不管是主服务器和重服务器都会有自己的运行ID,当启动的时候就会随机生成一个ID,这个ID是由40位16进制字符组成;如:64sd4f6s6d4f64s64d6f46s4d6f465s46df46s1313v1s3e8

            b,作用:当从服务器进行初次复制的时候,会保存主服务器的运行ID;然后从服务器断线后重新连接主服务器的时候,会将这个运行ID发送给主服务器,主服务器判断这个ID和自身的ID是否一样,如果一样那么在判断在判断复制偏移量,决定是执行部分重同步和完整重同步;如果运行ID不一样,那么直接执行完整重同步操作;

      7,PSYNC命令的实现

redis 主从复制 java连接 redis主从复制如何实现_linux_06

四,复制的实现

      1,情景:从服务器向主服务器发送slaveof命令,那么复制的过程如是怎样的;
      2,复制的操作步骤
            a,设置主服务器的地址和端口号
            b,建立套接字连接
            c,发送ping命令
            d,身份验证
            e,发送端口信息
            f,同步操作
            g,命令传播

五,心跳检测

   1,心跳检测的命令

         从服务器会一每秒一次的频率向主服务器发送命令:REPLCONF ACK <replication_offset>,replication_offset表示从服务器的复制偏移量

   2,心跳检测的作用

         a,检测主从服务器的网络连接状态

当主服务器超过一秒没有收到从服务器发送的心跳检测命令,那么表示主从服务器之间的网络连接出现了问题;我们可以通过在主服务器上执行INFO replication命令,进行查看网络连接是否存在问题;

redis 主从复制 java连接 redis主从复制如何实现_linux_07


         b,辅助实现min_slaves配置选项

               reids的min_slaves_to_wrtie和min_slaves_max_lag两个选项可以防止主服务器在不安全的情况下执行写命令;通过执行INFO replication命令来配置这两个选项;

redis 主从复制 java连接 redis主从复制如何实现_数据库_08


         c,检测命令丢失

               如果主服务器的写命令因为网络问题导致命令在传送给从服务器的过程中,发生丢失,那么当从服务器发送心跳检测的命令的时候,就会检测到命令的丢失,通过比较从服务器发送的复制偏移量和主服务器的复制偏移量比较得知,如果命令丢失的话,那么主服务器就会将丢失的数据重新发送给从服务器;因此心跳检测的作用就是用于检测命令丢失的作用;

对与2.8之前的版本,没有心跳检测功能,那么即使命令丢失,从服务器也不会感知到,那么命令就会丢失;