详解redis主从复制(代码片段)

蘑菇睡不着 蘑菇睡不着     2022-12-10     796

关键词:

文章首发于公众号 “蘑菇睡不着”

前言

Redis 的主从复制和 MySQL 差不多,主要起着 数据备份,读写分离等作用。所以说主从复制对 Redis 来说非常重要,而无论是面试还是工作总,了解 Redis主从复制 底层实现有非常有必要,那么接下来就和大家来看看 Redis 主从复制是怎么实现的吧。

什么是 Redis 主从复制?

  在 Redis 中,我们可以通过 SLAVEOF 命令或者 slaveof 选项,让一个服务器去复制另一个服务器,被复制的服务器称为“主服务器”,发起复制的服务器称为“从服务器”,由两种服务器组成的模式称为“主从复制”。

  Redis 主从复制有以下特点:

  • Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量。
  • 一个 master 可以拥有多个 slave。
  • slave 可以接受其他 slave 的连接。除了多个 slave 可以连接到同一个 master 之外, slave 之间也可以像层叠状的结构(cascading-like structure)连接到其他 slave 。自 Redis 4.0 起,所有的 sub-slave 将会从 master 收到完全一样的复制流。
  • Redis 复制在 master 侧是非阻塞的。这意味着 master 在一个或多个 slave 进行初次同步或者是部分重同步时,可以继续处理查询请求。
  • 复制在 slave 侧大部分也是非阻塞的。当然这个是可配的,如果在 redis.conf配置是非阻塞的,可以使用旧数据集处理查询请求;如果配置的是阻塞的,slave 会返回一个 error 给客户端。

怎么实现主从复制?

假设现在有两个 Redis 服务器,地址分别为 127.0.0.1:6379 和 127.0.0.1:12345,如果在服务器 127.0.0.1:12345 执行以下命令:

127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
OK

那么服务器127.0.0.1:12345就是127.0.0.1:6379 的从服务器。主从服务器的数据会保持一致
比如主服务器存储数据:

127.0.0.1:6379> set msg "hello world"
OK

然后从服务器就能直接获取数据:

127.0.0.1:12345>get msg
"hello world"

删除数据也是一样,主从会保持一致。

主从复制原理

首先,Redis 的复制分为同步(sync)和命令传播(command propagate)两个操作:

  • 同步操作用于将从服务器数据库的状态更新为主服务器所处的状态。
  • 命令传播则相反,它主要作用在主服务器的数据库状态更改时,导致主从服务器的数据库状态出现不一致时,让主从回到一致的的过程。

接下来详细说说这两种复制。

同步

文字解说:

  1. 客户端向从服务器发送 SLAVEOF 命令,先是判断是否是第一次复制,第一次是复制一般是刚开始组建主从关系。
  2. 是第一次复制:从服务器会向主服务器发送 PSYNC ? -1 命令,请求主服务器执行完整重同步操作。
  3. 主服务器接到完整重同步请求之后,将在后台执行 BGSAVE 命令,在后台生成一个 RDB 文件,并使用一个复制积压缓冲区记录从现在开始执行的所有写命令。
  4. BGSAVE 命令执行完毕之后,主服务器会将 RDB 文件以及 缓冲区中记录的写命令发送给从服务器,还会向从服务器返回 +FULLRESYNC [主服务器ID] [复制偏移量](和图中的 偏移量 是一个)。
  5. 从服务器接收到后,会载入 RDB 文件,并执行 主服务器给的 写命令,以此来达到和主服务器一致的数据状态。
  6. 如果不是第一次复制,那么说明从服务器可能是断线,导致和主服务器数据状态不一致,需要同步主服务器的数据。那么从服务器会按照下面的步骤来请求部分同步。
  7. 向主服务器发送 PSYNC [主服务器ID] [复制偏移量](这个是第一次复制时主服务器传过来的),主服务器ID 时断线前的主服务器,用于定位去同步那个主服务器的;复制偏移量是上一次同步的位置,用于定位具体的同步位置的。
  8. 主服务器接收到从服务器的命令后,并找到相应同步的位置后,会给从服务器发送 +CONTINUE 命令,表示将于从服务器执行部分同步操作,之后主服务器会将保存在复制积压缓冲区对应 复制偏移量之后的所有数据发送给从服务器,但是如果找不到偏移量之后的数据,就会进行完整同步,这样就可以让从服务器达到和主服务器一致的状态。

命令传播

主从服务器同步成功后,并不会一致保持这个状态,主服务器可能会执行写命令,这也主从数据就不知一致了。
为了处理这种问题,主服务器会把自己执行的写命令发送给从服务器,当从服务器执行完这些命令之后,主从服务器的数据就一致了。

在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:
REPLCONF ACK <replication_offset>
<replication_offset> 是从服务器当前的复制偏移量。
发送 REPLCONF ACK 命令对于主从服务器有三个作用:

  • 检测主从服务器的网络状态。
  • 辅助实现 min-slaves 选项。
  • 检测命令丢失。

关键词讲解

  1. 主服务器ID:用于标识一个服务器。
  2. 每个服务器,无论是主服务器还是从服务器都有属于自己独一无二的 服务器ID。
  3. ID 在服务器启动时生成,由 40 个随机的十六进制字符组成。
  4. 复制积压缓冲区:复制积压缓冲区是由主服务器维护的一个固定长度、先进先出(FIFO)队列,默认大小为 1MB。如下:
偏移量...10086100871008810089...
字节值...3\'\\r\'\'\\n\'\'$\'...

总结

Redis 主从复制主要是通过 PSYNC 命令实现。
复制分为 部分复制 以及 完整复制。
部分复制通过 复制偏移量、复制积压缓冲区、服务器ID来实现。
完整复制通过 RDB 以及 复制积压缓冲区来实现。
主从复制主要解决的是 数据备份、读写分离的问题。

最后

如果觉得文章对你有帮助,点赞、关注、转发 统统走起来~

可以去公众号 蘑菇睡不着 看看,更多精彩内容等你。

