# Redis 入门到精通(九)-- 主从复制(1)
Redis 入门到精通(九)-- 主从复制(1)
一、redis 主从复制 – 主从复制简介
1、互联网“三高”架构
- 高并发
- 高性能
- 高可用
2、你的“Redis”是否高可用?
1)单机 redis 的风险与问题
-
问题1.机器故障
现象:硬盘故障、系统崩溃
本质:数据丢失,很可能对业务造成灾难性打击
结论:基本上会放弃使用redis. -
问题2.容量瓶颈
现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存
本质:穷,硬件条件跟不上
结论:放弃使用 redis
2)为了避免单点 Redis 服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服
务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续
提供服务,实现 Redis 的高可用,同时实现数据冗余备份。
3、多台服务器连接方案
1)提供数据方:master
- 主服务器,主节点,主库。
- 主客户端。
2)接收数据方:slave
- 从服务器,从节点,从库。
- 从客户端。
3)需要解决的问题:数据同步。
4)核心工作:master 的数据复制到 slave 中。

4、redis 主从复制
1)主从复制即将master中的数据即时、有效的复制到 slave 中。
2)特征:一个master可以拥有多个slave,一个slave只对应一个master
3)职责:
- master:
写数据
执行写操作时,将出现变化的数据自动同步到slave
读数据(可忽略) - slave:
读数据
写数据(禁止)。
二、redis 主从复制 – 主从复制的作用
1、高可用集群

2、主从复制的作用
1)读写分离:master写、slave读,提高服务器的读写负载能力。 2)负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量。
3)故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复。
4)数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。
5)高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案。
三、redis 主从复制 – 主从复制的三个阶段
1、主从复制过程大体可以分为3个阶段
1)建立连接阶段(即准备阶段)。
2)数据同步阶段。
3)命令传播阶段。
2、主从复制的三个阶段示例图:

四、redis 主从复制 – 工作流程(1)建立连接阶段
1、阶段一:建立连接阶段
建立 slave 到 master 的连接,使 master 能够识别 slave,并保存 slave 端口号。
2、建立连接阶段工作流程
步骤1:设置 master 的地址和端口,保存 master 信息。
步骤2:建立 socket 连接。
步骤3:发送 ping 命令(定时器任务)。
步骤4:身份验证。
步骤5:发送 slave 端口信息。
至此,主从连接成功!

