redis高可用之主从部署

文章目录

  • 前言
  • 1. 同步以及命令传播
    • 1.1 同步
    • 1.2 命令传播
  • 2. 解决从服务器断线重连
    • 2.1 解决方案
  • 3. PSYNC命令
  • 4. 复制
      • 步骤1:设置主服务器的地址和端口
      • 步骤2:建立套接字连接 ——其实就是建立TCP连接
      • 步骤3:发送PING命令
      • 步骤4:身份验证
      • 步骤5:发送端口信息
      • 步骤6:同步
      • 步骤7:命令传播
  • 5. 心跳检测

前言

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选 项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制 的服务器为主服务器(master),而对主服务器进行复制的服务器则被 称为从服务器(slave),如图所示
主从
假设现在有两个redis服务器,地址分别为A:127.0.0.1:6379、B:127.0.0.1:1231,如果A向B发送以下命令:

SLAVEOF 127.0.0.1:6379

那么B服务器将成为A服务器的从服务器,A也会成为B 的主服务器。
进行复制中的主从服务器将保存相同的数据,概念上讲这种现象称为“数据库状态一致”。

1. 同步以及命令传播

1.1 同步

当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态。
从服务器对主服务器的同步操作需要通过向主服务器发送SYNC命令来完成,以下是SYNC命令的执行步骤:

1)从服务器向主服务器发送SYNC命令

2)收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令

3)当主服务器的BGSAVE命令执行完毕时,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行BGSAVE命令时的数据库状态

4)主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。

1.2 命令传播

从服务器第一次获取到数据以后的操作

为了让主从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作:主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。
在这里插入图片描述

2. 解决从服务器断线重连

为了解决旧版复制功能在处理断线重复制情况时的低效问题Redis从2.8版本开始,使用PSYNC命令代替SYNC命令来执行复制时的同步操作。
PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式:

  • 其中完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本一样,它们都是通过让主服务器创建并发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。
  • 而部分重同步则用于处理断线后重复制情况!当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器只要接收并执行这些写命令,就可以将数据库更新至主服务器当前所处的状态。

PSYNC命令的部分重同步模式解决了旧版复制功能在处理断线后重复制时出现的低效情况(老版是执行第一次同步步骤)。

2.1 解决方案

部分重同步功能由以下三个部分构成:

  • 主服务器的复制偏移量(replication offset)和从服务器的复制偏移量。

  • 主服务器的复制积压缓冲区(replication backlog)。

  • 服务器的运行ID(run ID)。

主要思想:(重要)

主从服务器都为一个复制偏移量,当主服务器与所有的从服务器复制偏移量相同的时候代表主从数据一致。主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N;从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值加上N。

同时主服务器会维护一个复制积压缓冲区,是一个有界的FIFO队列,它的拒绝策略并不是满了就丢,而是新来的把最老的顶出去。

主服务和从服务器都有ID,当从服务器第一次slaveOf请求主服务器的会记录下主服务器ID。

当某一个从服务器断线重连的时候会发送一个PSYNC命令,并且附带上主服务器ID以及从服务器的偏移量:

如果主服务器ID和当前的主服务器ID相同:

在主服务器的积压缓冲区中有此偏移量,那么主服务器只需要重新发送缺失的数据(部分重同步);

如果没有,那么会全量重同步。

如果主服务器ID和当前的主服务器ID不同:说明当前主服务器已经变更,需要全量重同步。

3. PSYNC命令

在这里插入图片描述

4. 复制

步骤1:设置主服务器的地址和端口

主服务器(127.0.0.1:6379)向从服务器发送以下命令:

SLAVEOF 127.0.0.1 6379

步骤2:建立套接字连接 ——其实就是建立TCP连接

从服务器主动发起连接
在这里插入图片描述
如果从服务器创建的套接字能成功连接(connect)到主服务器,那 么从服务器将为这个套接字关联一个专门用于处理复制工作的文件事件 处理器,这个处理器将负责执行后续的复制工作,比如接收RDB文件, 以及接收主服务器传播来的写命令,诸如此类。

而主服务器在接受(accept)从服务器的套接字连接之后,将为该 套接字创建相应的客户端状态,并将从服务器看作是一个连接到主服务 器的客户端来对待,这时从服务器将同时具有服务器(server)和客户 端(client)两个身份:从服务器可以向主服务器发送命令请求,而主 服务器则会向从服务器返回命令回复。

步骤3:发送PING命令

