redis复制原理

        redis的复制是在主节点(master)和从节点(slave)间进行的。默认情况下,redis都是主节点,每一个主节点可以同时具有多个从节点,而每个从节点只能有一个主节点。redis复制是单向数据流,即复制只能由主节点复制给从节点。

一、配置

1、建立复制

         redis提供了三种配置方式:

         1)在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。
         2)在redis-server启动命令后加入--slaveof{masterHost}{masterPort}生效。
         3)直接使用命令:slaveof{masterHost}{masterPort}生效。

         主从节点复制成功建立后,可以使用info replication命令查看复制相关状态。默认情况下,从节点使用slave-read-only=yes配置为只读模式,因为数据只能由主节点复制给从节点,修改从节点数据会导致主从数据不一致,所以一般不建议修改slave-read-only这个参数。

2、断开复制

        在从节点上执行slaveof no one命令将会断开复制,同时从节点晋升为主节点。

二、拓扑

     redis复制图谱图大致可以分为以下三种:一主一从、一主多从、树状主从结构

1、一主一从

                                                     

       作用:1)用于主节点出现宕机时从节点提供故障转移支持。

                  2)高并发场景下,需要持久化时,可以只在从节点上开启AOF,避免主节点AOF对性能的影响。

       当主节点关闭持久化功能时,需要避免自动重启操作。由于主节点上的数据集为空,重启后从节点也会清空自身数据集。因此,安全的做法是首先在从节点上执行slaveof no one命令,再重启主节点。

2、一主多从

                         

       优点:1)在读占比比较大的场景下,可以把读命令发送到从节点执行,降低主节点的压力。

                  2)一些比较耗时的读命令可以在从节点上执行,避免线上主节点阻塞。

       缺点:在写占比比较大的场景下,多个从节点会导致主节点写命令多次发送而过度消耗网络带宽,影响主节点性能。

3、树状主从结构

                                        

          树状主从结构中,从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。该结构可以有效

降低主节点负载和需要传送给从节点的数据量。因此当需要挂载多个从节点时,为了避免对主节点的性能干扰,可以使用树状主从结构。

三、原理

1、复制过程

        复制过程大致可分为6个步骤:保存主节点信息 、主从建立socket连接、发送ping命令、权限验证、同步数据集、命令持续复制。具体流程如下:

1)从节点执行slaveof命令,只保存主节点的地址信息便直接返回。

2)从节点(slave)内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立

网络连接

3)连接建立成功后从节点发送ping请求进行首次通信,如果此时从节点没有收到返回消息,则会断开连接待下次定时任务会发起重连。

4)如果主节点设置了requirepass参数,则需要密码验证。

5)主从复制连接正常通信后,对于首次建立复制的场景,主节点会把持有的数据全部发送给从节点。

6)命令持续复制。当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来主节点会持续地把写命令发送给

从节点,保证主从数据一致性。

2、数据同步

       全量复制:一般用于初次复制场景,主节点将全部数据一次性的发给从节点,数据量较大时会对主从节点和网络造成很大开销。

       部分复制:用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主

节点会补发丢失数据给从节点。

redis从2.8版本之后使用psync命令进行复制,该命令主要依靠主从节点复制偏移量、主节点积压缓冲区、主节点id来完成。

psync{runId}{offset}

主从节点复制偏移量:参与主从复制的节点都会维护自身的复制偏移量,如下图所示主节点通过info replication可以查看主从节点的复制偏移量offset。通过对比主从节点的复制偏移量,可以判断主从节点数据是否一致。

 复制积压缓冲区:复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点有连接的从节点

(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区。

主节点id:主节点唯一表示id,重启后会,ID会随之改变。(debug reload命令重启可以保证id不变)

全量复制过程:

部分复制过程:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值