Redis高可用之主从复制架构(第一部分)

news2024/11/26 4:46:57

引言

之前的文章 Redis持久化策略AOF、RDB详解及源码分析,我们介绍了Redis中的数据持久化技术,包括 RDB快照 和 AOF日志以及混合持久化 。有了持久化技术,我们就不用担心因Redis所在服务机器宕机,导致数据丢失。但是,持久化技术只是解决了Redis服务宕机后,数据的快速回复问题。并没有从根本上提高Redis的可用性。Redis提供的高可用主要分为:主从模式哨兵模式集群模式三种模式。这三种模式我会分为三部分介绍,今天我们就来聊一聊Redis的主从模式。

同步复制和异步复制

  • 同步复制:客户端向主服务器修改数据库数据的命令,主服务器再执行完后,需要等待所有的从数据库都同步完成后才返回给客户端。优点:主从高度一致,数据可靠;缺点:每次都需要等待所有的从数据库完成同步,效率低。
  • 异步复制:客户端向主服务器修改数据库数据的命令,主服务器再执行完后立即返回给客户端。从服务器与主服务器建立连接,异步从主服务器同步数据。优点:服务的吞吐量高,响应速度快;缺点:数据可能不一致,redis采用的是异步复制

一、主从复制

Redis 提供的主从模式,是通过复制的方式,将主服务器上的Redis的数据同步复制一份到从 Redis 服务器,这种做法很常见,MySQL的主从也是这么做的。

主节点的Redis我们称之为master,从节点的Redis我们称之为slave,主从复制为单向复制,只能由主到从,不能由从到主。可以有多个从节点,比如1主3从甚至n从,从节点的个数需要根据实际的业务需求来确定。
在这里插入图片描述

1.3 主从数据一致性

为了保证主服务器Redis的数据和从服务器Redis的数据的一致性,也为了分担访问压力,均衡负载,应用层面一般采取读写分离的模式。

读操作:主、从库都可以执行,一般是在从库上读数据,对实时性和准确性有100%高真要求的部分业务,可以谨慎评估之后读主库;
写操作:只在主库上写数据,写完之后将写操作指令同步到从库。

二、主从复制搭建

主从复制的搭建完全是在从服务器上配置和发起的,主服务器不需要做任何事。在Redis5.0之前是slaveof < masterip > < masterport >。

2.1 配置文件的方式

在从服务器的 redis.conf 配置文件中加入:

replicaof <masterip> <masterport>

2.2 启动命令的方式

在 redis-server 命令后面加上–replicaof < masterip > < masterport >
比如:

redis-server --replicaof 127.0.0.1  6379

2.3 在服务器客户端通过命令的方式

replicaof <masterip> <masterport>

三、主从复制原理

1.1 复制功能实现

Redis复制功能分为同步命令传播两个部分:

  • 同步操作用于将从服务器的数据库状态更新至和主服务器当前一致的状态,这一步主要是同步主服务器发过来的RDB文件;
  • 命令传播操作用于将主服务器开启RDB文件同步后,执行的写命令传播给从服务器,从服务器再完成RDB文件同步后,继续执行这些写命令,从而达到与主服务器一致的状态。

Redis中从服务器对主服务的复制主要分为以下两种情况:

  1. 从服务器之前没有复制过任何主服务器,或者从服务器当前要复制的主服务器与之前复制的不是同一个主服务器。
  2. 断线后的重连:处于命令传播阶段的主从服务器主要因为网络原因而中断了复制,从服务器通过自动重连到主服务继续进行复制。

1.2 复制流程

  1. 客户端通过 redis-server --replicaof master:ip master:port 指定要复制的主服务器
  2. 从服务器与主服务器建立网络连接
  3. 从服务器向主服务器发送PSYNC 命令
  4. 主服务器收到PSYNC命令,执行BGSAVE命令,通过fork进程在子进程中生成RDB文件,并使用一个缓冲区专门记录从现在开始执行的写命令
  5. 当主服务器BGSAVE命令执行结束,主服务器会将该RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至与主服务器执行BGSAVE命令时一致的状态
  6. 主服务器将记录在缓冲区的写命令发送给从服务器,从服务器执行这些命令达到与主数据库数据一致