redis主从与哨兵架构详解redis主从架构如何在同一台机器搭建主从架构redis主从工作原理数据部分复制jedis使用redis的管道(pipeline)redislua脚本(代码(代码片段)

上一章提到了Redis(二)Redis持久化其目的是出现故障重启时的数据恢复,这一章要提到Redis主从与哨兵架构。文中所用图片来自copy文章目录前言Redis主从架构如何在同一台机器搭建主从架构Redis主从工作原理数据部分... 查看详情

redis技术探索「高可用架构模式」哨兵(sentinel)模式实现主从故障互切换模式详解(代码片段)

哨兵(sentinel)模式实现主从故障互切换模式详解Redis的多种模式Redis单机模式Redis单机模式的优点Redis单机模式的缺点Redis主从复制旧版本配置新版本配置查看主节点信息主从模式的优点主从复制的弊端Redis哨兵模式分析哨... 查看详情

redis主从集群搭建及主从复制原理解析(代码片段)

...景;本篇文章会紧接着写redis主从集群的搭建,并详解其中配置,以及主从复制的原理解析。高可用主从集群在Redis中要达到高可用, 查看详情

redis源码阅读-主从复制增量复制细节(代码片段)

之前在写redis详解(内部分享版)的时候,主从复制的增量复制没有搞明白,昨天一个小伙伴问我增量复制偏移量的问题,我撸了一下源码。想了解主从复制的细节,还得从源头来说,一个命令的执行&#... 查看详情

redis源码阅读-主从复制增量复制细节(代码片段)

之前在写redis详解(内部分享版)的时候,主从复制的增量复制没有搞明白,昨天一个小伙伴问我增量复制偏移量的问题,我撸了一下源码。想了解主从复制的细节,还得从源头来说,一个命令的执行&#... 查看详情

redis主从复制(代码片段)

文章目录一、Redis主从复制概述(1)主从复制概述(2)Redis主从的同步策略二、配置Redis的主从复制(1)实验环境(2)实验目的(3)实验步骤一、Redis主从复制概述(1)主从复制概... 查看详情

redis(主从复制哨兵模式集群)概述及部署(代码片段)

Redis(主从复制、哨兵模式、集群)概述及部署前言一、Redis主从复制1、Redis主从复制的概念2、Redis主从复制的作用3、Redis主从复制的流程4、Redis主从复制的搭建1、环境配置/安装包2、安装Redis(所有主机)3、修改... 查看详情

缓存加速------redis主从复制,哨兵模式,集群(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

缓存加速------redis主从复制,哨兵模式,集群(代码片段)

目录前言一.Redis主从复制1.Redis主从复制概述2.Redis主从复制作用3.Redis主从复制流程4.搭建Redis主从复制①环境准备②安装Redis③修改Redis配置文件(Master节点操作)④修改Redis配置文件(Slave节点操作)⑤验证主从效果⑥在Master节点上验... 查看详情

redis学习篇主从&哨兵&集群架构详解(代码片段)

一、Redis主从架构1.1redis主从架构搭建1、复制一份redis.conf文件2、将相关配置修改为如下值:port6380pidfile/var/run/redis_6380.pid#把pid进程号写入pidfile配置的文件logfile"6380.log"dir/usr/local/redis-5.0.3/data/6380#指定数据存放目录#需要... 查看详情

redis主从复制-哨兵-集群相关部署(代码片段)

Redis主从复制+哨兵+集群一.主从复制-哨兵-集群二.主从复制1.主从复制的作用2.主从复制流程3.部署Redis主从复制三.哨兵模式1.哨兵模式的原理2.哨兵模式的作用3.哨兵结构由两部分组成,哨兵节点和数据节点部署哨兵模式... 查看详情

redis高可用之主从复制哨兵模式集群模式(代码片段)

目录前言一、Redis主从复制1.1Redis主从复制的概念1.2Redis主从复制的作用1.3Redis主从复制的流程1.4Redis主从复制的搭建1.4.1环境准备,在主从服务器上安装Redis服务1.4.2修改Master节点Redis配置文件1.4.3修改Slave节点Redis配置文件验证... 查看详情

mysql主从复制详解(代码片段)

前言:在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热... 查看详情

redis高可用方案详解(代码片段)

在生产环境下,单机部署的Redis服务一旦宕机,所有依赖Redis服务的主流服务都会受到影响,这时就需要一种Redis高可用方案。一般来说,一个高可用的方案要满足以下三点要求:数据备份(冗余)数据冗余在不同的节点上,防止数据丢失故... 查看详情

redis主从复制哨兵集群模式(代码片段)

Redis主从复制、哨兵、集群模式单节点模式SpringBoot整合@Bean(name="singleClient")publicRedissonClientsingleRedissonClient()tryConfigconfig=newConfig();config.useSingleServer().setAddress("redis://& 查看详情

redis主从复制和sentinel(代码片段)

主从复制数据副本扩展读性能一个master可以有多个slave一个slave只能有一个master数据流只能从mater流向slaveslaveof命令式复制:redis-8380>slaveof127.0.0.1:6379配置复制:slaveofipport#具体看版本slaveof/replicaofipportslave-read-onlyyes1、主从复制de... 查看详情

redis_11_redis集群实现主从复制应对高并发(代码片段)

文章目录一、前言二、主从复制搭建三、主从复制原理3.1连接阶段3.2数据同步阶段3.3命令传播阶段3.4小结四、主从复制不足五、尾声一、前言Redis搭建的集群有三个作用:1、Redis集群实现主从复制应对高并发2、Redis集群实现Se... 查看详情

redis_08_redis集群实现主从复制应对高并发(代码片段)

文章目录一、前言二、主从复制搭建三、主从复制原理3.1连接阶段3.2数据同步阶段3.3命令传播阶段3.4小结四、主从复制不足五、尾声一、前言Redis搭建的集群有三个作用:1、Redis集群实现主从复制应对高并发2、Redis集群实现Se... 查看详情