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

Redis 主从复制+哨兵+集群

1、总结写在前面

Redis 集群 = 数据分片 + 高可用性

Redis 哨兵 = 主从复制 + 故障转移

2、主从复制

2.1、准备配置

查看docker 容器 ip

docker inspect 容器id | grep IPAddressdocker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

修改配置文件

初始配置文件见 => redis.conf

  • 远程访问
    • bind 0.0.0.0
    • protected-mode no
  • 主机设置
    • replicaof 172.17.0.2 6379
  • 主机访问密码
    • masterauth 111111

redis_6379.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6379.pid
logfile "/data/6379.log"
dbfilename dump6379.rdb
dir /data
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

redis_6380.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6380.pid
logfile "/data/6380.log"
dbfilename dump6380.rdb
dir /data
replicaof 172.17.0.2 6379
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

redis_6381.conf

bind 0.0.0.0
protected-mode no
port 6379
pidfile /var/run/redis6381pid
logfile "/data/6381.log"
dbfilename dump6381.rdb
dir /data
replicaof 172.17.0.2 6379
masterauth 111111
requirepass 111111
appendonly yes
appendfilename "appendonly.aof"
appenddirname "appendonlydir"

2.2、启动

docker run --name redis79  \
-v /usr/local/redis7.2.4/6379/data:/data  \
-v /usr/local/redis7.2.4/6379/conf:/usr/local/etc/redis \
-p 6379:6379 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6379.conf --port 6379
docker run --name redis80  \
-v /usr/local/redis7.2.4/6380/data:/data  \
-v /usr/local/redis7.2.4/6380/conf:/usr/local/etc/redis \
-p 6380:6380 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6380.conf --port 6380
docker run --name redis81  \
-v /usr/local/redis7.2.4/6381/data:/data  \
-v /usr/local/redis7.2.4/6381/conf:/usr/local/etc/redis \
-p 6381:6381 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis6381.conf --port 6381

在这里插入图片描述

查看主从信息 info replication
在这里插入图片描述

主从关键点演示

从机不可以执行写命令

在这里插入图片描述

从机从头开始复制

先下线6381(此时master未插入数据),之后master执行set,再上线6381,6381复制master全量数据

在这里插入图片描述

主机下线后,主从关系不会变化

可以看到 redis79下线再上线,主从关系没有变化,只是从机的 master_link_status up down转换
在这里插入图片描述

2.3、主从复制工作流程

  1. 建立连接
    • 节点发送slaveof命令与主节点建立连接
  2. 数据同步
    • 主节点会执行bgsave命令生成RDB快照文件,并将其发送给从节点
    • 全量复制=>在节点初始化时,将主节点的数据一次性同步到从节点
    • 增量复制=>同步自上次同步之后发生变更的数据(从机重启之后增量复制,具体是记录一个偏移量)
  3. 命令传播
    • 同步完成后,进入命令传播阶段,在此阶段,主节点将持续向从节点发送写命令

3、Redis哨兵

由于主从复制在master挂了之后,不会自动选取新的master,故引入哨兵。哨兵监控master和slave,当master挂了之后,在slave中选出新master

sentinel.conf

3.1、准备配置

查看 master 容器 IP,用于后面设置 master IP
在这里插入图片描述

sentinel26379.conf

protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel26379.pid
logfile "/data/sentinel26379.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

sentinel26380.conf

protected-mode no
port 26380
daemonize yes
pidfile /var/run/redis-sentinel26380.pid
logfile "/data/sentinel26380.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

sentinel26381.conf

protected-mode no
port 26381
daemonize yes
pidfile /var/run/redis-sentinel26381.pid
logfile "/data/sentinel26381.log"
dir /data
sentinel monitor mymaster 172.17.0.2 6379 2
sentinel auth-pass mymaster 111111

3.2、启动Redis

docker run --name redis6379  \
-v /usr/local/redis7.2.4/6379/data:/data  \
-v /usr/local/redis7.2.4/6379/conf:/usr/local/etc/redis \
-p 6379:6379 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis_6379.conf --port 6379

3.3、启动哨兵

docker run --name redis-sentinel26379 \
-v /usr/local/redis7.2.4/6379/conf/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf \
-d 9b38108e295d
docker exec -it redis-sentinel26379 /bin/bash
redis-sentinel /usr/local/etc/redis/sentinel.conf

3.4、效果

所有启动的容器展示

在这里插入图片描述