PSYNC命令是一个非常耗费资源的操作:

  1. 对于主服务器来说,需要执行BGSAVE命令来生成RDB文件,这会耗费主服务大量的CPU、内存及磁盘IO资源
  2. 在BGSAVE命令完成后,还需要将RDB文件发送给从服务器,这会占用主从服务器大量的网络资源(带宽和流量),影响主服务器的命令响应时间
  3. 对于从服务来说,在载入RDB文件期间,会因为阻塞而无法处理命令请求

所以Redis要保证在需要的时候才执行PSYNC命令。

1.3 Redis复制策略

Redis 内部使用PSYNC命令来执行复制操作。PSYNC命令具有 全量数据同步增量数据同步 两种模式。全量数据复制很好理解,从服务器需要从头开始复制主服务器的数据;增量数据复制主要用在主从服务器因为网络问题导致的复制中断,在从服务器重新连接到主服务器进行的操作,此时,从服务器只需要执行在断开期间主服务器执行的写命令即可。

增量数据同步的实现,主要由三部分组成:

  1. 主服务器和从服务器的复制偏移量:主服务器和从服务器会分别维护一个复制偏移量。主服务器每次在向从服务器传播N个字节的数据,就将自己的偏移量加N;从服务器在收到主服务器N个字节的数据后,会给自己的偏移量加N。如果主从服务器的数据是一致的,那么主从服务器的偏移量总是相同的。相反,说明主从服务器数据不一致。
    在这里插入图片描述

  2. 主服务的复制积压缓冲区
    主服务器维护了一个固定长度的队列,默认大小1MB。当主服务器执行命令传播是,不仅会将写命令发给所有的从服务器,还会将写命令写入到复制积压缓冲区中。缓冲区会为队列中的每个字节记录响应的复制偏移量。当从服务器重新连接上主服务器时,从服务器通过PSYNC命令将自己的偏移量offset发给主服务器,主服务器会根据这个偏移量决定执行何种同步操作:如果offset+1开始的数据仍然存在于缓冲区,则执行增量数据同步,否则执行全量数据同步。
    如果服务器需要执行大量的写命令,又或者主从断线后要经过很长的时间才能重新建立连接,那么就需要增大缓冲区的大小。可以根据以下公式来估算积压缓冲区的大小:buffer_size = 2* second * write_size_per_second,second是主从断线重连的平均时间,单位s,write_size_per_second是主服务器平均每秒产生的写命令(协议格式的写命令)的数据量。

  3. 服务器的运行ID
    每个Redis服务器,无论是主服务器还是从服务器,都有自己的运行ID。运行ID在服务器启动时自动生成,由40位随机的十六进制字符组成。当从服务器初次对主服务进行复制时,主服务器会将自己的运行ID发给从服务器,从服务器保存。当出现重连时,从服务器会将自己保存的运行ID发送给主服务器,主服务器拿到运行ID与自己的ID进行比较,如果相等并且offset+1的数据还在积压缓冲区中,则执行增量数据同步,否则执行全量数据同步。

四、PSYNC命令实现

在这里插入图片描述
replicaof 是异步命令,在从服务器完成“masterhost”和“masterport”的设置后,从服务向发送replicaof 的客户端回复OK,表示指令已经接收,而实际的复制是在返回OK后才开始执行:

  • 从服务器根据设置的主服务器的地址和端口,建立套接字连接,如果建立成功;
  • 向主服务器发送PING命令,检车网络状态和主服务器能否正常处理命令请求,如果主服务器返回PONG,继续执行,否则从服务器主动断开连接,重新建立套接字连接。
  • 是否需要身份认证,主要取决于主服务器的requirepass和从服务器的masterauth字段,如果需要验证,从服务会发送AUTH + masterauth。主服务器会将该值与自己的requirepass比较,相同则通过验证
  • 从服务器向主服务器发送自己监听的端口,让主服务器连接,通过这个连接同步数据;
  • 从服务器向主服务器发送PSYNC命令,开始执行同步操作。注意:在这一步后,主服务器也充当的是从服务器的客户端,因为只有成为从服务器的客户端,主服务器才能将缓冲区中的命令发送给从服务器执行。
  • 在完成了同步的操作后,主从服务器就会进入到命令传播阶段,这时主服务器只需一直将自己执行的写命令发送给从服务器,从服务器执行,就可以保证主从服务器数据一致。

心跳检测

在命令传播阶段,为了监测主从复制的情况,从服务器默认会以每秒一次的频率像主服务器发送命令(心跳检测):REPLCONF ACK <replication_offset> ,replication_offset是自己得复制偏移量。主要有三个作用:
(1)检测主从服务器的网络连接:如果主服务器超过1s,没有收到从服务器的REPLCONF ACK 命令,则主服务器就知道从服务器的连接出了问题,可以通过向主服务器发送 INFO replication命令,在列出的从服务器烂中,通过lag字段可以知道从服务器最后一次给主服务器发送REPLCONF ACK命令距离现在过去了多少秒。
(2)辅助实现min-slaves配置选项,redis.conf配置文件中min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令。简单来说就是,从服务器的数量不够了,或者每个从服务器的lag太大了,都会停止复制。
(3)检测命令丢失,如果因为网络问题导致主服务器发给从服务器的写命令丢失,主服务器通过replication_offset就知道命令丢了,去积压缓冲区找到重新发给从服务器。

五、主从模式的缺点

主从模型只解决了单点故障问题,没有主动通知机制,需要手动切换,仍然不是高可用,但是主从模型为高可用的实现已经打下了坚实的基础。后面两篇即将介绍的哨兵模式和集群模式实现了真正的高可用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四阶龙格库塔法求解一次常微分方程组(python实现)

四阶龙格库塔法求解一次常微分方程组一、前言二、RK4求解方程组的要点1. 将方程组转化为RK4求解要求的标准形式2. 注意区分每个方程的独立性三、python实现RK4求解一次常微分方程组1. 使用的方程组2. python代码3. 运行结果一、前言 之前在博客发布了关于使用四阶龙格库塔方法…

字节测试开发最牛教程,全栈Jmeter_性能测试(总结)

Jmeter_性能测试(4)&#xff1a; 性能测试脚本的优化 以PHP论坛为例&#xff1a;http://47.107.178.45/phpwind/ 根据上一篇的性能测试(3&#xff09;的脚本进行优化&#xff1b;见下图&#xff1a; 如上图中&#xff0c;把发帖和回帖的事务添加到随机控制器中&#xff0c;登…

一例cobalt Strike 反射式注入payload的分析

一例cobalt Strike payload 反射式dll注入的分析 QakBot(Qbot)与cobalt Strike恶意流量样本分析 | Demon (ggsec.cn)这篇博客中末尾提到了一个cobastrick的payload&#xff0c;这是一段shellcode&#xff0c;主要功能是的解密出一个dll&#xff0c;采用反射式注入的方式启动这…

EC 中的Keyboard Controller

Keyboard Controller简称KBC,它是EC芯片中一个用于处理Keyboard、Mouse的模块,也可以说,它只是一个通道,因为最后处理数据的还是交给EC 8032处理器去处理。KBC只处理挂在EC PS/2接口上的设备,假如接了个usb键盘或鼠标,那可不关它的事。PS/2设备只有两种,即Keyboard和Mou…

React 的设计理念(React 哲学)

文章目录React 的设计理念 的理解解决 CPU 瓶颈解决 IO 瓶颈React 的设计理念 的理解 从 React 官网中的 React 哲学文档中&#xff0c;可以看出 React 目的是实现快速响应 影响快速响应的因素&#xff1a;计算能力和网络延迟&#xff0c;即 CPU 和 IO 的瓶颈 解决 CPU 瓶颈 …

再见 ETH India 2022 建设者们 让我们一起回顾这个美好的建设周

很难超越的1700名黑客马拉松比赛&#xff0c;但是以太坊社区出现并打破了ETH India 2022 的新记录。来自321个城市的2000名与会者在短短的一个周内构建并部署了多达459个项目到以太坊生态系统中。你可能错过了过去一周发生的一切&#xff0c;但幸运的是&#xff0c;我们收集了所…

智能设备带来全新体验,打造未来智能生活

随着科技的快速发展&#xff0c;我们的生活变得越来越智能化&#xff0c;近年来智能设备已经遍布我们生活的各个领域&#xff0c;推动了生产能力和质量&#xff0c;给人们的生活带来了极大的便利。智能设备的出现和发展是时代进步的必然产物&#xff0c;高效、安全、准确性高&a…

【蓝桥杯选拔赛真题50】Scratch小猫跑步 少儿编程scratch图形化编程 蓝桥杯选拔赛真题讲解

目录 scratch小猫跑步 一、题目要求 编程实现 二、案例分析 1、角色分析

mybatis写postgis原生sql需要加强转类型 以及 配置geometry类型转换

