目录

redis之主从复制(一)

李羽秋
李羽秋 2022年03月07日  ·  阅读 1,335

redis之主从复制(一)

1.为什么要使用主从复制

对于以前redis持久化,单台服务器是如何保证数据安全性的,它保证了redis服务器因为宕机而重启也不会丢失数据,因为它将内存中的数据持久化到硬盘中,在重启的时候只需要重新加载即可,但是如果硬盘坏了呢?是不是就没救了,就算硬盘没坏,我们重启redis应用,服务不可用的产生多发的负面影响。这是我们不得不考虑一下redis主从复制带来的便利。

2.主从复制的概念

主从复制,是指将一台redis服务器的数据,复制到其他的redis服务器。前者称为主节点,后者称为从节点。数据的复制是单向的,只能由主节点到从结点。Master以写为主,Slave以读为主。

默认情况下,每台redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从结点),但一个从节点只能有一个主节点。

3.主从复制的作用

  • 读写分离:主节点负责写,从结点负责读,提高服务器的读写负载能力
  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余的方式
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载;尤其服务器负载;尤其是在读少写多的场景下,通过多个节点分担读负载,可以大大提高redis服务器的并发量
  • 高可用:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是redis高可用的基础

4.配置主从复制

默认情况下,Redis 所有节点都是主节点,节点与节点之间互不干涉,而参与主从复制的节点则是划分了主节点(master)和从节点(slave),它具有如下几个特点:

  1. 主节点下有一个或者多个从节点
  2. 每一个从节点只能有一个主节点
  3. 数据的复制是单向的,只能由主节点复制到从节点,所以我们不能在从节点上面执行写的操作

配置主从复制,只需要一个命令 slaveof ip port 即可,可以有三种方式

  1. 配置在配置文件中添加 slaveof ip port
  2. 在 redis-server 启动命令后增加 --slaveof ip port
  3. 直接使用命令 slaveof ip port

注意使用在从节点上面执行,ip 对应的是 masterIP,port 对应的也是 masterPort。下面来分析下主从复制的过程。

准备环境如下:

角色IPport
master127.0.0.16379
slave127.0.0.16380

注:在生产环境中不推荐将主从服务器搭建在同一台服务器上面,这里是为了演示方便。

  1. 启动 6379 、 6380 两台服务器,在 6380 上面执行 slaveof 127.0.0.1 6379
  2. 在 master 节点,执行命令 set chenssy chenssy1
  3. 在 slave 节点,执行命令 get chenssy,得到的结果 chenssy1,表名 master 数据已经同步到 slave 节点,主从部署完成。如下图

image-20220307125021707

image-20220307125032477

5.原理

redis主从复制大致分为三个阶段:

  • 建立连接阶段
  • 数据同步阶段
  • 数据传播阶段

5.1 建立连接阶段

1.保存主节点信息

当从节点执行 slaveof masterIp masterPort 命令后,就会将主节点的IP、port 信息保存下来,这里需要注意的是 slaveof 是异步命令,它在保存主节点信息后立刻返回,实际的建立连接阶段是之后进行的。

2.建立 socket 连接

从节点内部通过定时任务(每秒执行一次)维护着复制相关的逻辑,如果发现有了新的主节点,便会根据主节点的 IP 和 PORT ,创建 socket 连接,如果连接成功,则:

  • 从节点:为该socket建立一个专门处理复制工作的文件事件处理器,负责后续的复制工作。

3.发送 ping 命令

当主从节点建立连接后,从节点则就变成了主节点的一个客户端,这时从节点就会向主节点发送 PING 命令,发送该命令的目的有两个:

  1. 验证 socket 连接是否可用
  2. 判断主节点是否可以处理请求

从节点发送 ping 命令后,它可能会收到三个类型的回复:

  1. PONG :说明当前 socket 连接可用,且主节点可以处理请求,复制进程继续
  2. 超时 :说明当前 socket 不可用,从节点则断开连接,重连
  3. 其他命令 :如果主节点返回其他结果,说明主节点无法处理命令,当前可能正在处理其他超时运行的脚本,则从节点断开连接,重连

4、身份认证

如果主节点设置了 requirepass 参数,则从节点必须要向主节点进行身份认证,只有当两个节点的 masterauth 一致(一致是指都存在且密码相同),则身份验证通过,复制进程继续,否则从节点断开 socket 连接并重新发起连接。

从节点进行身份验证是通过向主节点发送 auth 命令进行的,auth 命令的参数即为配置文件中的 masterauth 的值。

5.2 数据同步阶段

当从节点发送 ping 命令收到 pong 回复后,主从节点就建立了连接,这时他们便可以进行数据同步了,具体的执行方式是:从节点向主节点发送 psync 命令,主节点根据当前状态的不同进行不同的复制流程。流程分为:全量复制和部分复制,下篇文章会专门介绍这两种复制方式,这里不再详述。

这里需要注意的两点:

  • 一、主从首次建立连接时是进行全量复制,当主从断开连接,从节点重新连接时,则需要根据偏移量来判断是进行全量复制还是部分复制。
  • 二、在数据同步前,从节点是主节点的客服端,主节点不是从节点的客户度,但是到了这个阶段以后,主从节点互为客户端,这是因为在这个阶段后,主节点会主动向从节点发送命令。

5.3 命令传播阶段

当主节点完成数据同步节点后,主节点已经将当前数据同步给从节点了,但是主节点还是在不断地接受命令,为了保证主从数据一致性,主节点需要持续不断地将写命令发送给从节点,需要注意的是,这个过程异步过程,即主节点发送写命令后并不会等待从节点的回复,因此主从节点之间的数据延迟是难免的,所以主从节点保证的是最终一致性。同时,主从之间的延迟与他们两者之间的网络状况、主节点写命令的执行频率、以及主节点中的 repl-disable-tcp-nodelay 配置等有关。

参考:https://www.cmsblogs.com/article/1391390845156069376

https://blog.csdn.net/Cantevenl/article/details/115839649

分类: redis
标签: