首页 > 数据库 >Redis主从复制实现与原理

Redis主从复制实现与原理

时间:2023-05-23 11:03:21浏览次数:47  
标签:主从复制 同步 Slave Redis redis Master 原理 节点


一、 概述

主从复制,是指将一台Redis服务器的数据复制到其他的Redis服务器。前者称为主节点(Master/Leader),后者称为从节点(Slave/Follower);数据是从主节点复制到从节点的。

其中,主节点负责写数据(当然有读的权限),从节点负责读数据(它没有写数据的权限)。

默认的配置下,每个Redis都是主节点

一个主节点可以有多个从节点,但是一个从节点只能有一个主节点,即:主从节点是1对N的关系。如下图所示:

Redis主从复制实现与原理_数据

1.1> 主从复制的用处

(1)数据冗余:主从复制实现了数据的备份,实际上提供了数据冗余的实现方式。

(2)故障恢复:当主节点出现异常时,可以由从节点提供服务,实现快速的故障恢复,实际上提供了服务冗余的实现方式。

(3)负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器的负载;在写少读多的业务场景下,通过多个从节点分担读负载,可以大大提高Redis服务器是并发量。

(4)高可用:哨兵配合主从复制,可以是实现Redis集群的高可用。

二、环境搭建

创建redis-cluster目录,然后复制3份redis(也可以一个redis三份不同的配置文件,启动的时候,读取相应的配置文件),如下图所示:

Redis主从复制实现与原理_redis_02

分别修改它们的redis.conf配置文件,如下所示:

redis-6380/redis.conf

port 6380
pidfile /var/run/redis-6380.pid
logfile "redis-6380.log"
dbfilename dump-6380.rdb
daemonize yes

redis-6381/redis.conf

port 6381
pidfile /var/run/redis-6381.pid
logfile "redis-6381.log"
dbfilename dump-6381.rdb
daemonize yes
# 如果不通过修改配置文件,也可以在客户端中输入“SLAVEOF 127.0.0.1 6380”即刻生效!!
# 也可以在客户端中输入“SLAVEOF NO ONE”来断开主从关系
replicaof 127.0.0.1 6380

redis-6382/redis.conf

port 6382
pidfile /var/run/redis-6382.pid
logfile "redis-6382.log"
dbfilename dump-6382.rdb
daemonize yes
replicaof 127.0.0.1 6380

分别启动这3个redis服务:

Redis主从复制实现与原理_Redis_03

开启3个客户端,来连接这3个redis服务实例;利用ping查看服务是否正常,并且通过info replication查看自己在集群中的角色

redis-6380

Redis主从复制实现与原理_redis_04

redis-6381

Redis主从复制实现与原理_后端_05

redis-6382

Redis主从复制实现与原理_Redis_06

三、相关特性

3.1> 从节点是只读的

我们测试一下主节点redis-6380的读写操作,结果是读写都ok

Redis主从复制实现与原理_Redis_07

我们测试一下从节点redis-6381的读写操作,发现不能执行写入操作,但是可以读取数据,其中muse是我们在6380主节点中添加的

Redis主从复制实现与原理_redis_08

我们测试一下从节点redis-6382的读写操作,也一样是只读的

Redis主从复制实现与原理_redis_09

3.2> 主节点意外宕机

我们关闭主节点6380的服务,查看从节点的对外服务是否收到影响

Redis主从复制实现与原理_后端_10

测试两个从节点是否可以对外正常的提供服务。如下所示,我们可以看到,从节点依然可以对外提供只读的服务

Redis主从复制实现与原理_后端_11

虽然主节点挂掉了,但是这两个从节点并不会自动的成为主节点,他们依然是从节点的角色。我们可以通过info replication来确认一下

Redis主从复制实现与原理_redis_12

我们重新启动主节点,并且添加数据,我们来确认一下,这两个从节点会不会依然能够获得主节点同步过来的新数据

Redis主从复制实现与原理_数据_13