搭建完成后主从关系

在这里插入图片描述

下线 6379 主机之后再上线主从关系

选举新的master,旧主变为slave

在这里插入图片描述

3.4、哨兵运行流程和选举原理

1、哨兵集群监控 master

2、sdown : sentinel 发送心跳包,一定时间没有收到master的回复,就认为主观下线

3、odown : 当有 quorum 个 sentinel 认为主观下线,就认为 master 客观下线

4、选出哨兵 leader (RAFT算法)

5、哨兵 leader 选出新master slaveof on one

- 比较优先级 `repliica-priority`  (优先级数值小的)
- 比较复制偏移量 `offset` (偏移量大的)
  • 比较 run id (run id 小的)

6、leader 让其他 slave 认新master

7、leader 让老master 降级,成为新 master 的 slave

3.5、哨兵使用建议

1、使用哨兵集群,保证高可用

2、哨兵节点的数量应该为奇数

3、哨兵集群 + 主从复制,不能保证数据零丢失

4、Redis集群

Redis 集群 = 数据分片 + 高可用性。在这种模式下,数据被分散存储在多个节点上,每个节点只保存部分数据。这提高了系统的可扩展性和性能。通过一致性哈希,集群能够实现自动的数据分片,同时通过节点间的通信保持数据的同步和状态的一致。

Redis 哨兵 = 主从复制 + 故障转移。当主节点发生故障时,哨兵节点会自动将从节点升级为新的主节点,并通知其他从节点和客户端更新配置。这种模式的优势在于其自动化的故障恢复机制,提高了系统的可用性,并且配置简单。

业务需要处理大量数据并且要求高性能,集群模式更合适

业务对数据量的要求不高,但希望建立一个简单且具有高可用性的缓存系统,哨兵模式更合适

4.1、槽映射实现方法和对比

在这里插入图片描述

4.2、集群搭建

配置基本相同,改下端口和文件名

bind 0.0.0.0
protected-mode no
port 7301
logfile "/data/cluster7301.log"
pidfile /data/cluster7301.pid
dir /data
dbfilename dump7301.rdb
appendonly yes
appendfilename "appendonly7301.aof"
requirepass 111111
masterauth 111111cluster-enabled yes
cluster-config-file nodes-7301.conf
cluster-node-timeout 5000

启动六个实例

docker run --name redis7301  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7301.conf:/usr/local/etc/redis/redis.conf \
-p 7301:7301 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7301
docker run --name redis7306  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7306.conf:/usr/local/etc/redis/redis.conf \
-p 7306:7306 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7306

启动容器并查看IP

docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}}' $(docker ps -aq)

在这里插入图片描述

构建主从关系

进入容器 redis 7301

docker exec -it redis7301 /bin/bash

将六个节点加入到集群,一主一从

redis-cli -p 7301 -a 111111 --cluster create --cluster-replicas 1 \
172.17.0.7:7306 \
172.17.0.6:7305 \
172.17.0.5:7304 \
172.17.0.4:7303 \
172.17.0.3:7302 \
172.17.0.2:7301

在这里插入图片描述

查看集群和节点状态

在这里插入图片描述

操作集群

集群需要路由到位 ,即命令中添加 -c

在这里插入图片描述

查看key属于哪个槽

cluster keyslot key

在这里插入图片描述

4.3、主从切换(演示)

在这里插入图片描述

在这里插入图片描述

4.4、故障转移(演示)

redis7306 重新上线后,主从关系变了,为了改回初始的主从关系,登录到原来的主机使用 cluster failover

在这里插入图片描述

4.5、扩容(演示)

docker run --name redis7307  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7307.conf:/usr/local/etc/redis/redis.conf \
-p 7307:7307 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7307
docker run --name redis7308  \
-v /usr/local/redis7.2.4/cluster/data:/data  \
-v /usr/local/redis7.2.4/cluster/conf/redis-cluster-7308.conf:/usr/local/etc/redis/redis.conf \
-p 7308:7308 -d 9b38108e295d \
redis-server /usr/local/etc/redis/redis.conf --port 7308
redis-cli -a 111111 -p 7301  --cluster add-node \
172.17.0.8:7307 \
172.17.0.2:7301

redis-cli -a 111111 -p 7301 --cluster add-node 要加入的节点信息【IP:PORT】 集群中任一节点信息【IP:PORT】

在这里插入图片描述

查看集群状态(新节点未分配槽位)

