[Redis]主从模式

news2024/11/17 17:54:10

启动主从复制

由于我们只有一台机器,所以我们只能在机器上开多个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.coloradmin.cn/o/1867968.html

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

相关文章

ChatTTS源码部署

感谢阅读 默认已完成的操作准备工作下载源码安装依赖下载补丁(报错在运行) 界面展示(discord上有各种补丁,我的加了UI补丁和音色增强)提示词常用(这个每个音基本都能生效)语调类语速类情感类 默认已完成的操作 python版本>3.9 cuda版本的…

3D渲染时如何提高GPU的使用率?这7点告诉你

GPU 正逐渐取代 CPU 在 3D 渲染中的地位。我们看到许多 GPU 渲染器如 Redshift、Octane、FStorm 等不断推出。以前只支持 CPU 渲染的渲染器,如 Arnold、V-Ray、Renderman、Keyshot 等,现在也开始支持 GPU 渲染。实时渲染的发展使 GPU 更受欢迎&#xff0…

梗图生成器突然爆红;ElevenLabs发布IOS APP 高质量语音朗读手机各种文本内容;开源工作流架构ControlFlow

✨ 1: 梗图生成器 fabianstelzer 在Glif做的一个超强meme生成器 Glif 是一个工作流,能生成文字图片和视频,用工作流的形式可以完成很多的花样来。 最近爆红的梗图生成器,WOJAK MEME GENERATOR ,也是用工作流的形式来生成这些有…

TiDB-从0到1-数据导出导入

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、数据导出 TiDB中通过Dumpling来实现数据导出,与MySQL中的mysqldump类似,其属于…

如何选择适合你的免费电子合同软件?八款工具深度对比

主流的8款免费合同软件包括:国内的e签宝、法大大、上上签、契约锁,以及国外的SignWell、PandaDoc、Signaturely、HelloSign和SignRequest。 随着技术的进步,尤其是区块链技术的应用,电子合同的安全性和可信度正在逐渐增强。这些技…

如何提取mac app中的应用程序图标 x.app图标位置

在macos系统中安装的应用程序 .app的图标都是 以 .icns结尾的,默认位于 .app应用程序包中的Contents/Resources/目录下,只要是在这个目录下的 .icns文件就是这个应用的图标,如:mac版微信的图标就是 /Applications/WeChat.app/Co…

5个顶级开源Agent框架,你必须知道!

进入2024年,人工智能的发展已经达到了前所未有的高度,尤其是在Agent框架这一领域,出现了几个引人注目的技术成果。这些框架在智能规划、用户体验增强、记忆处理、以及大型模型调用等方面有着卓越表现,对AI界的未来发展提供了值得期…

利用多模态大模型,构建自动驾驶场景检索解决方案 | 创新场景

ITValue 痛点 在自动驾驶数据闭环的业务场景中,企业面临的挑战是难以高效的从PB级的视频和图片中选取有价值的数据,以训练和优化自动驾驶算法。 解决方案 为解决该挑战,亚马逊云科技利用大语言模型和图像文本多模态嵌入空间架构,构…

CY5-NHS生物标记应用146368-14-1

在生物科学研究和技术应用领域,荧光标记技术已成为一种科研工具。其中,CY5-NHS以其荧光特性和标记能力,在生物标记应用中扮演着科研角色。 CY5-NHS的特性与优势 CY5-NHS是一种荧光标记试剂,其荧光基团CY5赋予其强烈的荧光信号和…

【vue3】【vant】 移动本草纲目案例发布收藏项目源码

更多项目点击👆👆👆完整项目成品专栏 【vue3】【vant】 移动本草纲目案例发布收藏项目源码 获取源码方式项目说明:其中功能包括 项目包含:项目运行环境文件截图 获取源码方式 加Q群:632562109项目说明&am…

flink的窗口

目录 窗口分类 1.按照驱动类型分类 1. 时间窗口(Time window) 2.计数窗口(Count window) 2.按照窗口分配数据的规则分类 窗口API分类 API调用 窗口分配器器: 窗口函数 增量聚合函数: 全窗口函数…

llamafactory-llama3微调中文数据集

一、定义 https://github.com/SmartFlowAI/Llama3-Tutorial/tree/main 基准模型测试opencompass 离线测评数据准备微调训练合并测试人工审核对比 二、实现 基准模型测试 基准模型 llama3-8b https://zhuanlan.zhihu.com/p/694818596? https://github.com/SmartFlowAI/Llam…

什么样的台灯适合学生使用?五款暑假必入护眼大路灯分享

什么样的台灯适合学生使用?现在近视越来越低龄化,戴眼镜的小朋友越来越多,每每看着自己孩子眼睛贴到作业本上写作业,我的心都会提到嗓子眼。去医院一检查,果然,远视储备即将告罄,必须要防护了&a…

深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径

文章目录 一、分批渲染1、setTimeout定时器分批渲染2、使用requestAnimationFrame()改进渲染2.1、什么是requestAnimationFrame2.2、为什么使用requestAnimationFrame而不是setTimeout或setInterval2.3、requestAnimationFrame的优势和适用场景 二、滚动触底加载数据三、Elemen…

【项目实训】解决前后端跨域问题

由于前端框架使用vue,后端使用flask,因此需要解决前后端通信问题 在vue.config.js中修改 module.exports defineConfig({transpileDependencies: true,lintOnSave:false, }) // 跨域配置 module.exports {devServer: { //记住&#x…

2024 年适用于 Windows 11/10/8/7 的最佳 SSD 磁盘克隆软件

磁盘克隆软件对于用户在发生数据灾难时保证数据/系统安全至关重要。克隆软件可以创建驱动器的副本并保持数据相同。如果发生数据灾难,您可以设置克隆驱动器以克隆回数据/驱动器。或者您可以直接使用克隆的驱动器继续工作。 除了传统的 HDD,Windows 11/1…

使用nvm切换node版本时报错:exit status 1解决办法

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

C++学习/复习20--继承的权限/向上转换/重定义/默认成员函数/友元/静态成员/菱形虚拟继承/组合

一、继承的概念 二、继承的权限 三、向上转换 四、重定义(隐藏) 五、派生类的默认成员函数 六、继承与友元 七、继承与静态成员 八、菱形继承 数据冗余与二义性 虚拟继承(virtual) 九、继承组合

【ARM】MCU和SOC的区别

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解SOC芯片和MCU芯片的区别 2、 问题场景 用于了解SOC芯片和MCU芯片的区别,内部结构上的区别。 3、软硬件环境 1)、软件版本:无 2)、电脑环境:无 3&am…

Java洗鞋预约小程序源码

💥洗鞋神器来袭!轻松预约,让你的鞋子焕然一新👟 🎉 告别洗鞋烦恼,洗鞋预约小程序来啦! 你是不是常常为洗鞋而烦恼?手洗太累,送去洗衣店又贵又麻烦。现在,好…