【解释】我们发现,两个从节点都可以获取到新添加的bob。说明,只要主节点再次成功启动,主从结构依然可以自动的建立起来

四、实现原理

Redis的主从复制可以分为两个阶段:

  • sync阶段
  • command propagate阶段。

4.1> sync阶段

从节点启动后,会发送sync指令给主节点,要求全量同步数据。具体步骤如下图所示:

Redis主从复制实现与原理_Redis_14

步骤1:Slave启动后,连接Master节点并发送sync指令。
步骤2:Master节点接到sync指令后,会执行BGSAVE指令,生成RDB文件。此外,在Master节点生成RDB文件时,会将此后客户端执行的增删改操作都存入缓冲区
步骤3:文件生成后,会发送给Slave节点,Slave节点接收到后,会删除所有旧的数据,然后加载RDB数据,实现数据全量同步操作。
步骤4:当Slave数据加载完毕后,Master会将缓冲区的指令发送给Slave
步骤5:由Slave去执行缓冲区新增的指令

4.2> command propagate阶段

该阶段属于命令传播阶段

上面我们介绍了,Slave节点通过sync指令请求Master节点全量数据的同步操作。那么,如果后续Master节点接收到新的增删改操作,也需要Slave节点接收同步的更新,那么这种就是command propagate

4.3> psync指令

当主从节点都正在运行的时候,出现了网络抖动,造成连接断开,那么当网络恢复,两个节点再次建立起连接的时候。从节点发送sync指令后,主节点依然需要重新生成RDB,并对从节点进行全量数据的同步造成。那么这中间的耗时是非常严重的,并且传输备份文件也会对网络带宽造成很大的消耗。那么为了解决这个问题,从Redis 2.8开始,引入了psync指令来代替sync指令

psync指令会根据不同的情况,来确定执行全量重同步还是部分重同步

全量重同步

  • 当从节点是第一次与主节点建立连接的时候,那么就会执行全量重同步,这个同步过程与上面我们介绍的sync阶段+command propagate阶段一样

部分重同步

  • 从节点的复制偏移量无法在复制积压缓冲区中找相应待同步的数据
  • 主节点与从节点不是第一次同步(根据Redis节点ID判断)

什么是复制偏移量?

  • Master节点和Slave节点都保存着一份赋值偏移量。
  • 当Master节点每次向Slave节点发送n字节数据的时候,就会在Master节点偏移量加上n;而Slave节点每次接收到n个字节的时候,也会在Slave节点偏移量上加n。
  • 在命令传播阶段,Slave节点会定期的发送心跳REPLCONF ACK{offset} 指令,这里的offset就是Slave节点的offset。当Master节点接收到这个心跳指令后,会对比自己的offset和命令里的offset,如果发现有数据丢失,那么Master节点就会推送丢失的那段数据给Slave节点。如下图所示:

什么是复制积压缓冲区?

  • 复制积压缓冲区是由主节点维护的一个固定长度(默认1MB)的队列。
  • 它存储了每个字节值与对应的复制偏移量。
  • 因为复制积压缓冲区的大小是固定的,所以它保存的是主节点近期执行的写命令。当从节点将offset发送给主节点后,主节点便会根据offset与复制积压缓冲区的大小来决定是否可以使用部分重同步。如果offset之后的数据仍然在复制积压缓冲区内,则执行部分重同步;否则还是执行全量重同步

什么是节点ID?

  • Redis节点服务启动之后,就会产生一个用来唯一标识Redis节点的ID
  • 当Master节点与Salve节点进行第一次连接同步的时候,Master节点会将ID发送给Slave节点,Slave节点接收到会,会对其进行保存。那么当主从服务之间发生了中断重连的时候,Slave服务器会将这个ID发送给Master服务器,Master服务器会拿自己的ID进行对比,如果相同,则说明主从之前是连接过的。否则,则说明是第一次建立的连接。那么,就需要全量去同步数据了

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

