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

news2024/12/22 17:14:15

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配置与高级数据类型

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

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

相关文章

WeTest 海外本地化测试的全生命周期服务 第一期

伴随全球化和数字化的加速推进&#xff0c;越来越多的国内企业希望将其产品服务推向国际&#xff0c;以便在全球数字市场中占有一席之地。除去传统的欧美市场&#xff0c;国内企业也积极开拓东南亚、南亚、拉美、中东和非洲等新兴市场。这些地区的互联网普及率和数字化需求正在…

vue+watermark-dom实现页面水印效果

前言 页面水印大家应该都不陌生&#xff0c;它可以用于验证数字媒体的来源和完整性&#xff0c;还可以用于版权保护和信息识别&#xff0c;这些信息可以在不影响媒体质量的情况下嵌入&#xff0c;‌并在需要时进行提取。‌本文将通过 vue 结合 watermark-dom 库&#xff0c;教大…

《AIGC 实战宝典》(2024版) 正式发布!

2024 新年伊始&#xff0c;OpenAI 推出文生视频 Sora&#xff0c;风靡整个科技圈。 最近又发布了 ChatGPT-4o&#xff0c;这是一个全新模型&#xff0c;不仅能处理文本&#xff0c;还能实时理解和生成音频和图像。OpenAI 用实际行动给全世界的科技公司又上了一课。 如何从0到1…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

offer题目51:数组中的逆序对

题目描述&#xff1a;在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。例如&#xff0c;在数组{7,5,6,4}中&#xff0c;一共存在5个逆序对&#xff0c;分别是(7…

[Vulnhub] TORMENT IRC+FTP+CUPS+SMTP+apache配置文件权限提升+pkexec权限提升

信息收集 IP AddressOpening Ports192.168.101.152TCP:21,22,25,80,111,139,143,445,631 $ nmap -p- 192.168.101.152 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login a…

新建一个git仓库并且把已有项目推送到git远程仓库

总贴 1. 创建一个空项目&#xff0c;不会看新建仓库 2. 克隆这个项目到某个文件夹去&#xff0c;比如我想克隆到我的E盘的code下面 3. 我的这个文件夹下面是有东西的&#xff0c;一点都不影响 . 4. 用命令行进入这个文件夹 命令行已经显示了已经在E盘下面code文件夹, 不会…

【linux】报错解决:配置RAIDA1之后系统识别不到

【linux】报错解决&#xff1a;配置RAIDA1之后系统识别不到 一、问题描述&#xff1a; 我的主板是华南金牌X99-F8D PLUS&#xff0c;安装了ubuntu20.04&#xff0c;通过BIOS创建了RAID1数组&#xff0c;进入系统之后识别不到我创建的RAID1数组。 二、原因分析&#xff1a; 可…

【算法】算法模板

算法模板 文章目录 算法模板简介数组字符串列表数学树图动态规划 简介 博主在LeetCode网站中学习算法的过程中使用到并总结的算法模板&#xff0c;在算法方面算是刚过初学者阶段&#xff0c;竞赛分数仅2000。 为了节省读者的宝贵时间&#xff0c;部分基础的算法与模板未列出。…

IMU提升相机清晰度

近期&#xff0c;一项来自北京理工大学和北京师范大学的团队公布了一项创新性的研究成果&#xff0c;他们将惯性测量单元&#xff08;IMU&#xff09;和图像处理算法相结合&#xff0c;显著提升了非均匀相机抖动下图像去模糊的准确性。 研究团队利用IMU捕捉相机的运动数据&…

用程序画出三角形图案

创建各类三角形图案 直角三角形&#xff08;左下角&#xff09; #include <iostream> using namespace std;int main() {int rows;cout << "输入行数: ";cin >> rows;for(int i 1; i < rows; i){for(int j 1; j < i; j){cout << &…

阿里巴巴1688商品详情API返回值全面解析-商品基本信息

阿里巴巴1688商品详情API的返回值是一个包含了商品详细信息的JSON对象&#xff0c;这些信息对于开发者在电商平台上展示商品、进行数据分析等场景非常重要。以下是对阿里巴巴1688商品详情API返回值的全面解析&#xff1a; 一、商品基本信息 商品ID&#xff1a;商品的唯一标识…

gds-linkstack:泛型链式栈

类似于C的stack的泛型容器&#xff0c;初始化、销毁、清空、入栈、出栈、取栈顶、栈空。

java项目-刷题项目实现细节及思路

设计数据表&#xff1a;&#xff1a; 分类表 id主键 分类类型 分类名称 父级id 图标链接 题目标签表 主键 标签名称 分类id&#xff08;标签会和分类进行连接 直接将分类表写进来 减少另一个关联表&#xff09; 排序 题目的信息表 id name 难度 出题人姓名 题目的类别&#…

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…

CTF-Web习题:[BJDCTF2020]Mark Loves cat

题目链接&#xff1a;Mark Loves cat 解题思路 访问靶机网站后得到如下页面&#xff1a; 先浏览网页&#xff0c;发现最下面有一个"dog"字样&#xff0c;此时翻看源码并没有什么发现 那就例行进行目录扫描&#xff0c;源码泄露扫描&#xff0c;用dirsearch目录扫…

git commit报错: pre-commit hook failed (add --no-verify to bypass)

原因&#xff1a; 在提交前做代码风格检查&#xff0c;若检查不通过&#xff0c;则提交失败 解决方案&#xff1a;进入项目的.git>hooks目录&#xff0c;找到pre-commit文件&#xff0c;删除即可

C# 中的 String.Join 与循环

一.介绍 使用 C# 中的字符串集合时&#xff0c;将多个字符串用指定的分隔符连接成一个字符串是一项常见任务。完成此任务有两种主要方法&#xff1a;使用循环手动连接字符串或使用内置的 String.Join 方法。本文将比较这两种方法&#xff0c;并向您展示为什么在大多数情况下 S…

《JavaSE》---16.<抽象类接口Object类>

目录 前言 一、抽象类 1.1什么是抽象类 1.2抽象类代码实现 1.3 抽象类特点 1.4抽象类的作用 二、接口 2.1什么是接口 2.2接口的代码书写 2.3 接口使用 2.4 接口特点 2.5 实现多个接口 快捷键&#xff08;ctrl i &#xff09;&#xff1a; 2.6接口的好处 2.7 接…

Linux systemd 服务启动失败Main process exited, code=exited, status=203/EXEC

文章目录 问题描述解决思路及方法排除方向一&#xff1a;nohup排除方向二&#xff1a;使用绝对路径而不是相对路径 问题描述 命令&#xff1a; java -Xms1024m -Xmx1024m -jar /usr/local/java/bin/mashang/app.jar --server.port8532 ----spring.profiles.activetest是可以直…