3、建立连接后的状态:
1)slave:保存 master 的地址与端口。
2)master:保存 slave 的端口。
3)总体:之间创建了连接的 socket。
五、redis 主从复制 – 搭建主从结构
1、主从连接(slave 连接 master):
1)方式一:客户端发送命令
slaveof <masterip> <masterport>
2)方式二:启动服务器参数
redis-server -slaveof <masterip> <masterport>
3)方式三:服务器配置
slaveof <masterip> <masterport>
4)slave 系统信息
- master_link_down_since_seconds
- masterhost
- masterport
5)master 系统信息
- slave_listening_port(多个)
2、主从断开连接:客户端发送命令
slaveof no one
3、说明:
slave 断开连接后,不会删除已有数据,只是不再接受 master 发送的数据。
4、redis 实际操作演示–redis 搭建主从结构(打开2个服务端连接 6379-server 和 6380-server)
# 切换到 redis 安装目录 (6379-server 服务端)
cd /usr/local/redis/redis-4.0.0/# 查看 redis 服务是否后台启动成功:
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# ps -ef | grep redis-# 杀死 redis 服务进程(如果已经启动 redis 服务,可以先停止服务,如:PID 1742)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# kill -s 9 1742# 修改 conf/redis-6379.conf 配置文件,改为前台启动(关闭守护进程),注释日志记录。
vim conf/redis-6379.conf# 保存以下内容即可:
port 6379
daemonize no
# logfile "6379.log"# redis 持久化 -- RDB 相关配置
# data 目录为新建目录(设置存储.rdb文件的路径)
dir /usr/local/redis/redis-4.0.0/data# 设置本地数据库文件名:
dbfilename dump-6379.rdb
# 设置存储至本地数据库时是否压缩数据
rdbcompression yes
# 设置是否进行 RDB 文件格式校验
rdbchecksum yes# save配置(每10秒有2次数据变化就自动保存)
save 10 2# 添加如下配置(AOF存储功能)
# 开启AOF持久化功能
appendonly yes
# AOF写数据策略(每次)
appendfsync always
# 设置文件名
appendfilename appendonly-6379.aof# 绑定主机地址:
bind 127.0.0.1# 设置数据库数量:
databases 16# 修改 conf/redis-6380.conf 配置文件,改为前台启动(关闭守护进程),注释日志记录。
vim conf/redis-6380.conf# 保底以下内容即可:
port 6380
daemonize no
# logfile "6380.log"
# data 目录为新建目录
dir /usr/local/redis/redis-4.0.0/data# 指定配置文件,启动 redis 服务 (6379-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6379.conf# 指定配置文件,启动 redis 服务 (6380-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6380.conf# 方式二:启动服务器参数:先关闭 6380-server 服务端
redis-server conf/redis-6380.conf --slaveof 127.0.0.1 6379# 方式三:服务器配置# 修改 conf/redis-6380.conf 配置文件,添加 服务器配置。
vim conf/redis-6380.conf# 保底以下内容即可:
port 6380
daemonize no
# logfile "6380.log"
# data 目录为新建目录
dir /usr/local/redis/redis-4.0.0/data
# 添加 服务器配置
slaveof 127.0.0.1 6379# 指定配置文件,重新 启动 redis 服务 (6380-server 服务端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-server conf/redis-6380.conf
5、redis 实际操作演示–打开2个客户端连接(slave 客户端 和 master 客户端)
# 切换到 redis 安装目录
root@WIN-20240529BJA:/home/djh# cd /usr/local/redis/redis-4.0.0/# 指定端口号,启动 redis 客户端(slave 客户端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli -p 6380
127.0.0.1:6380> # 方式一:客户端发送命令:用 6380 客户端 连接 6379 客户端,
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK# 指定端口号(默认连接6379,可不写端口号),启动 redis 客户端(master 客户端)
root@WIN-20240529BJA:/usr/local/redis/redis-4.0.0# redis-cli
127.0.0.1:6379> # 创建数据(在 master 客户端)
127.0.0.1:6379> set name redis-master
OK# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get name
"redis-master"# 方式二:启动服务器参数:先关闭 6380-server 服务端,再带参数启动 6380-server 服务端,然后在客户端测试。# 创建数据(在 master 客户端)
127.0.0.1:6379> set age 33
OK# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get age
"33"# 方式三:服务器配置:先关闭 6380-server 服务端,修改 配置文件 redis-6380.conf 重启服务 测试。# 创建数据(在 master 客户端)
127.0.0.1:6379> set addr xian
OK# 获取数据(slave 客户端),获取成功,说明同步成功。
127.0.0.1:6380> get addr
"xian"# 查看 info 客户端 信息 (在 master 客户端)
127.0.0.1:6379> info # 查看 info 客户端 信息 (在 slave 客户端)
127.0.0.1:6380> info # 主从断开连接:客户端发送命令 slaveof no one # 断开连接(在 slave 客户端)
127.0.0.1:6380> slaveof no one
ok
127.0.0.1:6380> # 创建新数据 (在 master 客户端)
127.0.0.1:6379> set name2 aaa666
ok
127.0.0.1:6379> # 获取新数据 (在 slave 客户端)
127.0.0.1:6380> get name2
(nil)
127.0.0.1:6380>
6、授权访问
1) master 客户端发送命令设置密码
requirepass <password>
2) master 配置文件设置密码
config set requirepass <password>
config get requirepass
3)slave 客户端发送命令设置密码
auth <password>
4)slave 配置文件设置密码
masterauth <password>
5) slave 启动服务器设置密码
redis-server –a <password>






六、redis 主从复制 – 工作流程(2)数据同步阶段(简)
1、阶段二:数据同步阶段工作流程
- 在 slave 初次连接 master 后,复制 master 中的所有数据到 slave。
- 将 slave 的数据库状态更新成 master 当前的数据库状态。
2、数据同步阶段工作流程
步骤1:请求同步数据
步骤2:创建 RDB 同步数据
步骤3:恢复 RDB 同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成!

3、状态:
1)slave:具有 master 端全部数据,包含 RDB 过程接收的数据。
2)master:保存 slave 当前数据同步的位置。
3)总体:之间完成了数据克隆。
上一节关联链接请点击:
# Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
相关文章:
# Redis 入门到精通(九)-- 主从复制(1)
Redis 入门到精通(九)-- 主从复制(1) 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用? 1)单机 redis 的风险与问题 问题1.机器故障 现…...
SpringBoot整合ElasticSearch的elasticsearch-java出现jakarta.json.spi.JsonProvider报错问题
一、原因 报错内容如下 org.springframework.beans.factory.BeanCreationException: Error creating bean with name esClient defined in class path resource [com/elasticsearch/config/ElasticSearchConfig.class]: Bean instantiation via factory method failed; nes…...
git 操作汇总【迭代更新中】
文章目录 0x1初始化操作0x11 生成公钥0x12 配置账号和邮箱 0x20x21 拉取代码0x22 推送代码0x23 设置远端分支 0x30x31 提交mr 0x40x41 子模块0x42 子模块添加 0x1初始化操作 0x11 生成公钥 ssh-keygen0x12 配置账号和邮箱 git config --global user.name username git confi…...
看 Unity 组件的源码 —— ILSpy
ILSpy 是开源的 .NET 程序集浏览器和解编译器。 下载 ILSpy ILSpy Github 地址:icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! (github.com) 它有 Release 包可以下载 也提供 IDE 的…...
Axivion Suite 7.8现已发布
现已实现100%覆盖MISRA规则,并加入了高级功能来提高代码分析能力。 我们很高兴地宣布Axivion Suite 7.8发布。全新版本的Axivion Suite对编译器、配置、分析、仪表板 (WebUI)和IDE插件的架构验证和静态代码分析功能均进行了升级。 100%覆盖所有可测试的MISRA规则 …...
从零开始!JupyterNotebook的安装教程
安装 Anaconda 1、下载 Anaconda: 访问 Anaconda 官方网站 (https://www.anaconda.com/products/distribution/) 下载适合您操作系统的 Anaconda 发行版。 2、安装 Anaconda: Windows:运行下载的安装程序,选择“Just Me”…...
使用kali进行端口扫描
目录 一、使用nping工具向目标主机的指定端口发送自定义数据包 二、使用Nmap工具进行端口扫描 三、使用Zenmap工具进行扫描 一、使用nping工具向目标主机的指定端口发送自定义数据包 nping工具允许用户产生各种网络数据包(TCP,UDP,ICMP&am…...
C#使用Clipper2进行多边形合并、相交、相减、异或的示例
Clipper2库介绍 开源库介绍: Clipper2在Github上的地址:https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集(Intersection)、并集(Union)、差分(Difference&…...
Spring-Aop源码解析(二)
书接上文,上文说到,specificInterceptors 不为空则执行createProxy方法创建代理对象,即下图的createProxy方法开始执行,生成代理对象,生成代理对象有两种方式,JDK和CGLIB。 createAopProxy就是决定使用哪…...
antdesgin table 组件下载成excel
文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下,需要添加下载功能 import React, { useState } from rea…...
MongoDB - 聚合阶段 $group 的使用
文章目录 1. 构造测试数据1. 示例 12. 示例23. 示例34. 示例45. 示例5 2. 构造测试数据1. 示例12. 示例23. 示例3 在 MongoDB 中,$group 是聚合管道中的一个阶段,用于根据指定的条件对文档进行分组。 {$group: {_id: <expression>, // 分组的依据…...
Flutter 插件之 easy_refresh(下拉刷新、上拉加载)
今天给大家较少一下日常开发中最常见的一个功能,就是 下拉刷新、上拉加载,这个在我们使用分页功能是最常见的。 此前我我也写了一篇关于 下拉刷新、上拉加载。 Flutter 下拉刷新、上拉加载flutter_easyrefresh的使用https://blog.csdn.net/WangQingLei0307/article/details/…...
DVWA的安装和使用
背景介绍 DVWA是Damn Vulnerable Web Application的缩写,是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境,帮助他们测试自己的专业技能和工具,同时也帮助web开发者更好地理解web应用安全防范的过程。DV…...
CSS相关记录
文章目录 backgroundposition文字displayflexjustify-contentalign-itemsflex-directionflex-wrap gridimportant transformtranslate(位移)scale(缩放)rotate(旋转)origin (旋转中心点)skew (倾斜 ) borde…...
Fedora40安装telnet-server启用telnet服务
Fedora40安装telnet-server启用telnet服务 安装 telnet-server sudo yum install telnet-server或 sudo dnf install telnet-server启用服务 fedora40 或 CentosStream9 不能用 yum或dnf安装xinetd, telnet-server 的服务名为: telnet.socket 启用 telnet.socket.service …...
Unity3D结合AI教育大模型 开发AI教师 AI外教 AI英语教师案例
自2022年底ChatGPT引爆全球之后,大模型技术便迎来了一段崭新的快速发展期,由其在GPT4.0发布后,AI与教育领域结合产品研发、已成为教育AI科技竞争的新高地、未来产业的新赛道、经济发展的新引擎和新产品的诞生地。 据不完全统计,目…...
lua 游戏架构 之 SceneLoad场景加载(一)
设计一个为BaseSceneLoad class,用于处理场景加载的相关操作 ,主要作用是提供了一个通用的场景加载框架,使得子类可以按照统一的接口进行场景加载操作。子类需要实现这些方法,以便在加载场景时能够正确地处理场景加载的各个阶段。…...
【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存
🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1. 命名管道2. 创建命名管…...
Vite 常用插件配置:自动导入+自动注册组件+动态创建图标+设置组件名
创建 Vue3Vite 项目 创建 Vue3 项目 $ pnpm create vuelatest通过脚手架选择开启以下功能 ✔ Project name: … <your-project-name> ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application development?…...
(leetcode学习)236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
SQL注入篇-sqlmap的配置和使用
在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap,但是由于很多朋友看不了解命令行格式,所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习,链接:https://wwhc.lanzoue.com/ifJY32ybh6vc…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
基于小程序老人监护管理系统源码数据库文档
摘 要 近年来,随着我国人口老龄化问题日益严重,独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长,随之而来的是日益突出的老年人问题,尤其是老年人的健康问题,尤其是老年人产生健康问题后&…...
MeanFlow:何凯明新作,单步去噪图像生成新SOTA
1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架,旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念,这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换,显…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】
一、JSON简介 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有以下核心特性: 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...