redis-cli -a 111111 -p 7301 --cluster check 【IP:PORT】 集群中的任一节点都能得到信息

重新分配槽位

在这里插入图片描述
在这里插入图片描述

分配从节点

redis-cli -a 密码 --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli -a 111111 -p 7301 --cluster add-node \
172.17.0.9:7308 \
172.17.0.8:7307 \
--cluster-slave --cluster-master-id 4a849f4b3d5e9e6bbf4412e8c86e7904477f4d4b

在这里插入图片描述

在这里插入图片描述

4.6、缩容(演示)

删除从节点7308

命令:redis-cli -a 密码 --cluster del-node ip:端口 节点ID

redis-cli -a 111111 -p 7301 --cluster del-node 172.17.0.9:7308 14cca2509252d583b06d3fe521eed8661f7efc15

将主节点7307的槽位重新分配给其他主节点

redis-cli -a 111111 --cluster reshard 172.17.0.2:7301

在这里插入图片描述

槽位重新分配,7307也变为从节点

在这里插入图片描述

删除原主节点7307

redis-cli -a 111111 -p 7301 --cluster del-node 172.17.0.8:7307 4a849f4b3d5e9e6bbf4412e8c86e7904477f4d4b

在这里插入图片描述

相关文章:

Redis 主从复制+哨兵+集群

1、总结写在前面 Redis 集群 数据分片 高可用性 Redis 哨兵 主从复制 故障转移 2、主从复制 2.1、准备配置 查看docker 容器 ip docker inspect 容器id | grep IPAddressdocker inspect -f{{.Name}} {{.NetworkSettings.IPAddress}} $(docker ps -aq)修改配置文件 初始…...

cpolar:通过脚本自动更新主机名称和端口号进行内网穿透【免费版】

cpolar 的免费版经常会重新分配 HostName 和 Port,总是手动修改太过麻烦,分享一下自动更新配置文件并进行内网穿透的方法。 文章目录 配置 ssh config编写脚本获取 csrf_token打开登陆界面SafariChrome 设置别名 假设你已经配置好了服务器端的 cpolar。 …...

【Python日志模块全面指南】:记录每一行代码的呼吸,掌握应用程序的脉搏

文章目录 🚀一、了解日志🌈二、日志作用🌈三、了解日志模块⭐四、日志级别💥五、记录日志-基础❤️六、记录日志-处理器handler🎬七、记录日志-格式化记录☔八、记录日志-配置logger👊九、流程梳理 &#x…...

SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)

想要明白生活你需要先经历它,而不是总在分析它。 —萨莉鲁尼 文章目录 前言一、@Async注解1. 概念2. 使用2.1 使用@EnableAsync启动函数异步支持2.2 不会异步执行的坑2.2.1 为什么内部调用不会异步执行?2.2.2 如何确保@Async方法异步执行?3. 配置线程池3.1 通过代码配置3.1.…...

ansible copy模块--持续创作中

copy模块用于将文件从ansible控制节点(管理主机)或者远程主机复制到远程主机上。其操作类似于scp(secure copy protocol)。 关键参数标红。 参数: src:(source:源) 要复制到远程…...

自学SAP是学习ECC版本还是S4版本?

很多人想学SAP,问我应该学ECC版本还是S4版本,我的建议如果你是自学的话,我个人建议使用ECC版本就行,因为这两个版本前台业务和后台配置的操作差异并不大,主要差异在于数据库的差异,前台业务操作和后台系统配…...

银河麒麟4.0.2安装带有opengl的Qt5.12.9

银河麒麟4.0.2下载地址:银河麒麟-银河麒麟(云桌面系统)-银河麒麟最新版下载v4.0.2-92下载站 VirtualBox:https://www.virtualbox.org/wiki/Downloads qt下载:Index of /archive/qt/5.12/5.12.9 1安装VirtualBox:网上教材比较多 1)安装完后安…...

django学习入门系列之第二点《浏览器能识别的标签3》

文章目录 列表表格往期回顾 列表 无序列表 <!-- <ul </ul> 无序列表 --> <ul><li> 内容1 </li><li> 内容2 </li><li> 内容3 </li><li> 内容4 </li> </ul>有序列表 <!-- <ol> &…...

git常见实用命令,简单上手操作

