Redis 主从复制

Redis主从复制

一、主从复制的作用:

    1、一主一从:数据从主节点写入,并同步到从节点。注意从节点只能读取不能写入。从节点也是可以对外提供服务的,主节点是有数据的,从节点可以通过复制操作将主节点的数据同步过来,并且随着主节点数据不断写入,从节点数据也会做同步的更新。整体起到的就是数据备份的效果。

    2、一主多从:除了一主一从模型之外,redis还提供了一主多从的模型,也就是一个master可以有多个slave,也就相当于有了多份的数据副本。这样可以做一个更加高可用的选择,例如一个master和一个slave挂掉了,还能有其他的slave数据备份。

    3、注意:数据是单向流入的,Master=>slave.

    4、除了作为数据备份,主从模型还能做另外一个功能,就是读写分离。让master节点负责提供写服务,而将数据读取的压力进行分流和负载,分摊给所有的从节点。


二、主从配置:(两种配置方案)

    1、slaveof命令:在一台新的节点上输入slaveof ip port 命令就可以将此节点变为i:port节点上的从节点,此时此节点不再支持写入只能从主节点中自动复制数据过来。注:一般生产环境不允许主从节点都在一台机器上,因为没有任何的价值。注意从5.0版本开始 使用 replicaof ip port 来代替slaveof ip port命令

    2、使用配置文件:在redis.conf文件中加入 slaveof ip port,然后启动节点就会自动成为配置的节点的从节点。

    3、方案1和方案2 的优劣:

        

方式命令配置
优点无需重启
统一配置
缺点不便于管理需要重启


三、关闭主从:(取消复制)

    1、在从节点环境中执行 slaveof no one,就可以关闭从节点从master节点复制数据功能,即关闭了主从关系。此时此节点恢复为常规节点可写可读。执行 slave of on one 命令,取消后节点的数据不会被清除,只是说后续master节点新写入的数据不会再同步到该节点了。注意:如果取消复制后想slave一个新的主节点,新的主节点在同步给slave节点数据时,会先将从节点的数据全部清除.注意从redis5.0版本开始 使用 replicaof no one来代替slaveof no one命令


四、RunID和复制偏移量:

    1、redis每次启动的时候都会有一个随机的ID,作为一个标识,这个ID就是runid,当然重启之后值就改变了。

查看runid:redis-cli -p 6379 info | grep run 。假如端口为6380的redis去复制6379,知道runid后,在6380上做一个标识,如果runid改变了,说明主可能重启了或者发生了其它变化,这时候就可以做一个全量复制把数据同步过来。或者第一次启动时根本不知道6379的runid,也会进行全量复制

    2、偏移量:数据写入量的字节。比如主执行set hello world,就会有一个偏移量,然后从同步数据,也会记录一个偏移量,当两个偏移量达到一致时候,实际上数据就是完全同步的状态。启动主从redis,并在写入命令执行前后查看主偏移量:redis-cli -p 6379 info replication | grep master_repl


五、全量复制:

    1、全量复制主节点会将RDB文件也就是当前状态去同步给slave,在此期间主新写入的命令会单独记录起来,然后当RDB文件加载完毕之后,会通过偏移量对比将这个期间产生的写入值同步给slave,这样就能达到数据完全同步的效果。

    2、复制过程:

  1. 其内部有一条命令psync,是做同步的命令,它可以完成全量复制和部分复制的功能,当启动slave节点时,它会发送psync命令给主节点,需要传递两个参数,runid和offset(偏移量),也就是从向主传递主节点的runid以及自己的偏移量,对于第一次复制而言,就直接传递?和 -1,当然这个参数是由slave内部传的。

  2. master接收到命令后知道从希望做全量复制,主就会将自己的runid和offset传递给从节点。slave节点保存master的基本信息。

  3. master执行bgsave生成RDB文件,并且在此期间新产生的写入命令会被记录到repl_back_buffer(复制缓冲区)。

  4. 主向从传输RDB文件,主向从发送复制缓冲区内容。

  5. 清空从节点旧的数据。

  6. 从节点加载RDB文件到内存中,同时加载缓冲区数据。


    3、全量复制的开销:

        1、bgsave时间(对cpu、 内存、硬盘都会有一定的开销)

        2、RDB文件网络传输时间(网络带宽)

        3、从节点清空数据时间(根据从节点的数据规模)

        4、从节点加载RDB的时间

        5、可能的AOF重写时间(在最后从加载完RDB之后如果开启了AOF,会做AOF重写)

        6、假如master和slave网络发生了抖动,那一段时间内这些数据就会丢失,对于slave来说这段时间master更新的数据是不知道的。最简单的方式就是再做一次全量复制,从而获取到最新的数据。


六、部分复制:(redis2.8之后提供)

    1、如果发生了抖动,相当于连接断开了。

    2、主会将写命令记录到缓冲区,repl_back_buffer。

    3、当slave再次去连接master时候,就是说网络抖动结束之后,会触发增量复制。

    4、从会执行pysnc命令,将当前自己的offset和主的runid传递给master。

    5、如果发现传输的offset偏移量是在buffer内的,不在期间内就证明你已经错过了很多数据,buffer也是有限的,默认是1M,会将offset开始到队列结束的数据同步给从。这样master和slave就达到了一致。

    6、通过部分复制(增量复制)有效的降低了全量复制的开销。


七、同步的限制:

    1、如果在复制期间,rdb复制时间超过60秒,内存缓冲区持续消耗超过64MB,或者一次性超过256MB,那么将会停止复制(失败)

    2、配置项:client-output-buffer-limit slave 256MB 64MB 60


以上内容,部分来自互联网,如有不正确之处请与我联系修改,谢谢

阅读数:202
如有疑问请与我联系:点击与我联系