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

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 yesslaveof 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.rhkb.cn/news/444380.html

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

相关文章

算法设计课程简介

算法设计课程简介 1. 课程概述 算法设计是一门计算机科学的核心课程,旨在教授学生如何设计、分析和优化各种算法,以解决实际问题。该课程不仅涉及具体算法的实现,更注重算法在时间复杂度和空间复杂度上的优化,帮助学生培养编写高…

echarts 括扑图(graph 与 lines实现)

目的 要实现一个由几条线串起来的设备,线是动态的,如下 相关技术 vue,echarts 难点 因为用到了两种图,要保持坐标系一致性,graph设置coordinateSystem: ‘cartesian2d’,后不能使用x,y要使用value,(这一点官网没…

vue-jsonp的使用和腾讯地图当前经纬度和位置详情的获取

1.下载: npm install –save vue-jsonp2.main.js中引入: //腾讯逆地址解析会用到jsonp import {VueJsonp} from vue-jsonp; Vue.use(VueJsonp);3.腾讯地图中使用 uniapp中获取*经纬度*和通过经纬度获取当前**位置详情** //获取当前经纬度 getLocation…

基于STM32的智能门锁

基于STM32的智能门锁 在现代家居安全领域,智能门锁已经成为提升居住安全和便利性的关键技术之一。本文将介绍一个基于STM32微控制器的智能门锁项目,该项目集成了多种模块,包括步进电机、矩阵键盘、OLED显示屏、蓝牙模块和RFID刷卡模块&#…

ClickHouse 数据保护指南:从备份到迁移的全流程攻略

一、背景 运行3年的clickhouse需要迁移机房,迁移单库单表的140亿条的数据。采用clickhouse-backup 的方式进行备份迁移,打包备份,再加上数据拷贝,数据恢复 一共花费30分钟。数据在一定量级,避免使用SQL 导入导出的方式…

达梦DBLINK访问ORACLE配置方法

目录 1、概述 2、测试环境 3、语法简介 4、配置访问DM的DBLINK 5、配置访问ORACLE的DBLINK 5.1 通过OCI配置 5.2 通过ODBC配置 1、概述 本文介绍了达梦DBLINK的配置方法。有3部分内容,1)达梦访问到达梦的配置方法;2)通过OC…

天气预报echarts

如上图&#xff0c;可以切换温度&#xff0c;降水量&#xff0c;风力风向和空气质量 <template><el-radio-group v-model"selectedData" change"updateChart"><el-radio-button label"temperature">温度</el-radio-butto…

探索未来:揭秘pymqtt,AI与物联网的新桥梁

文章目录 探索未来&#xff1a;揭秘pymqtt&#xff0c;AI与物联网的新桥梁背景&#xff1a;为什么选择pymqtt&#xff1f;什么是pymqtt&#xff1f;如何安装pymqtt&#xff1f;简单的库函数使用方法1. 配置MQTT连接2. 创建Mqtt对象3. 发布消息4. 订阅主题5. 运行MQTT客户端 场景…

LabVIEW提高开发效率技巧----状态保存与恢复

在LabVIEW开发中&#xff0c;保存和恢复程序运行时的状态是一个关键技巧&#xff0c;特别是在涉及需要暂停或恢复操作的应用中。通过使用 Flatten To String 和 Unflatten From String 函数&#xff0c;开发人员可以将程序当前的状态转换为字符串并保存&#xff0c;再在需要时恢…

C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 顺序读写数据常用函数 函数名调用形式功能返回值fgetcfgetc(fp)从指针变量fp指向的文件中读…

Spring Boot 进阶-详解Spring Boot整合数据库

在之前的例子中&#xff0c;我们介绍了如何在Spring Boot 框架中添加数据源配置。这篇文章我们来详细介绍一下如何整合Mybatis框架。 整合Mybatis框架 还是按照之前的套路&#xff0c;我们要整合Mybatis框架&#xff0c;首先需要加载对应的场景启动器。这里我们引入由Mybatis提…

【AI 工具分享】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

刷题 图论

面试经典 150 题 - 图 200. 岛屿数量 dfs 标记 visited class Solution { public:// dfs 染色const int direction[4][2] {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};void dfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x…

.NET NoSQL 嵌入式数据库 LiteDB 使用教程

前言 今天大姚给大家分享一个小巧、快速、轻量级的.NET 开源且免费&#xff08;MIT License&#xff09;的 NoSQL 嵌入式数据库&#xff1a;LiteDB。本篇文章我们主要来讲讲LiteDB在.NET中如何使用。 LiteDB介绍 LiteDB 是一个小巧、快速和轻量级的 .NET NoSQL 嵌入式数据库…

什么是快充协议、支持多协议的USB Type-C受电端取电芯片

随着快充技术的不断发展&#xff0c;传统的慢充模式已经满足不了消费者对充电效率的要求。有了快充技术的支持很大程度的缩短了我们的充电时间&#xff0c;给我们的生活带来了很多便利。 什么是快充协议 快充协议是快充技术的核心&#xff0c;现如今市面上已经有很多种快充协议…

打破常规,BD仓储物流的效能提升!

当前&#xff0c;随着国家战略的推进&#xff0c;JS与民用领域的融合不断加深&#xff0c;物流业也步入了军民融合的新时代。在智能仓储物流方面&#xff0c;JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…

代码随想录算法训练营Day31 | 455.分发饼干、376.摆动序列、53.最大子数组和

目录 455.分发饼干 376.摆动序列 53.最大子数组和 455.分发饼干 题目 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c…

论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models

摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力&#xff0c;也就是说&#xff0c;这些模型可以通过对由几个输入输出示例构建的提示进行条件反射&#xff0c;直接应用于解决大量下游任务。然而&#xff0c;先前的研究表明&#xff0c;由于训练示例、示例顺序和提示…

HTML的介绍

HTML HTML是一种超文本标记语言,超文本是指,除了文本之外,还可能包含图片,音频,或者评注等的 文本形式,比文本强大,通过链接和交互方式来组织和呈现信息.标记语言是指,由标签构成的语言.HTML定义了多种不同的标签,用来表示不同的内容. 标签的介绍: 1.<h3> 三级 </h3&…

java多态-cnblog

java多态 细分的重载会增加代码量&#xff0c;降低易用程度 定义一个类&#xff0c;继承所有类的对象&#xff0c;根据向上转型可以让每个类的对象都调用初始类的方法&#xff0c;在方法中设置判断&#xff0c;不同的对象导致方法做不同的事&#xff0c;这就是多态 写一个灯…