常用命令&#xff1a; 添加远程账号名称&#xff1a;git config --global user.name ‘’ 添加用户eamil&#xff1a;git config --global user.email ‘’ 初始化厂库&#xff1a;git init 新建文件夹&#xff1a;mkdir 文件夹名 新建文件&#xff1a;touch 文件名 查看…...

2-11 基于matlab的BP-Adaboost的强分类器分类预测

基于matlab的BP-Adaboost的强分类器分类预测&#xff0c;Adaboost是一种迭代分类算法&#xff0c;其在同一训练集采用不同方法训练不同分类器&#xff08;弱分类器&#xff09;&#xff0c;并根据弱分类器的误差分配不同权重&#xff0c;然后将这些弱分类器组合成一个更强的最终…...

Neo4j图形数据库查询,Cypher语言详解

Cypher语言详解 Cypher是一种专为Neo4j图形数据库设计的声明式查询语言。它类似于SQL&#xff0c;但其设计目标是便于表达图数据库中常见的图形结构和操作。本文将详细介绍Cypher语言的基本语法、常见操作、高级功能以及使用Cypher进行图形数据分析的技巧。 1. Cypher的基本概…...

C# Winform Datagridview控件使用和详解

DataGridView 是一种以表格形式显示数据的控件&#xff0c;由Rows(行)&#xff0c;Columns(列)&#xff0c;Cells(单元格)构成。本实例将综合利用DataGridView的属性和事件&#xff0c;展示不同的表格风格数据和操作。包含&#xff1a; 添加Datagridview行&#xff0c;列数据设…...

xshell传输文件速率为0

你们好&#xff0c;我是金金金。 场景 此时我通过xshell客户端上传文件&#xff0c;速率一直为0 解决 安装 yum -y install lrzsz 即可 这个工具主要提供 rz 和 sz 命令&#xff0c;用于通过 Zmodem 协议在本地计算机和远程服务器之间传输文件 编写有误还请大佬指正&#xff0…...

2.spring cloud gateway 源码编译

spring cloud gateway编译 1.编译 命令 mvn clean compile -U2.报错 报错信息 核心信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.1.2:check (checkstyle-validation) on project spring-cloud-gateway-mvc: Failed during …...

[Linux] UDP协议介绍:UDP协议格式、端口号在网络协议栈那一层工作...

TCP/IP网络模型, 将网络分为了四层: 之前的文章中以HTTP和HTTPS这两个协议为代表, 简单介绍了应用层协议. 实际上, 无论是HTTP还是HTTPS等应用层协议, 都是在传输层协议的基础上实现的 而传输层协议中最具代表性的就是: UDP和TCP协议了. 以HTTP为例, 在使用HTTP协议通信之前, …...

Spring Boot 中如何解决跨域问题、Spring Cloud 5大组件、微服务的优缺点是什么?

Spring Boot 中如何解决跨域问题 ? SpringMVC项目中使用CrossOrigin注解来解决跨域问题 , 本质是CORS RequestMapping("/hello")CrossOrigin(origins "*")//CrossOrigin(value "http://localhost:8081") //指定具体ip允许跨域public String …...

[Vulnhub] Sleepy JDWP+Tomcat+Reverse+Reverse-enginnering

信息收集 Server IP AddressPorts Opening192.168.8.100TCP:21,8009,9001 $ nmap -sV -sC 192.168.8.100 -p- --min-rate 1000 -Pn Starting Nmap 7.92 ( https://nmap.org ) at 2024-06-20 05:06 EDT Nmap scan report for 192.168.8.100 (192.168.8.100) Host is up (0.00…...

基于MATLAB的误码率与信噪比(附完整代码与分析)

目录 一. 写在前面 二. 如何计算误码率 三. 带噪声的误码率分析 3.1 代码思路 3.2 MATLAB源代码及分析 四. 总结 4.1 输入参数 4.2 规定比特长度 4.3 特殊形式比较 一. 写在前面 &#xff08;1&#xff09;本文章主要讨论如何仿真误码率随着信噪比变化的图像 &#…...

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串筛选排序(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串筛选排序(100分) 🌍 评测功能需要 订阅专栏 后私信…...

# 开发安全

开发安全 文章目录 开发安全安全开发生命周期安全开发目标安全开发基本准则注入类攻击手段Sql注入命令执行命令执行防御文件遍历防御 植入类安全漏洞防御XSS&#xff08;前端漏洞&#xff09;防御 储存型XSS文件上传防御 CSRF防御 会话固定防御 其它类型安全漏洞越权访问防御 口…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...