标签:主从复制,同步,Slave,Redis,redis,Master,原理,节点
From: https://blog.51cto.com/u_15003301/6330120

相关文章

  • 如何利用Redis进行事务处理呢?
    一、概述事务的本质,其实就是一组命令的集合。一个事务中的所有命令都会按照命令的顺序去执行,而中间不会被其他命令加塞。Redis提供了事务相关的5个指令,分别是:DISCARD、EXEC、MULTI、UNWATCH和WATCH。如下图所示:下面我们就对Redis的事务操作一一的进行介绍。二、MULTI(v1.2.0)指令格式......
  • Windows环境下配置MySQL主从复制详细教程
    ​一、下载mysql下载地址:MySQL::MySQLCommunityDownloads1、点击箭头所指​编辑 2、默认页面是下载mysql8,如果想下载mysql5点击箭头所指​编辑3、点击箭头所指选择需要的版本​编辑4、点击箭头所指可以选择32位或64位​编辑5、然后点击download​编辑二、解压压......
  • redis,缓存雪崩,缓存穿透,缓存更新,缓存降级,缓存预热等问题
    一、缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间(例如:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成......
  • 【面试系列6】Redis
    redisredis是什么?内存数据库,一切数据操作都在内存中进行,所以速度很快,常被用来做缓存,消息队列,分布式锁。具有高效的数据结构,String、list、hash、set、zset,bitmaps、hyperloglog、geo、stream。redis还支持事务、持久化、多种集群方式、发布订阅模型、内存淘汰机制等等。re......
  • MapReduce和Yarn原理
    MapReduce原理 问题1.什么是计算,什么是分布式计算?答案:计算指的是从海量数据中提取出有效的价值信息的过程(广义上解释),狭义上指的是1+1=2即:数学运算.分布式计算指的是多台机器协调,共同完成同1个计算任务.问题2:分布式计算的两种模式?答案:分散汇......
  • (笔记)运放电路中并联反馈电容与反馈电阻的工作原理
     一、反馈电容运放反馈端电容并电阻,或许很多人都有疑惑;不同频率的信号经过电容都会产生不同程度的相移和衰减。 如果你利用的是其衰减,那么就是滤波。 如果你利用的是其相移,那么就是补偿。  (图一:反馈电容/电阻示意图)CF的作用:相位补偿,防止振荡,抑制高频噪声:一般来说,因为布......
  • 第三回:数据何所依,硬盘话原理
    公众号原文前情回顾:《第一回:天才闯秘境,绝地寻生机》上回说到,阿飞从混沌中醒来,意外发现自己的大脑被数据化存储到了一台计算机内存中,根据神秘声音的指示,他需要赶紧联系网卡找到自己大脑的另一半然后逃离这里。不料内存却告诉他,如果不赶紧把自己持久化存储起来,一旦计算机关闭他就会......
  • 一个故事看懂内存条工作原理
    微信公众号我是内存条我是一个内存条,刚刚从深圳的一个工厂里被生产出来,跟我一起的还有一批小伙伴,长得跟我一模一样,下了流水线后我们就被扔进了一处黑暗的角落。“这是哪里啊,黑漆漆的”,一个小伙伴说到。“这里是内存条仓库”,黑暗中有人在说话,声音中略有一丝沧桑,像是一个老头。“谁......
  • AOP-基本概念以及底层原理(JDK动态代理实现)
    1.什么是AOP1.面向切面编程(面向方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高开发效率2.通俗描述:不通过修改源代码方式,在主干功能里添加新功能 AOP(底层原理) 1.AOP底层使用到了动态代理1.两......
  • Linux Redis 做成系统服务
    概述系统:CentOS7.6Redis安装后启动方式:redis-server/xxx/xxx/redis.conf。若不指定配置文件,则redis-server不会读取任何配置文件,而是使用自身携带固定配置信息启动。若想将redis做成系统服务,则需在/etc/init.d目录下添加一个配置文件,文件中指定要启动的程序,如何可以使用系统服......