在这里插入图片描述

注意是从 —> 主

ping的作用:

  • 虽然主从服务器成功建立起了套接字连接,但双方并未使用该套 接字进行过任何通信,通过发送PING命令可以检查套接字的读写状态 是否正常。

  • 因为复制工作接下来的几个步骤都必须在主服务器可以正常处理 命令请求的状态下才能进行,通过发送PING命令可以检查主服务器能否正常处理命令请求

步骤4:身份验证

在这里插入图片描述

步骤5:发送端口信息

目前没什么用

步骤6:同步

在这一步,从服务器将向主服务器发送PSYNC命令,执行同步操作,并将自己的数据库更新至主服务器数据库当前所处的状态。

值得一提的是,在同步操作执行之前,只有从服务器是主服务器的客户端,但是在执行同步操作之后,主服务器也会成为从服务器的容户端:

  • 如果PSYNC命令执行的是完整重同步操作,那么主服务器需要成为从服务器的客户端,才能将保存在缓冲区里面的写命令发送给从服务器执行。
  • 如果PSYNC命令执行的是部分重同步操作,那么主服务器需要成为从服务器的客户端,才能向从服务器发送保存在复制积压缓冲区里面的写命令。

因此,在同步操作执行之后,主从服务器双方都是对方的客户端,它们可以互相向对方发送命令请求,或者互相向对方返回命令回复。正因为主服务器成为了从服务器的客户端,所以主服务器才可以通过发送写命令来改变从服务器的数据库状态,不仅同步操作需要用到这一点,这也是主服务器对从服务器执行命令传播操作的基础。

步骤7:命令传播

当完成了同步之后,主从服务器就会进入命令传播阶段,这时主服务器只要一直将自己执行的写命令发送给从服务器,而从服务器只要一直接收并执行主服务器发来的写命令,就可以保证主从服务器一直保持一致了。

5. 心跳检测

发送REPLCONF ACK命令对于主从服务器有三个作用:

  • 检测主从服务器的网络连接状态。

  • 辅助实现min-slaves选项。

  • 检测命令丢失。

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

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

相关文章

鸿蒙5.0发布时间已定!何处寻得移动开发加速器?

直接在百度上搜索「鸿蒙5.0发布时间」,出来的结果,那一个比一个焦虑~~ 百度的AI基于综合内容判断得出,鸿蒙5.0的发布时间在2023-04-17 百度知道推的答案是202年年4月中 但不管几月,“鸿蒙元年”似乎都是确定的,就是…

Linux切换jdk版本

参考文献:Linux 多个JDK的版本 脚本切换 - C小海 - 博客园 (cnblogs.com)

ZYNQ-7020 集成了运行NI Linux Real‑Time的实时处理器,支持FPGA二次开发

模拟和数字I/O,667 MHz双核CPU,512 MB DRAM,512 MB存储容量,Zynq-7020 FPGA CompactRIO Single-Board控制器 sbRIO‑9637是一款嵌入式控制器,在单块印刷电路板(PCB)上集成了运行NI Linux Real‑Time的实时处理器、用户…

RK3568 移植Ubuntu

使用ubuntu-base构建根文件系统 1、到ubuntu官网获取 ubuntu-base-18.04.5-base-arm64.tar.gz Ubuntu Base 18.04.5 LTS (Bionic Beaver) 2、将获取的文件拷贝到ubuntu虚拟机,新建目录,并解压 mkdir ubuntu_rootfs sudo tar -xpf u

解密高压开关柜内温度感知神器——无线测温传感器

具长期电网运行数据表明,电网电气设备故障大多是由于大电流运行、设备老化、绝缘水平下降等原因导致设备在高温条件下运行,从而引发燃烧,爆炸等严重事故。因此准确的掌握电气设备温度是预防此类问题的关键。 开关柜无源无线测温传感器采用CT取…

virtualenv虚拟环境的安装使用教程

让我们先思考这样一种情景:我们用python来开发一个项目,那么这个项目肯定会依赖很多的第三方库,这些第三方的库通过pip安装到全局区当中,而对于不同的项目使用到的库可能都有所不同,但是这些项目的库都安装到全局区当中…

【JavaEE进阶】MyBatis⼊⻔

文章目录 🌲什么是MyBatis?🌳准备⼯作🚩创建⼯程🚩数据准备🚩配置数据库连接字符串🚩 在项⽬中,创建持久层接⼝UserInfoMapper 🍃单元测试🚩使⽤Idea⾃动⽣成测试类 🍀打…

