首页 > 数据库 >Redis从入门到放弃(7):主从复制

Redis从入门到放弃(7):主从复制

时间:2023-08-03 12:22:05浏览次数:40  
标签:主从复制 slave 入门 Redis 命令 复制 master 节点

1、概念

主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离。数据的复制是单向的,只能由主节点到从节点。

2、作用

主从复制在Redis中扮演着重要的角色,带来了以下几个主要的作用:

  1. 高可用性:通过将数据复制到多个从节点,即使主节点发生故障,从节点可替代主节点提供服务,从而保障系统的高可用性。

  2. 读写分离:主节点负责处理写入操作,从节点负责处理读操作,从而分担主节点的负载,提高系统的整体性能。

  3. 数据冗余备份:由于从节点是主节点的副本,主节点数据的备份可以在从节点上实现。

  4. 高可用基石:主从复制还是哨兵和集群能够实施的基础。

3、配置

主从复制的配置涉及到主节点和从节点的设置,具体步骤如下:

  1. 配置主节点:在主节点的配置文件(redis.conf)中进行以下配置:

    # 启用主节点
    daemonize yes
    
    # 设置主节点的监听IP和端口
    bind <主节点IP>
    port <主节点端口>
    
    # 设置主节点的认证密码(可选)
    requirepass <密码>
    
    # 开启AOF持久化(可选,默认RDB持久化)
    appendonly yes
    
  2. 配置从节点:在从节点的配置文件(redis.conf)中进行以下配置:

    # 启用从节点
    daemonize yes
    
    # 设置从节点的监听IP和端口
    bind <从节点IP>
    port <从节点端口>
    
    # 设置从节点的认证密码(与主节点一致)
    requirepass <密码>
    
    # 设置主节点的地址和端口
    replicaof <主节点IP> <主节点端口>
    
  3. 启动节点:分别启动主节点和从节点:

    redis-server redis.conf   # 启动主节点
    redis-server redis.conf   # 启动从节点
    
  4. 验证复制:查看从节点的状态,确保它已成功连接到主节点:

    redis-cli -h <从节点IP> -p <从节点端口> 
    
    info replication
    

如果看到输出中有role:slave,且master_hostmaster_port显示正确的主节点地址和端口,说明主从复制已经配置成功。

3、原理

主从复制过程大致可分为3个阶段:建立连接阶段、数据同步阶段、命令传播阶段。

3.1、第一阶段:建立链接、协商同步

  • 在执行replicaof命令后,slave会向master发送psync命令,携带master的runID(实例ID)和offset(复制进度)参数,因为是第一次请求复制,所以runID为?,offset为-1。
  • master收到psync命令后返回FULLRESYNC命令,并携带master的runID和offset,slave保存。

这一步的目的是为全量复制做准备。

3.2、第二阶段:数据同步

  • 完成第一阶段工作后,master会执行bgsave命令生成RDB文件,并发送给slave。
  • slave在收到RDB文件后,先清空本地数据,再加载新的RDB文件数据。

3.3、第三阶段:命令传播

  • 在完成第一次全量复制后,master与slave会建立一个长连接和replication buffer缓冲区,master的写入命令都会存入缓冲区。同时,master也会通过这个长连接将repl buffer数据传播给slave,来保证数据一致性。

那么有人可能会问,如果主从节点之间网络短暂中断,如何保证数据一致性?

答案:增量复制。

在2.8以前只有全量复制,如果主从库在命令传播时出现了网络闪断,那么,从库就会和主库重新进行一次全量复制,开销非常大。因此从Redis 2.8 开始提供了增量复制的功能,在网络断了之后,主从库会采用增量复制的方式继续同步。

  • savle在恢复网络后,会发送 psync 命令给master,此时的 psync 命令里的 offset 参数不是 -1。
  • master收到该命令后,然后用 continue 响应命令告诉slave接下来采用增量复制的方式同步数据。
  • 然后master将断网期间写入命令发送给slave,然后slave再执行这些命令。

写入命令除了写入repl buffer,还会写入repl backlog(复制积压缓冲区),默认大小为1M,在内存中为环形结构。主要用于根据offset找到增量数据。结构如下图:

注意点:

断开重连并不一定是增量复制。如上图所示,repl backlog为环形结构,如果网络断开时间太长,写入命令如果超过1M,旧的命令就会被覆盖。因此如果master offset和slave offset相差的数据已被覆盖则会通过全量复制。

因此,repl backlog可以适当配置大一些。

标签:主从复制,slave,入门,Redis,命令,复制,master,节点
From: https://www.cnblogs.com/myshare/p/17602983.html

相关文章

  • redis stream做轻量级消息队列的可行性
    背景对于消息数量很少的场景,尝试使用redisstream来做消息队列.为什么要用redis的stream,redis的其他数据结构可以吗?参考文章1:https://www.zhihu.com/question/43688764?sort=created参考文章2:https://www.cnblogs.com/williamjie/p/11201654.htmlredis有一些机制有队......
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
    MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据,并从中提取有关行为、模式和趋势的见解。无论是处......
  • redis 集群重启问题
    redis出现链接不稳定或者链接不上的时候,需要重新启动1.找到集群的位置上 下面的两个启动和停止命令进行停止和启动但停止时候启动的时候可能会出现下面的问题 这是要删除appendonly.aof和dump.rdb文件,也可以选先将这两个先备份一下,然后启动后重新恢复,才能启动成功end........
  • redis版本升级方法
    wget -P /tmp https://download.redis.io/releases/redis-6.2.6.tar.gz         #下载最新版本tar -C /opt/redis/ -xf /tmp/redis-6.2.6.tar.gz #解压cd redis-6.2.6 #进入新版本目录下yum -y install centos-release-scldevtoolset-9-gcc devtoo......
  • redis远程代码执行CVE-2016-8339
       Redis3.2.x<3.2.4版本存在缓冲区溢出漏洞,可导致任意代码执行。Redis数据结构存储的CONFIGSET命令中client-output-buffer-limit选项处理存在越界写漏洞。构造的CONFIGSET命令可导致越界写,代码执行。漏洞利用:修改配置文件redis.confcpredis.conf./src/......
  • 小程序云开发快速入门(2/4)
    前言我们对《微信小程序云开发快速入门(1/4)》的知识进行回顾一下。在上章节我们知道了云开发的优势以及能力,并且我们还完成了码仔备忘录的本地版到网络版的改造,主要学习了云数据库同时还通过在小程序使用云API直接操作了云数据库:使用get()进行了数据库的查询使用add()进行了数据......
  • python教程 入门学习笔记 第5天 format函数拼接 两种打印方法 转义字符
    2)format函数拼接#format函数拼接s1="统计={0}{1}{2}".format("张三","工资",3400)#占位符{}中可以填写数字编号print(s1)s2="统计={}{}{}".format("李四","工资",4500)#用占位符{}拼接,占位符要与字符串数量一致print(s2)s3="统计={a}{b}{c}".forma......
  • SpringMVC入门案例
    坐标<!--Spring坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version><......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......
  • Redis基础
    Redis是一个基于内存的key-value结构数据库。Redis是互联网技术领域使用最为广泛的存储中间件,它是【RemoteDictionaryService】的首字母缩写,也就是【远程字典服务】。基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛Redis入门Redis简介......