[Redis]主从模式

启动主从复制

由于我们只有一台机器,所以我们只能在机器上开多个redis程序来演示不同的机器

 因为一个端口号只能被一个进程绑定,所以我们需要修改配置,绑定不同的端口号,并且还要修改工作目录(数据持久化的位置)

规划从节点

redis的配置文件在/etc/redis/redis.conf中,我们决定在这里创建一个redis-slave-conf目录,用来存放从节点的配置文件。

然后通过cp命令把原配置文件拷贝到redis-slave-conf目录中

然后创建再在/etc/redis/中创建第二个目录redis-slave-db,再在里面创建slave1和slave2目录,

配置从节点

进入第一个从节点配置文件

修改第一个从节点工作目录,并配置端口号为6380

进入第二个从节点配置文件 

修改第二个从节点工作目录,并配置端口号为6381

 另外,也可以配置daemonize 为 yes,意思是按照后台进程的方式运行

建立主从关系

到现在,我们就有了三个redis,但是这三个redis并没有构成主从关系。

我们三种方式建立主从关系

1.配置文件

2.在redis-server启动命令时加入 --slaveof {主节点地址} {主节点端口}

3.使用redis命令:slaveof {主节点地址} {主节点端口}

 这里第二种方法和第三种方法都是临时设置,如果redis重启,是会还原的

为了让主从关系持久生效,我们需要修改配置文件

在文件末尾加上一行 slaveof 127.0.0.1 6379

(后面两个参数是指定主节点IP地址和redis端口,因为主节点就在本机,所以指定本地环回)

两个文件都添加

启动redis

启动主节点

启动从节点

 使用netstat观察进程启动情况

 这里前三个代表三个redis进程(6379,6380,6381)处于监听状态

后四个

tcp   0   0 127.0.0.1:6379       127.0.0.1:42527      ESTABLISHED 13620/redis-server  
tcp   0   0 127.0.0.1:42711      127.0.0.1:6379       ESTABLISHED 13760/redis-server  
tcp   0   0 127.0.0.1:6379       127.0.0.1:42711      ESTABLISHED 13620/redis-server  
tcp   0   0 127.0.0.1:42527      127.0.0.1:6379       ESTABLISHED 13785/redis-server

两个一组,可以分为两组

一组表示一个从节点和主节点建立的tcp连接,主节点相当于服务器,从节点相当于客户端

端口 42527 和 42711 是从节点连接主节点的客户端端口

作用在于:

  • 数据同步:从节点连接到主节点以获取最新的数据。这包括数据快照(RDB)和追加文件(AOF)。
  • 命令传播:主节点将写命令传播到从节点,以确保所有节点数据一致。
  • 心跳机制:从节点发送定期 PING 请求,以确保连接的健康状态,并检测主节点是否存活。

 测试主从

 首先我们在主节点插入一个数据key1

在从节点立刻就能get到 

 主从复制测试成功

从节点是不能写入数据的

查询主从信息

使用info replication命令查询

主节点:

解释输出:

  • role: 当前节点的角色是主节点 (master)
  • connected_slaves: 当前连接的从节点数量是 2
  • slave0: 第一个从节点的信息,IP 地址为 127.0.0.1,端口为 6380,状态为 online,当前复制偏移量为 2565,延迟为 1
  • slave1: 第二个从节点的信息,IP 地址为 127.0.0.1,端口为 6381,状态为 online,当前复制偏移量为 2565,延迟为 1
  • master_replid: 主节点的复制 ID,用于标识主节点的唯一标识。
  • master_replid2: 备用的主节点复制 ID。
  • master_repl_offset: 主节点的复制偏移量是 2565,表示主节点当前的复制进度。
  • second_repl_offset: 第二个复制偏移量。
  • repl_backlog_active: 复制回放是否处于活动状态 (1 表示活动)。
  • repl_backlog_size: 复制回放缓冲区大小为 1048576 字节。
  • repl_backlog_first_byte_offset: 复制回放缓冲区的第一个字节偏移量。
  • repl_backlog_histlen: 复制回放缓冲区历史长度为 2565,表示历史记录中包含了多少条复制信息。

 从节点:

