【redis-07】redis实现主从复制架构和底层原理

news2024/11/24 14:24:09

redis系列整体栏目


内容链接地址
【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325
【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756
【三】redis缓存穿透、缓存击穿、缓存雪崩https://zhenghuisheng.blog.csdn.net/article/details/142577507
【四】redisson实现分布式锁实战和源码剖析https://zhenghuisheng.blog.csdn.net/article/details/142646301
【五】redis保证和mysql数据一致性https://zhenghuisheng.blog.csdn.net/article/details/142687101
【六】redis的stream流实现消息中间件https://zhenghuisheng.blog.csdn.net/article/details/142721269
【七】redis实现主从复制架构和底层原理https://zhenghuisheng.blog.csdn.net/article/details/142734375

如需转载,请输入:https://blog.csdn.net/zhenghuishengq/article/details/142734375

redis实现主从复制架构和底层原理

  • 一,redis的主从架构搭建
    • 1,redis安装
    • 2,配置redis主结点
    • 3,配置redis从结点
    • 4,主从结点的数据同步
    • 5,主从架构底层原理
      • 5.1,启动时的复制
      • 5.2, 实时数据同步
      • 5.3,断线重连后的同步

一,redis的主从架构搭建

在前面的文章中,讲解了redis的持久化,主要有rdb,aof以及混合持久化,因此有了这些持久化,就可以搭建出一套主从架构,对整个系统实现主从复制和读写分离的操作。其底层思想也简单,就是把持久化的文件拉取过来再次的执行一遍,和mysql的binlog原理是一样的。

1,redis安装

前面的文章是本人直接通过docker安装的单机版,如果用docker搭建集群就不太友好,因此手动的安装一下redis,服务器用的是centos7版本

首先下载安装包,和之前版本一样选择6.2.6版本,本人这里的安装路径放在 /usr/local/software/redis

wget http://download.redis.io/releases/redis-6.2.6.tar.gz

随后执行解压操作,通过tar命令执行

tar -axvf redis-6.2.6.tar.gz

随后切入到redis的解压目录,执行 make 命令操作

make

在这里插入图片描述

在make完没问题之后,也可以通过以下命令测试是否真的成功,都会返回一些ok状态

sudo make test

最后执行安装命令

sudo make install

然后切入到这个安装目录下的src目录下,最后执行这个redis的客户端命令,然后测试是否可以执行成功

cd src
redis-cli

在这里插入图片描述

2,配置redis主结点

切回到上一级目录,将redis的配置文件cp到 /etc/redis中

cd ../
cp refid.conf /etc/redis

在这里插入图片描述

随后修改这个 /etc/redis 路径下的redis配置文件

cd /etc/redis
vim redis.conf   

要修改的内容如下

port 6379
bind 0.0.0.0
daemonize yes
protected-mode no

随后为redis创建一个服务启动单元,方便服务的启动和管理

vim /etc/systemd/system/redis.service

将以下内容加入到这个配置文件中