mybatis类型转换器处理PostGis数据库geometry类型转换_SomeOtherTime的博客-CSDN博客_java mybatis postgis 在navicate写insert into "district" (name,code,position) VALUES(cesh2i3,ac1v3,SRID4326;MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0))) 不会报错。 在mybat…

[附源码]计算机毕业设计高校学生信息采集系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

虹科案例 | 光热测厚技术助力PSA无底漆涂装方案

法国标致雪铁龙集团&#xff08;PSA Peugeot Citron&#xff09;最开始是生产胡椒研磨机&#xff0c;然后将其产品组合扩展到自行车等&#xff0c;现在已经是欧洲第二大汽车制造商。巴黎郊外的普瓦西&#xff08;Poissy&#xff09; 工厂安装了法国首个紧凑型水性喷漆工艺&…

漏洞预警| ThinkPHP多版本存在远程代码执行漏洞

棱镜七彩安全预警 近日网上有关于开源项目 ThinkPHP 存在远程代码执行漏洞&#xff0c;棱镜七彩威胁情报团队第一时间探测到&#xff0c;经分析研判&#xff0c;向全社会发起开源漏洞预警公告&#xff0c;提醒相关安全团队及时响应。 项目介绍 ThinkPHP是一个快速、兼容而且…

制定项目管理计划的10个步骤

一个协调完美、透明、时间表具体且准确的项目管理计划&#xff0c;将大大有助于你的项目按时完成。以下是制定项目计划的10个基本步骤。 第1步&#xff1a;与利益相关者讨论计划和关键部分 项目计划由活动文件组成&#xff0c;这些文件为所有直接或间接参与项目的人提供指导。…

如何开通股票接口中的StockQuoteRecord功能?

股票接口中的StockQuoteRecord&#xff0c;也就是十档行情快照&#xff0c;在传统的行情软件中只能看到委托数量&#xff0c;而无法知道这些数据是如何形成的。 下面看一下股票接口StockQuoteRecord&#xff08;十档行情快照&#xff09;的说明&#xff1a; 字段名 类型 备…

【数集项目之 MCDF】(三) 仲裁器 arbiter

接下来进行仲裁器 arbiter的设计。根据设计文档&#xff0c;我们知道从输入总共有3个通道&#xff0c;而这三个通道很有可能都接收到数据可以进行发送。而arbiter就是综合优先级、是否有包可以发送等因素&#xff0c;选择一个通道来进行发送。形象的可以将arbiter比喻成“一个多…

FineReport可视化数据分析-图表对象属性

1.概述 1.1 单个系列对象属性 属性 类型 说明 this.points Array 当前系列的所有数据点 this.name String 当前系列的名字&#xff0c;跟图例显示的系列名一致 this.type String 当前系列的图表类型&#xff0c;目前包括的类型如下图所示&#xff1a; 1.2 单个数…

图解TCP_IP 第5版

图解TCP_IP 第5版1.7.1 面向有连接型与面向无连接型1.7.2 电路交换与分组交换1.7.3 单播、广播、多播和任播1.9.1 通信媒介1.9.1 传输速率、带宽和吞吐量1.9.2 网卡1.9.3 中继器与集线器1.9.4 网桥/2 层交换机1.9.5 路由器/3层交换机1.9.6 4~7 层交换机1.9.7 网关2.2.1 TCP/IP …

matplotlib安装及使用

目录 1、Matplotlib简介 2、Matplotlib安装 3、Matplotlib导入 4、Matplotlib基本应用 5、画图种类 5.1、Scatter散点图 5.2、条形图 5.3、等高线图 5.4、Image图片 5.5、3D图像 6、多图合并显示 6.1、Subplot多合一显示 6.2、SubPlot分格显示 6.3、图中图 6.4、…

保护大数据安全的十大行为准则

大数据安全是指在存储、处理和分析过于庞大和复杂的数据集时&#xff0c;采用任何措施来保护数据免受恶意活动的侵害&#xff0c;传统数据库应用程序无法处理这些数据集。大数据可以混合结构化格式(组织成包含数字、日期等的行和列)或非结构化格式(社交媒体数据、PDF 文件、电子…

YourKit Java Profiler 命令行工具自动弹出

YourKit Java Profiler 命令行工具自动弹出 识别处理器和内存从来都不容易。 YourKit为程序开发了两个阶段的开发和开发革命。 YourKit Java Profiler软件的功能和特点&#xff1a; 以任何方式为团队和公司在开发、测试和生产中&#xff0c;以不同的操作系统、本地和远程方式指…