解释输出:

  • role: 当前节点的角色是从节点 (slave)
  • master_host: 连接的主节点的 IP 地址是 127.0.0.1
  • master_port: 连接的主节点的端口是 6379
  • master_link_status: 与主节点的连接状态是 up,表示连接正常。
  • master_last_io_seconds_ago: 距离上次与主节点通信的时间是 1 秒。
  • master_sync_in_progress: 没有进行数据同步操作。
  • slave_repl_offset: 从节点当前的复制偏移量是 2257
  • slave_priority: 从节点的优先级为 100。在故障转移时,优先级较高的从节点可能会被选为新的主节点。
  • slave_read_only: 从节点设置为只读模式 (1)。
  • connected_slaves: 当前连接的从节点数量是 0
  • master_replid: 主节点的复制 ID,用于标识主节点的唯一标识。
  • master_replid2: 备用的主节点复制 ID。
  • master_repl_offset: 主节点的复制偏移量是 2257,与主节点的数据同步的偏移量。
  • second_repl_offset: 第二个复制偏移量。
  • repl_backlog_active: 复制回放是否处于活动状态 (1 表示活动)。
  • repl_backlog_size: 复制回放缓冲区大小为 1048576 字节。
  • repl_backlog_first_byte_offset: 复制回放缓冲区的第一个字节偏移量。
  • repl_backlog_histlen: 复制回放缓冲区历史长度为 2257,表示历史记录中包含了多少条复制信息。

 断开主从复制关系

使用redis命令 slaveof no one断开现有的主从复制关系

从节点使用这个命令后,就不再属于其他节点了,里面的数据也不会抛弃,但是不会再同步主节点的数据了。

从节点断开后,变成主节点

建立主从复制关系流程

1)保存主节点(master)的信息

2)建立tcp连接

从节点会通过定时任务每秒检查主节点的连接状态,并尝试建立基于 TCP 的网络连接。如果连接失败,定时任务会无限重试,直到连接成功或用户停止主从复制。

3)发送ping命令

一旦 TCP 连接建立成功,从节点会发送一个ping 命令到主节点,确认主节点在应用层上是否工作正常。如果从主节点未能及时回复pong,从节点会断开连接,等待下次定时任务重新建立连接。

 4)权限验证

如果主节点配置了requirepass参数来启用密码验证,从节点需要通过masterauth参数来设置密码进行验证。如果验证失败,从节点将停止复制。

5)同步数据集

全量同步和部分同步(后面讲)

6)命令持续复制

一旦从节点完成了初始数据同步,主节点会持续地将所有写操作命令发送给从节点。从节点执行这些命令,以确保数据与主节点保持一致。这些命令是通过主节点的复制缓冲区传递的,从节点会实时应用这些命令。

同步数据集

再建立主从关系时,会进行数据同步,也就是把主节点已有的数据同步给从节点

redis提供了psync命令来完成数据同步,这个命令不需要手动执行,在建立主从复制关系时会自动调用,是从节点调用psync,从主节点拉取数据

psync replicationid offset

其中,replicationid用来唯一标识主节点,建立主从关系时主节点自动生成

(可以通过info replication 命令查看,是master_replid项)

(还有一个master_replid2 项,一般没用,如果主节点挂了,从节点就会生成一个自己的id,然后把原来主节点的id存放在master_replid2中,等后续恢复)

offset 偏移量

主节点和从节点都会维护一个偏移量,表示数据流中的位置

主节点维护一个全局的复制偏移量,每当有新的写操作发生时,这个偏移量会增加。从节点也会维护自己的复制偏移量,表示它已经接收到并处理的数据位置。

所以,当从节点的偏移量和主节点的偏移量相同时,认为从节点的数据与主节点的数据是一致的。

从节点每秒种上报自身的复制偏移量给主节点

这里replicationid和offset两个变量标识了一个数据集合,比如从A时刻之前的主节点上的数据

当从节点发送psync命令给主节点后,主节点会决定如何给从节点同步数据 

根据情况不同,分为全量复制部分复制

全量复制的情况:

1.从节点首次和主节点进行数据同步

2.需要同步的数据超出主节点的复制积压缓冲区

部分复制的情况:

1.对于已经进行过一次全量同步的从节点,如果复制过程中连接中断了,从节点会尝试部分同步。

2.大部分数据都是一致的

 全量复制

1)从节点发送 psync 命令给主节点进行数据同步,由于是第一次进行复制,从节点没有主节点的运行 ID 和复制偏移量,所以发送 psync ? -1

2)主节点根据命令,解析出要进行全量复制,回复 +FULLRESYNC 响应。

3)从节点接收主节点的运行信息进行保存。

4)主节点执行 bgsave 进行 RDB 文件的持久化。

5)主节点发送 RDB 文件给从节点,从节点保存 RDB 数据到本地硬盘。

