当前位置: 首页 > news >正文

# 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 中。

60-多台服务器连接方案.png

4、redis 主从复制

1)主从复制即将master中的数据即时、有效的复制到 slave 中。

2)特征:一个master可以拥有多个slave,一个slave只对应一个master

3)职责:

  • master:
     写数据
     执行写操作时,将出现变化的数据自动同步到slave
     读数据(可忽略)
  • slave:
     读数据
     写数据(禁止)。

二、redis 主从复制 – 主从复制的作用

1、高可用集群

61-高可用集群.png

2、主从复制的作用

1)读写分离:master写、slave读,提高服务器的读写负载能力。 2)负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量。
3)故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复。
4)数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。
5)高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案。

三、redis 主从复制 – 主从复制的三个阶段

1、主从复制过程大体可以分为3个阶段

1)建立连接阶段(即准备阶段)。
2)数据同步阶段。
3)命令传播阶段。

2、主从复制的三个阶段示例图:

62-主从复制的三个阶段.png

四、redis 主从复制 – 工作流程(1)建立连接阶段

1、阶段一:建立连接阶段

建立 slave 到 master 的连接,使 master 能够识别 slave,并保存 slave 端口号。

2、建立连接阶段工作流程

步骤1:设置 master 的地址和端口,保存 master 信息。
步骤2:建立 socket 连接。
步骤3:发送 ping 命令(定时器任务)。
步骤4:身份验证。
步骤5:发送 slave 端口信息。
至此,主从连接成功!

63-建立连接阶段工作流程图.png

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>

64-搭建主从结构-1.png

64-搭建主从结构-2.png

65-搭建主从结构-1.png

66-搭建主从结构-1.png

67-info.png

68-slaveof-no-one.png

六、redis 主从复制 – 工作流程(2)数据同步阶段(简)

1、阶段二:数据同步阶段工作流程

  • 在 slave 初次连接 master 后,复制 master 中的所有数据到 slave。
  • 将 slave 的数据库状态更新成 master 当前的数据库状态。

2、数据同步阶段工作流程

步骤1:请求同步数据
步骤2:创建 RDB 同步数据
步骤3:恢复 RDB 同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成!

69-数据同步阶段工作流程.png

3、状态:

1)slave:具有 master 端全部数据,包含 RDB 过程接收的数据。
2)master:保存 slave 当前数据同步的位置。
3)总体:之间完成了数据克隆。

上一节关联链接请点击:
# Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型

相关文章:

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;1&#xff09; 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用&#xff1f; 1&#xff09;单机 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 地址&#xff1a;icsharpcode/ILSpy: .NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform! (github.com) 它有 Release 包可以下载 也提供 IDE 的…...

Axivion Suite 7.8现已发布

现已实现100%覆盖MISRA规则&#xff0c;并加入了高级功能来提高代码分析能力。 我们很高兴地宣布Axivion Suite 7.8发布。全新版本的Axivion Suite对编译器、配置、分析、仪表板 (WebUI)和IDE插件的架构验证和静态代码分析功能均进行了升级。 100%覆盖所有可测试的MISRA规则 …...

从零开始!JupyterNotebook的安装教程

安装 Anaconda 1、下载 Anaconda&#xff1a; 访问 Anaconda 官方网站 (https://www.anaconda.com/products/distribution/) 下载适合您操作系统的 Anaconda 发行版。 2、安装 Anaconda&#xff1a; Windows&#xff1a;运行下载的安装程序&#xff0c;选择“Just Me”…...

使用kali进行端口扫描

目录 一、使用nping工具向目标主机的指定端口发送自定义数据包 二、使用Nmap工具进行端口扫描 三、使用Zenmap工具进行扫描 一、使用nping工具向目标主机的指定端口发送自定义数据包 nping工具允许用户产生各种网络数据包&#xff08;TCP&#xff0c;UDP&#xff0c;ICMP&am…...

C#使用Clipper2进行多边形合并、相交、相减、异或的示例

Clipper2库介绍 开源库介绍&#xff1a; Clipper2在Github上的地址&#xff1a;https://github.com/AngusJohnson/Clipper2 Clipper2库对简单和复杂多边形执行交集&#xff08;Intersection&#xff09;、并集&#xff08;Union&#xff09;、差分&#xff08;Difference&…...

Spring-Aop源码解析(二)

书接上文&#xff0c;上文说到&#xff0c;specificInterceptors 不为空则执行createProxy方法创建代理对象&#xff0c;即下图的createProxy方法开始执行&#xff0c;生成代理对象&#xff0c;生成代理对象有两种方式&#xff0c;JDK和CGLIB。 createAopProxy就是决定使用哪…...

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下&#xff0c;需要添加下载功能 import React, { useState } from rea…...

MongoDB - 聚合阶段 $group 的使用

文章目录 1. 构造测试数据1. 示例 12. 示例23. 示例34. 示例45. 示例5 2. 构造测试数据1. 示例12. 示例23. 示例3 在 MongoDB 中&#xff0c;$group 是聚合管道中的一个阶段&#xff0c;用于根据指定的条件对文档进行分组。 {$group: {_id: <expression>, // 分组的依据…...

Flutter 插件之 easy_refresh(下拉刷新、上拉加载)

今天给大家较少一下日常开发中最常见的一个功能,就是 下拉刷新、上拉加载,这个在我们使用分页功能是最常见的。 此前我我也写了一篇关于 下拉刷新、上拉加载。 Flutter 下拉刷新、上拉加载flutter_easyrefresh的使用https://blog.csdn.net/WangQingLei0307/article/details/…...

DVWA的安装和使用

背景介绍 DVWA是Damn Vulnerable Web Application的缩写&#xff0c;是一个用于安全脆弱性检测的开源Web应用。它旨在为安全专业人员提供一个合法的测试环境&#xff0c;帮助他们测试自己的专业技能和工具&#xff0c;同时也帮助web开发者更好地理解web应用安全防范的过程。DV…...

CSS相关记录

文章目录 backgroundposition文字displayflexjustify-contentalign-itemsflex-directionflex-wrap gridimportant transformtranslate&#xff08;位移&#xff09;scale&#xff08;缩放&#xff09;rotate&#xff08;旋转&#xff09;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引爆全球之后&#xff0c;大模型技术便迎来了一段崭新的快速发展期&#xff0c;由其在GPT4.0发布后&#xff0c;AI与教育领域结合产品研发、已成为教育AI科技竞争的新高地、未来产业的新赛道、经济发展的新引擎和新产品的诞生地。 据不完全统计&#xff0c;目…...

lua 游戏架构 之 SceneLoad场景加载(一)

设计一个为BaseSceneLoad class&#xff0c;用于处理场景加载的相关操作 &#xff0c;主要作用是提供了一个通用的场景加载框架&#xff0c;使得子类可以按照统一的接口进行场景加载操作。子类需要实现这些方法&#xff0c;以便在加载场景时能够正确地处理场景加载的各个阶段。…...

【linux深入剖析】命名管道 | 匿名管道与命名管道的区别 | system V共享内存

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 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. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的祖…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...