[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always

[Install]
WantedBy=multi-user.target

然后将上面的资源重新加载一下

sudo systemctl daemon-reload

最后就可以直接通过系统命令来启动redis

sudo systemctl start redis
sudo systemctl enable redis

如果系统命令一直启动失败的话,可以直接通过客户端命令进行启动,这样也能启动redis服务

redis-server /etc/redis/redis.conf

启动完成之后,那么就可以在任意位置直接执行启动reids客户端的命令

redis-cli

在这里插入图片描述

3,配置redis从结点

上面已经完成了redis的安装,上面的这个结点就作为redis的主结点,接下来需要安装一个从结点。这里用的是同一台centos服务器机器,如果要在两台机器上面搭建这种架构,其原理也是一样的

首先拷贝一个redis配置文件的副本,作为redis从结点的配置文件

cp /etc/redis/redis.conf /etc/redis/redis-slave.conf

在这里插入图片描述

然后编辑这个配置文件,如以下配置,除了配置这些基础属性之外,还需要配置一个 slaveof 的配置,表示是谁的从结点,然后去拉取主结点对应的数据

port 6380
bind 0.0.0.0
daemonize yes

slaveof 127.0.0.1 6379

随后启动这个从结点实例,直接将对应的配置文件启动即可

redis-server /etc/redis/redis-slave.conf

随后执行这个查看redis进程的命令,可以发现主节点6379和从结点6380均启动成功

ps -ef | grep redis

在这里插入图片描述

4,主从结点的数据同步

接下来开两个客户端窗口,一个主节点用来插入数据,一个从节点看是否能获取到数据

set zhenghuisheng:age 18
set zhenghuisheng:name zhs    

可以发现6379端口的服务已经将数据插入成功

在这里插入图片描述

接下来直接看6380的端口,因为6380端口没有像6379那样加入了服务端管理,因此可以通过以下命令打开窗口

redis-cli -p 6380

然后直接获取主服务器设置的值,可以发现从服务器也将数据拿到,因此可以说明从服务器已经将主服务器的数据同步到本地

在这里插入图片描述

5,主从架构底层原理

5.1,启动时的复制

当从节点首次连接到主节点时,会进行以下步骤:

  • 1,连接主节点: 从节点通过发送 SLAVEOF 命令连接到主节点,两端之间建立长连接。
  • 2,主节点准备快照: 主节点接收到从节点的连接请求后,会暂停处理新的写请求,并通过bgsave异步的方式创建当前数据库的 RDB 快照文件。这个文件包含了当前所有数据的快照。
  • 3,发送快照: 主节点将生成的 RDB 文件发送给从节点。
  • 4,加载数据: 从节点接收到 RDB 文件后,会将其加载到自己的内存中,初始化数据状态。
  • 5,恢复写操作: 主节点在完成快照生成后,继续处理写请求,开始发送数据变更。

5.2, 实时数据同步

在从节点成功加载 RDB 文件后,主从节点之间的实时数据同步开始:

  • 1,主节点记录变更: 主节点在处理写请求时,会将操作记录到一个复制缓冲区(replication buffer)中。
  • 2,发送命令到从节点: 主节点定期将缓冲区中的变更命令(如 SETDEL 等)发送给所有连接的从节点。这些命令包含了操作的类型和对应的键值。
  • 3,从节点执行命令: 从节点接收到这些命令后,会立即执行,从而保持与主节点的数据一致性。

5.3,断线重连后的同步

如果主从节点之间的连接出现中断,Redis 也提供了相应的机制进行数据同步:

  • 1,重连时的数据同步: 当从节点重新连接到主节点时,主节点会通过发送 PSYNC 命令请求数据同步。
  • 全量同步与增量同步
    • 全量同步:如果从节点和主节点的连接中断时间较长,主节点会进行全量同步,重新发送 RDB 快照。
    • 增量同步:如果断线时间较短且主从之间的复制偏移量未丢失,则可以进行增量同步。主节点会记录从节点的复制偏移量,通过这个偏移量将未发送的命令发送给从节点。

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

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

相关文章

UE管理内容 —— FBX Static Mesh Pipeline

目录 General Setup Export Mesh Static Mesh LODs FBX导入流程中加入 静态网格体 支持后,将网格体从3D软件加入虚幻引擎的操作便极为简便;网格体导入后,网格体的材质纹理(仅限漫反射和法线贴图)也将被导入&#xf…

Bianchi模型、python计算及ns3验证

由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。 本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比: 1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时…

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制,通常采用双 PI 控制器和 S…

Linux系统创建新分区并挂载的方法

一、引言 本文以CentOS为例讲述Linux系统创建新分区并挂载的方法。如下图所示,用fdisk -l命令可以看到该CentOS系统下有一个磁盘/dev/vda,其容量为2199G,即2T。该磁盘有两个分区:vda1和vda2: 用lsblk命令可以查看到磁…

Ancient City Ruins 古代城市遗址废墟建筑游戏场景

这个包包含450多个古代遗迹预制件,可组合模块化预制件和许多建筑元素。它适用于室内和室外,并允许不同层次的定制建筑。 [亮点] 超过450个古代遗迹的预制件 可组合的模块化预制件 许多建筑元素 适用于室内和室外 允许不同层次的自定义建筑 预制房间和建筑 废墟装饰道具 基本自…

jQuery——循环翻页

本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享jQuery中自动翻页功能的学习。

【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题🚩题意与思路 ⭐返回贪心🚩原理(反悔池)🚩落实到题🚩AC code ⭐练习题⭐END🌟交流方式 ⭐例题 经典例题: 871. 最低加油次数 🚩题意与思路 题意&#xf…

【光追模组】使命召唤7黑色行动光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好,今天小编我给大家继续引入一款游戏mod,这次这个模组主要是针对使命召唤7黑色行动进行修改,如果你觉得游戏本身光影有缺陷,觉得游戏色彩有点失真的话,或者说你想让使命召唤7这款游戏增加对光线追踪的支持的话&am…

RESTful风格接口+Swagger生成Web API文档

RESTful风格接口Swagger生成Web API文档 文章目录 RESTful风格接口Swagger生成Web API文档1.RESTful风格接口RESTful简介RESTful详细图示常见http状态码springboot实现RESTfulRESTful springboot设计实例demo 2.Swagger生产Web API文档Swagger简介使用Swagger1.加入依赖2.配置S…

C++笔记之shared_ptr的reset()函数

C++笔记之shared_ptr的reset()函数 code review! std::shared_ptr 的 reset() 函数用于管理指针的生命周期。以下是它的几种用法和功能: 用法 无参数调用: reset() 会释放当前管理的对象,并将指针置为空。std::shared_ptr<int> ptr = std::make_shared

数据库原理及应用:用实例理解关系代数(传统集合运算和专门关系运算)

&#xff01;注意&#xff01;&#xff1a;本篇博客只是利用实例来更好地理解关系代数&#xff0c;有关本章内容专业的表达式在此篇博客中未被提及。本博客中关系和表格这两个表达是等价的。 关系操作分为传统集合运算和专门关系运算&#xff0c;这一篇博客我们将从实例进行关系…

Go基本数据结构

1.jdk丰富的数据结构 Jdk提供了许多基本数据结构的实现&#xff0c;这些数据结构是Java Collections Framework的一部分&#xff0c;位于java.util包中。以下是一些常见的数据结构&#xff1a; ArrayList&#xff1a;一个可调整大小的数组实现&#xff0c;支持快速随机访问。 …

[Algorithm][贪心][合并区间][无重叠区间][用最少数量的箭引爆气球]详细讲解

目录 1.合并区间1.题目链接2.算法原理详解3.代码实现 2.无重叠区间1.题目链接2.算法原理详解3.代码实现 3.用最少数量的箭引爆气球1.题目链接2.算法原理详解3.代码实现 1.合并区间 1.题目链接 合并区间 2.算法原理详解 区间问题思路&#xff1a; 排序 左端点(本题)右端点 根…

Docker安装及使用记录

本文汇总一下 Docker 的安装过程和使用过程中的问题 安装过程 Windows Linux 更新软件源&#xff1a;Linux安装前可先更新以下各自发行版包管理器的软件源 卸载旧版本&#xff1a;如果之前安装过的话&#xff0c;可以先卸载 yum remove docker docker-common docker-sel…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

基于SpringBoot“花开富贵”花园管理系统【附源码】

效果如下&#xff1a; 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升&#xff0c;越来越多的人开始追求与自然和谐共生的生活方式&#xf…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C2f结构,全网最详细教程

改进训练结果前: 二次创新C2f结构训练结果: 摘要 引入了可变形卷积 v4 (DCNv4),这是一种为广泛视觉应用设计的高效且有效的操作算子。DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以…

【动态规划-4.2 最长递增子序列(LIS)】力扣300. 最长递增子序列

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列 。 示例 1&…