6)主节点将从生成 RDB 到接收完成期间执行的写命令,写入缓冲区中,等从节点保存完 RDB 文件后,主节点再将缓冲区内的数据补发给从节点,补发的数据仍然按照 rdb 的二进制格式追加写入到收到的 rdb 文件中,保持主从一致性。

7)从节点清空自身原有旧数据。

8)从节点加载 RDB 文件得到与主节点一致的数据。

9)如果从节点加载 RDB 完成之后,并且开启了 AOF 持久化功能,它会进行 bgrewrite 操作,得到最近的 AOF 文件。

如果开启了AOF,可能会产生很多AOF日志,所以还会对AOF日志进行整理

部分复制

全量复制因为要网络传输所有数据,开销太大,但有时候只需要复制部分数据,比如当网络抖动的时候,可能从节点只有几秒钟和主节点断开连接,也就是说从节点只缺少几秒钟的数据,这时候就不需要全量复制

 1)当主从节点之间出现网络中断时,如果超过 repl-timeout 时间,主节点会认为从节点故障并终端复制连接。

2)主从连接中断期间主节点依然响应命令,但这些复制命令都因网络中断无法及时发送给从节点,所以暂时将这些命令滞留在复制积压缓冲区中。

3)当主从节点网络恢复后,从节点再次连上主节点。

4)从节点将之前保存的 replicationId 和 复制偏移量作为 psync 的参数发送给主节点,请求进行部分复制。

5)主节点接到 psync 请求后,进行必要的验证。随后根据 offset 去复制积压缓冲区查找合适的数据, 并响应 +CONTINUE 给从节点。

6)主节点将需要从节点同步的数据发送给从节点,最终完成一致性。

复制积压缓冲区

复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为 1MB,当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区,

这个相当于一个基于数组实现的环形队列,队列满后,新数据会覆盖最老的数据

如果当前从节点需要的数据, 已经超出了主节点的积压缓冲区的范围, 则无法进行部分复制, 只能全量复制了.

 实时复制(命令传播)

当从节点和主节点已经同步好数据了,后续,主节点还会源源不断收到写操作,也需要把后续的操作都同步给从节点。

主节点会和从节点建立tcp连接,也就是上面我们查到的。主节点把自己收到的修改数据的请求,通过tcp连接发给从节点,从节点再根据发来的修改请求,修改内存中的数据。

心跳机制

在进行实时复制的时候,需要保证连接处于可用状态

主节点:默认每10秒给从节点发送一个ping命令,从节点收到就返回pong

从节点:默认每隔1秒就给主节点发送一个特定的请求,上报复制数据的进度(偏移量)

(以上数字都可以在配置文件中修改)

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

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

相关文章

七天速通javaSE:第六天 对象:类与对象

文章目录 前言一、认识对象1. 编程思想1.1 面向过程1.2 面向对象 2. 面向对象编程(oop) 二、再识方法1. 修饰符2. 参数的传递与赋值2.1 值传递2.2 引用传递 总结: 三、创建与初始化对象1. 类与对象的关系2. 创建与初始化对象 四、构造函数1. …

Debugging using Visual Studio Code

One of the key features of Visual Studio Code is its great debugging support. VS Code’s built-in debugger helps accelerate your edit, compile, and debug loop. Debugger extensions VS Code 内置了对 Node.js 运行时的调试支持,可以调试 JavaScript、TypeScript…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手,该工具基于GPT-4-200k设计并实现其功能,可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …

Echarts地图实现:杭州市困难人数分布【动画滚动播放】

Echarts地图实现:杭州市困难人数分布 实现功能 杭州市地区以及散点图分布结合的形式数据展示动画轮播可进去杭州市下级地区可返回杭州市地图展示 效果预览 实现思路 使用ECharts的地图和散点图功能结合实现地区分布通过动画轮播展示数据变化实现下级地区数据的展…

【Python】已解决ModuleNotFoundError: No module named ‘tensorflow‘

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决ModuleNotFoundError: No module named ‘tensorflow‘ 一、分析问题背景 ModuleNotFoundError: No module named ‘tensorflow’ 是一个常见的错误,通常在Pytho…

汽车电子工程师入门系列——汽车操作系统架构学习研究-AUTOSAR

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

chrome.storage.local.set 未生效

