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

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

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

相关文章

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;使得神诺科技 能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.…

java之对称字符串以及如何优化(链式编程)

import java.util.Scanner;public class ScannerDemo12 {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.next();//链式编程StringBuilder sbnew StringBuilder();sb.append(s…

国内大陆地区huggingface连接不上的解决方案

简介 本文主要介绍国内大陆地区huggingface连接不上的解决方案,希望能对学习大模型的同学们有所帮助。 1. 背景 最近有不少同学反应无法正常下载huggingface的模型文件,亲自尝试使用git clone下载huggingface上的大模型文件时,也同样无法正常下载,以Meta-Llama-3-8B为例…

数据结构之判断完全二叉树详解与示例(C,C++)

文章目录 一、判断完全二叉树的思路二、C语言实现三、C语言实现四、总结 完全二叉树是一种特殊的二叉树&#xff0c;它满足以下两个条件&#xff1a; 每一层&#xff08;除了最后一层&#xff09;都被严格地填充了节点。 最后一层的节点都尽可能地靠左对齐。 本文将详细介绍如…

微服务(网关路由)

目录 一&#xff1a;网关路由 1&#xff1a;认识网关 2&#xff1a;快速入门 2.1&#xff1a;创建项目 2.2&#xff1a;引入依赖 2.3&#xff1a;启动类 2.4&#xff1a;路由配置 2.5&#xff1a;测试 3&#xff1a;路由过滤 二&#xff1a;网关登录校验 1&…

58、主从复制数据库+读写分离

mysql的主从复制和读写分离&#xff08;面试问原理&#xff09; mysql的主从复制和读写分离&#xff1a; 主从复制 面试必问 主从复制的原理。 读写分离&#xff0c;MHA 一、主从复制 1.1、主从复制的模式&#xff1a; 1、mysql的默认模式&#xff1a; 异步模式&#xf…

RocketMQ集群搭建,看完这篇文章你就懂了(基于2m-2s-async模式)

前言 上一篇初步认识了RocketMQ&#xff0c;这一篇文章我们简单来搭建一个RocketMQ集群。RocketMQ支持多种集群部署模式&#xff0c;其中最常用的是多主多从的异步复制模式&#xff08;2m代表两个master&#xff0c;2s代表两个slave&#xff0c;async代表异步刷盘的机制&#…

乐鑫ESP32-H2设备联网芯片,集成多种安全功能方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着设备的激增&#xff0c;安全问题也日益成为公众关注的焦点。 乐鑫ESP32-H2致力于为所有开发者提供高性价比的安全解决方案&#xff0c;这款芯片经过专门设计以集成多种安全…

[Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备

title: [Armbian] 部署Docker版Home Assistent&#xff0c;安装HACS并连接米家设备 date: 2024-07-21T10:51:23Z lastmod: 2024-07-21T11:40:39Z [Armbian] 部署Docker版Home Assistent&#xff0c;安装HACS并连接米家设备 官网&#xff1a;Home Assistant (home-assistant.i…

FoundationDB 基本使用

目录 一、FoundationDB介绍 二、安装单机版FoundationDB 2.1 下载安装程序 2.2 安装FoundationDB 2.3 修改配置信息 2.4 管理FoundationDB服务 三、fdbcli的常用命令 3.1连接数据库 3.2退出fdbcli 3.3查看版本 3.4 写模式 3.5写入键值 3.6读取键值 3.7删除键值 …

无法连接到internet怎么办?已连接但无internet访问,其实并不难

有时我们会遇到无法连接到Internet的问题&#xff0c;由多种原因引起&#xff0c;包括硬件故障、软件设置问题、网络供应商故障等。本文将介绍无法连接到Internet时可以采取的步骤。 简述 当你无法连接到Internet时&#xff0c;可以按照以下步骤进行检查和解决&#xff1a; 1…

python实现特征检测算法4

python实现Richardson-Lucy 反卷积算法 Richardson-Lucy 反卷积算法算法原理Python实现详细解释Richardson-Lucy算法的优缺点应用领域Richardson-Lucy 反卷积算法 Richardson-Lucy反卷积算法是一种迭代算法,用于恢复因成像系统中的点扩散函数(PSF)导致的模糊图像。该算法最…

TCP系列(一)-介绍TCP

服务 TCP和UDP同样使用IP提供的服务&#xff0c;但是TCP提供的是面向连接&#xff0c;可靠的字节流服务 面向连接 使用TCP进行通信双方&#xff0c;必须先建立连接&#xff0c;然后进行数据交换 可靠服务 将应用数据分割成固定大小的报文段每次发出报文&#xff0c;会启动定时…

分享从零开始学习网络设备配置--任务6.1 实现计算机的安全接入

项目描述 随着网络技术的发展和应用范围的不断扩大&#xff0c;网络已经成为人们日常生活中必不可少的一部分。园区网作为给终端用户提供网络接入和基础服务的应用环境&#xff0c;其存在的网络安全隐患不断显现出来&#xff0c;如非人为的或自然力造成的故障、事故&#xff1b…

昇思25天学习打卡营第09天|使用静态图加速

MindSpore支持两种运行模式&#xff1a;动态图&#xff08;PyNative模式&#xff09;和静态图&#xff08;Graph模式&#xff09;。 动态图模式下&#xff0c;计算图的构建和计算同时发生&#xff0c;适合调试和开发&#xff0c;但不利于优化。 静态图模式下&#xff0c;计算…

【概率论】-2-概率论公理(Axioms of Probability)

上一篇文章我们学习了基本的概率论内容-排列组合&#xff0c;本次我们学习概率论公理的内容&#xff0c;正式开始计算概率&#xff0c;在开始前我们需要学习一些基本概念。 目录 一.样本空间和事件 1.样本空间 2.事件 3.交并补 二、概率公理 1.基本公理 2.对称差 2.布尔…

vuex的工作流程,模块化使用案例分享,及状态持久化

文章目录 一、Vuex 是什么&#xff1f;二、核心概念三、Vuex 的工作流程四、什么情况下我应该使用 Vuex&#xff1f;五、Vuex 的使用六、使用示例七、状态持久化1、手动利用HTML5的本地存储2、利用vuex-persistedstate插件2.1、安装2.2、配置 一、Vuex 是什么&#xff1f; Vue…

USART串口理论知识总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 USART串口理论知识总结 1、通讯的串行和并行1.串口采用发送数据代码并用printf重代码 1、通讯的串行和并行 1.串口采用发送数据代码并用printf重代码 #include <stdint.h…

GPT-4o mini 时代:开发者的机遇、挑战与经验共享

在当今科技飞速发展的时代&#xff0c;OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格&#xff0c;在技术领域掀起了一股热潮&#xff0c;引发了广泛的关注。对于广大开发者来说&#xff0c;这无疑是一个令人振奋的新契机。 GPT-4o mini 模型的诞生&…

【C++】流插入和流提取运算符重载

目录 前言ostream和istream自定义类型的流插入重载自定义类型的流提取重载解决私有问题日期类总接口 前言 我们在上一节实现日期类时&#xff0c;在输入和输出打印时&#xff0c;经常会调用两个函数&#xff1a; void Insert()//输入函数{cin >> _year;cin >> _mo…