redis10(主从复制)

主从复制:

        很多企业都没有使用到 Redis 的集群,但是至少都做了主从。有了主从,当 master 挂掉的时候,运维让从库过来接管,服务就可以继续,否则 master 需要经过数据恢复和重启的过程,这就可能会拖很长的时间,影响线上业务的持续服务。

redis10(主从复制)_第1张图片

redis的最终一致性原则:

        Redis 的主从数据是异步同步的,所以分布式的 Redis 系统并不满足「一致性」要求。当客户端在 Redis 的主节点修改了数据后,立即返回,即使在主从网络断开的情况下,主节点依旧可以正常对外提供修改服务,所以 Redis 满足「可用性」。

        Redis 保证「最终一致性」,从节点会努力追赶主节点,最终从节点的状态会和主节点的状态将保持一致。如果网络断开了,主从节点的数据将会出现大量不一致,一旦网络恢复,从节点会采用多种策略努力追赶上落后的数据,继续尽力保持和主节点一致。

redis的主从同步:

redis10(主从复制)_第2张图片
明哥辛辛苦苦整理的流程图

    1增量同步

        Redis 同步的是指令流,主节点会将那些对自己的状态产生修改性影响的指令记录在本地的内存 buffer 中,然后异步将 buffer 中的指令同步到从节点,从节点一边执行同步的指令流来达到和主节点一样的状态,一边向主节点反馈自己同步到哪里了 (偏移量)。

        因为内存的 buffer 是有限的,所以 Redis 主库不能将所有的指令都记录在内存 buffer 中。Redis 的复制内存 buffer 是一个定长的环形数组,如果数组内容满了,就会从头开始覆盖前面的内容。

redis10(主从复制)_第3张图片

        如果因为网络状况不好,从节点在短时间内无法和主节点进行同步,那么当网络状况恢复时,Redis 的主节点中那些没有同步的指令在 buffer 中有可能已经被后续的指令覆盖掉了,从节点将无法直接通过指令流来进行同步,这个时候就需要用到更加复杂的同步机制 —— 快照同步。

    2快照同步

        快照同步是一个非常耗费资源的操作,它首先需要在主库上进行一次 bgsave 将当前内存的数据全部快照到磁盘文件中,然后再将快照文件的内容全部传送到从节点。从节点将快照文件接受完毕后,立即执行一次全量加载,加载之前先要将当前内存的数据清空。加载完毕后通知主节点继续进行增量同步。

        在整个快照同步进行的过程中,主节点的复制 buffer 还在不停的往前移动,如果快照同步的时间过长或者复制 buffer 太小,都会导致同步期间的增量指令在复制 buffer 中被覆盖,这样就会导致快照同步完成后无法进行增量复制,然后会再次发起快照同步,如此极有可能会陷入快照同步的死循环。

redis10(主从复制)_第4张图片

        所以务必配置一个合适的复制 buffer 大小参数,避免快照复制的死循环。

    3增加从节点

        当从节点刚刚加入到集群时,它必须先要进行一次快照同步,同步完成后再继续进行增量同步。

    4wait 指令

        wait 指令可以让异步复制变身同步复制,确保系统的强一致性


具体操作:

    1准备两个redis从服务的配置文件  

    2修改从服务的配置文件

           声明slaveof        

           配置密码  

           某一个slave打开rdb快照功能

            配置是否只读 slave-read-only

    3修改主服务的配置文件

            关闭rdb快照功能

            可以开启aof    

    4同时启动三个服务

    5主服务上设置一个 变量,从服务上也可以读出

redis主从缺陷:

        每次slave断开后(不管是主动断开还是网络故障)再连接master,都需要master全部dump出rdb,再aof(即同步的过程都需要重新执行一遍) 。所以尽量不要让多台从slave一下都启动起来,否则master的IO剧增

你可能感兴趣的:(redis10(主从复制))