6 时间序列(不同位置的装置如何建模): GRU+Embedding

很多算法比赛经常会遇到不同的物体产生同含义的时间序列信息,比如不同位置的时间序列信息,风力发电、充电桩用电。经常会遇到该如此场景,对所有数据做统一处理喂给模型,模型很难学到区分信息,因此设计如果对不同位置的…

芯课堂 | SWM34S系列驱动TFT-LCD显示模组应用基本注意事项

1、确认硬件的连接、包括电源、地、RGB 数据线、DCLK\DE\HSYNC\VSYNC 等,显示模组有 DISP、RESET、CS、SCL、SDA 等。 2、确认各电压的正常,包括电源,部分有 IOVCC、VGL、VGH、VCOM 等电压 3、如果应用的 TFT-LCD 模组非演示例程中已适配调…

动态血糖监测市场调研:预计2029年将达到13亿美元

血糖监测即是对于血糖值的定期检查。实施血糖监测可以更好的掌控糖尿病患者的血糖变化,对生活规律,活动,运动,饮食以及合理用药都具有重要的指导意义,并可以帮助患者随时发现问题,及时到医院就医。 动态血糖…

LinkedList源码

LinkedList源码 总结 LinkedList数据结构采用链表,内部封装了Node类,set方法先让Node的pre指针指向之前的last节点,然后判断头节点知否为空,如果为空则让first指针指向该节点,不过不为空则让尾节点的next指针指向该节…

Linux:动静态库的概念制作和底层工作原理

文章目录 动静态库基础认知动静态库基本概念静态库的制作库的概念包的概念 静态库的使用第三方库小结 动态库的制作动态库的使用动态库如何找到内容?小结 动态库加载库和程序都要加载可执行程序的地址问题地址问题逻辑地址和平坦模式绝对编址和相对编址与位置无关码…

vue2(Vuex)、vue3(Pinia)、react(Redux)状态管理

vue2状态管理Vuex Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它使用集中式存储管理应用的所有组件的状态,以及规则保证状态只能按照规定的方式进行修改。 State(状态):Vuex 使用单一状态树,即一个对象包含全部的应用层…

高防IP如何保护服务器

首先我们要知道什么是高防IP~ 高防IP是指高防机房所提供的ip段,主要是针对互联网服务器遭受大流量DDoS攻击时进行的保护服务。高防IP是目前最常用的一种防御DDoS攻击的手段,用户可以通过配置DDoS高防IP,将攻击流量引流到高防IP,防…

[pytorch入门] 3. torchvision中的transforms

torchvision中的transforms 是transforms.py工具箱,含有totensor、resize等工具 用于将特定格式的图片转换为想要的图片的结果,即用于图片变换 用法 在transforms中选择一个类创建对象,使用这个对象选择相应方法进行处理 能够选择的类 列…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点: 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容: …

Python实现分段函数求导+绘制函数曲线

代码如下&#xff1a; import sympy as sp import numpy as np import matplotlib.pyplot as plt from sympy.utilities.lambdify import lambdify# 定义符号变量 x sp.symbols(x) # expr sp.Piecewise((0,0< x < 5), (1, x > 5)) # 定义分段原函数 #-------------…

manacher算法 求最长回文串

本题链接&#xff1a;用户登录 题目&#xff1a; 样例&#xff1a; 输入 aa1ABA1b 输出 5 思路&#xff1a; 根据题目意思&#xff0c;求出最长回文串&#xff0c;我们可以用模板 manacher 算法 求最长回文串。 manacher算法 求最长回文串 核心有两个步骤。 一、将字符串转化…

框架概述和MyBatis环境搭建

学习视频&#xff1a;1001 框架概述_哔哩哔哩_bilibili 目录 框架概述 1.1为什么要学 1.2框架的优点 1.3 当前主流框架 Spring框架 Spring MVC框架 MyBatis框架 ​编辑 Spring Boot框架 Spring Cloud框架 1.4 传统JDBC的劣势 MyBatis 2.1 MyBatis概述 ORM框架工作原…

分布式日志

1 日志管理 1.1 日志管理方案 服务器数量较少时 直接登录到目标服务器捞日志查看 → 通过 rsyslog 或shell/python 等脚本实现日志搜集并集中保存到统一的日志服务器 服务器数量较多时 ELK 大型的日志系统&#xff0c;实现日志收集、日志存储、日志检索和分析 容器环境 …