之前chrome.storage.local.set 和 get 一直不起作用 使用以下代码运行成功。 chrome.storage.local.set({ pageState: "main" }).then(() > {console.log("Value is set");});chrome.storage.local.get(["pageState"]).then((result) > …

有了文章生成器,轻易满足你对文章的需求

写文章对于大多数人来说并不轻松,往往一篇文章写作完成是需要消耗一个人的大量时间与精力的,如果想要写的文章特别好,那么还要再花一点时间去进入后期的修改。就没有什么方法让大家轻易的去完成文章写作吗?答案是有的,…

将 Cohere 与 Elasticsearch 结合使用

本教程中的说明向你展示了如何使用推理 API 使用 Cohere 计算嵌入并将其存储起来,以便在 Elasticsearch 中进行高效的向量或混合搜索。本教程将使用 Python Elasticsearch 客户端执行操作。 你将学习如何: 使用 Cohere 服务为文本嵌入创建推理端点&…

【python刷题】【深基5.例5】旗鼓相当的对手

题目描述 算法思路 用二维数组data存放成绩数据。双重循环遍历所有的组合,因为自己不能和自己比,所以要注意内层遍历的起始位置。新建一个数组用来得出各个科目的分差,便于代码的书写。由于分差计算出来会出现负数,所以比较的时候…

python办公自动化之pandas

用到的库:pandas 实现效果:创建一张空白的表同时往里面插入准备好的数据 代码: import pandas # 准备好要写入的数据,字典格式 data{日期:[7.2,7.3],产品型号:[ca,ce],成交量:[500,600]} dfpandas.DataFrame(data) # 把数据写入…

学习C语言第一步:300行代码实现输出“Hello World“

学习所有语言的第一步几乎都是在控制台输出"Hello World",C语言也是如此,C语言支持结构化编程、词汇范围和递归等特性,C语言编写的代码在稍作修改或无需修改的情况下可以在多种不同的操作系统和平台上编译和运行,同时运行速度极快。…

[HBM] HBM TSV (Through Silicon Via) 结构与工艺

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 全文 3300 字。 1 概念 1.1 什么是HBM TSV 使用 TSV 堆叠多个DDR DRAM成为一块HBM, 成倍提高了存储器位宽, 一条位宽相当于高速公路的一条车道, 车道越多&#xff…

期末考试后班主任如何发布学生成绩?

期末考试成绩一出,家长们便急切地想要了解孩子的学习情况。以往,老师们需要一个个私信家长,将成绩单发送出去,这项工作既繁琐又耗时。期末之际,老师们的工作本就繁重,如何有效减轻他们的负担,让…

Prompting已死?DSPy:自动优化LLM流水线

在 LLM 应用中,如何优化一个 pipeline 的流程一直是一个比较头疼的问题。提示词作为一个预定义字符串,往往也没有很好地优化方向。本文中的 DSPy 框架或许能在实际应用中对效果优化起到一定帮助。 当前,在 LLM 的应用中,大家都在探…

Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed

社区中有两个流行的零冗余优化器 (Zero Redundancy Optimizer,ZeRO)算法实现,一个来自DeepSpeed,另一个来自PyTorch。Hugging FaceAccelerate对这两者都进行了集成并通过接口暴露出来,以供最终用户在训练/微调模型时自主选择其中之…

EI CCIE学习笔记-SDAccess之一:SDAccess解决方案

Chapter 1 SD-Access Solution Proposal 1.1 概念引入 SDN三要素:集中控制、转控分离、可编程 DNA DNA:Digital Network Architecture数字网络架构 思科提出的跨园区,分支机构,WAN和扩展企业的企业网络架构它提供了一种开放,可扩…

C++操作系列(二):VSCode安装和配置C++开发环境

1. VSCode下载 进入VSCode的官网网页:Download Visual Studio Code - Mac, Linux, Windows 下载相应的版本: 2. 安装VSCode 安装到指定位置: 一路下一步,直至安装完成: 3. 安装C插件 3.1. 安装C/C 点击扩展图标&…

从头开始构建一个小规模的文生视频模型

OpenAI 的 Sora、Stability AI 的 Stable Video Diffusion 以及许多其他已经发布或未来将出现的文本生成视频模型,是继大语言模型 (LLM) 之后 2024 年最流行的 AI 趋势之一。 在这篇博客中,作者将展示如何将从头开始构建一个小规模的文本生成视频模型&a…

C语言力扣刷题1——最长回文字串[双指针]

力扣算题1——最长回文字串[双指针] 一、博客声明二、题目描述三、解题思路1、思路说明2、知识补充a、malloc动态内存分配b、free释放内存c、strlen求字符数组长度d、strncpy函数 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更…