Redis主从复制


1. 目前redis面临的问题

Redis有 两种不同的持久化方式, Redis 服务器通过持久化,把 Redis 内存中持久化到硬盘当中,当Redis 宕机时,我们重启 Redis 服务器时,可以由 RDB 文件或 AOF 文件恢复内存中的数据。
在这里插入图片描述
问题1:不过持久化后的数据仍然只在一台机器上,因此当硬件发生故障时,比如主板或 CPU 坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故障时数据的安全性?或者可以快速恢复数据呢?

问题2:容量瓶颈

解决办法:
针对这些问题,redis提供了 复制(replication) 的功能, 通过”主从(一主多从)”和”集群(多主多从)”的方式对redis的服务进行水平扩展,用多台redis服务器共同构建一个高可用的redis服务系统。

2. 主从复制概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
在这里插入图片描述

3. 常用策略

3.1 策略1 :一主多从 主机(写),从机(读)

在这里插入图片描述

3.2 策略2:薪火相传

在这里插入图片描述

4. 主从复制原理

Redis 的主从复制是异步复制,异步分为两个方面,一个是 master 服务器在将数据同步到 slave 时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的。

4.1 复制方式

4.1.1 全量复制

master 服务器会将自己的 rdb 文件发送给 slave 服务器进行数据同步,并记录同步期间的其他写入,再发送给 slave 服务器,以达到完全同步的目的,这种方式称为全量复制。

在这里插入图片描述

  1. slave发送psync告诉master它要进行数据同步。带了两个参数
    ?:代表了runId,因为它现在不知道master的runId所以就是?
    -1:就是一个偏移量,可以理解为消费进度,-1代表从头开始

  2. master知道要进行全量复制了,然后回传自己的runId与offset(在master中有多少字节数据要传输给slave)

  3. slave保存master信息

  4. master生成rdb文件

  5. 发送给slave

  6. 在生成rdb过程中master接收到的命令产生的数据会写入buffer,然后send给slave,来保证数据的一致

  7. slave清空旧数据

  8. 加载新收到的rdb文件

4.1.2 增量复制

因为各种原因 master 服务器与 slave 服务器断开后, slave 服务器在重新连上 maste r服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。
在这里插入图片描述

4.2 工作原理

master 服务器会记录一个 replicationId 的伪随机字符串,用于标识当前的数据集版本,还会记录一个当前数据集的偏移量 offset ,不管 master 是否有配置 slave 服务器,replication Id和offset会一直记录并成对存在,我们可以通过以下命令查看replication Id和offset:

info repliaction

通过redis-cli在master或slave服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同):
在这里插入图片描述
当master与slave正常连接时,slave使用PSYNC命令向master发送自己记录的旧master的replicationid和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致。

而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步。

5. 配置主从复制

注:主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情。
从节点开启主从复制,有3种方式:
(1)配置文件:在从服务器的配置文件中加入:slaveof
(2)redis-server启动命令后加入 –slaveof
(3)Redis服务器启动后,直接通过客户端执行命令:slaveof ,则该Redis实例成为从节点

演示:
①、通过 info replication 命令查看三台节点角色
在这里插入图片描述
初始状态,三台节点都是master

②、设置主从关系,从节点执行命令:SLAVEOF 127.0.0.1 6379
在这里插入图片描述
再看主节点信息:
在这里插入图片描述
这里通过命令来设置主从关系,一旦服务重启,那么角色关系将不复存在。想要永久的保存这种关系,可以通过配置redis.conf 文件来配置。

slaveof 127.0.0.1 6379
# 取消复制:slave of on one

6. 测试主从关系

①、增量复制
master 操作写入:
在这里插入图片描述
slave操作获取:
在这里插入图片描述
②、全量复制
通过执行 SLAVEOF 127.0.0.1 6379,如果主节点 6379 以前还存在一些 key,那么执行命令之后,从节点会将以前的信息也都复制过来

③、主从读写分离
尝试slave操作set:
在这里插入图片描述
原因是在配置文件 6380redis.conf 中对于 slave-read-only 的配置
在这里插入图片描述
如果我们将其修改为 no 之后,执行写命令是可以的,但是从节点写命令的数据从节点或者主节点都不能获取的。并没有任何的意义

④、主节点宕机
主节点 Maste 挂掉,两个从节点角色会发生变化吗?
在这里插入图片描述
在这里插入图片描述
上图可知主节点 Master 挂掉之后,从节点角色还是不会改变的。

⑤、主节点宕机后恢复
主节点Master挂掉之后,马上启动主机Master,主节点扮演的角色还是 Master 吗?
在这里插入图片描述
也就是说主节点挂掉之后重启,又恢复了主节点的角色。


文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录