Redis 主从复制+哨兵+集群

news2024/12/22 22:09:48

Redis复制

查看docker 容器 ip

docker inspect 容器id | grep IPAddress

docker 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"

主从复制:一主二从

启动

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转换
在这里插入图片描述

主从复制工作流程

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

Redis哨兵

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

sentinel.conf

测试架构图

在这里插入图片描述

配置文件准备

查看 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

启动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

启动哨兵

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

效果

所有启动的容器展示

在这里插入图片描述

搭建完成后哨兵效果

在这里插入图片描述

下线 6379 主机之后再上线效果

选举新的master,旧主变为slave

在这里插入图片描述

哨兵运行流程和选举原理

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

哨兵使用建议

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

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

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

Redis集群

redis集群也不保证强一致性

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

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

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

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

slot 槽映射 == 三种实现

在这里插入图片描述

集群搭建

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

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 111111
 
cluster-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

在这里插入图片描述

主从切换

在这里插入图片描述

在这里插入图片描述

故障转移

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

在这里插入图片描述

扩容

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

在这里插入图片描述

在这里插入图片描述

缩容

删除从节点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

在这里插入图片描述

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

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

相关文章

fastadmin多语言切换设置

fastadmin版本:1.4.0.20230711 以简体,繁体,英文为例 一,在application\config.php 里开启多语言 // 是否开启多语言lang_switch_on > true, // 允许的语言列表allow_lang_list > [zh-cn, en,zh-tw], 二…

文本高效管理神器:支持自定义行数拆分,轻松实现批量高效编辑与管理新体验

在信息爆炸的时代,文本处理成为了我们日常工作中不可或缺的一部分。然而,面对大量的文本数据,如何高效地进行编辑和管理,却成为了许多人头疼的问题。现在,有了我们的文本批量高效编辑管理工具,一切将变得简…

RS485中继器的作用你还不知道?

RS485是一种串行通信协议,支持设备间长距离通信。RS485中继器则像“传声筒”,能放大衰减信号,延长通信距离,隔离噪声,扩展分支。在实际场景中,如工厂内,通过中继器可确保控制室与远距离机器间通…

虚拟现实环境下的远程教育和智能评估系统(十一)

视频帧画面知识点区域划分 知识点区域精确分割技术: 在深度学习检测模型结果基础上使用基于交并比(IoU)阈值的目标合并算法,合并过度重合目标区域面积,实现知识点区域精确分割 多模态知识点内容匹配策略: 图像:利用…

Linux驱动开发-01配置开发环境

一、配置网络环境 使用桥接网卡时 Ubuntu 就是使用一个真实的网卡 :开发板的网线也连接到这个真实的网卡上,这样 Windows 、 Ubuntu 、开发板就都可以用过这个网卡互通了。 NAT 网卡: Ubuntu 通过它上网,只要 Windows 能上网&…

idea 配置文件中文乱码

再进行springboot项目开发时发现新建的配置文件中文注释乱码,如下: 处理办法: 1、打开idea,在 File 中找到 Settings,如下图 2、搜索 encodings 找到 File Encodings,如下图 3、将上图中圈上的地方全部改为 UTF-8 编码最后点击 Apply 应用即…

鸿蒙Harmony实战—通过登录Demo了解ArkTS

ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 ArkTS在TS的基础上主要扩展了如下能力: 基本语法:ArkTS定义…

信息学奥赛初赛天天练-30CSP-J2022完善程序-结构体构造函数初始化、auto关键字、连通块、洪水填充算法实战

PDF文档公众号回复关键字:20240620 2022 CSP-J 阅读程序2 完善程序 (单选题 ,每小题3分,共30分) 2 (洪水填充) 现有用字符标记像素颜色的8 * 8图像。颜色填充操作描述如下:给定起始像素的位置和待填充的颜色,将起始像素和所有可…

山东华素制药有限公司:素心做药,感恩回报

在山东威海这片美丽的土地上,有一颗璀璨的明珠——山东华素制药有限公司。自2013年成立以来,这家企业以其深厚的制药底蕴、卓越的研发实力和坚定的社会责任,赢得了社会各界的广泛赞誉。它不仅是化学药品制剂制造的佼佼者,更是“素心做药,感恩回报”的典范。 一、素心做药,品质为…

Android Compose 文本输入框TextField使用详解

一、 TextField介绍 TextField 允许用户输入和修改文本,也就是文本输入框。 TextField 分为三种: TextField是默认样式OutlinedTextField 是轮廓样式版本BasicTextField 允许用户通过硬件或软件键盘修改文本,但不提供提示或占位符等装饰&a…

【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践

文章目录 引言第一章 半监督学习的基本概念1.1 什么是半监督学习1.2 半监督学习的优势 第二章 半监督学习的核心算法2.1 自训练(Self-Training)2.2 协同训练(Co-Training)2.3 图半监督学习(Graph-Based Semi-Supervise…

C++基础知识——命名空间

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan. 文章目录 1、什么是命名空间2、命名空间的作用3、如何定义命名…

总结之LangChain(一)—— 简单使用LangChain

LangChain介绍 LangChain官网:https://python.langchain.com/v0.2/docs/introduction/ LangChain 是一个基于大型语言模型(LLM)开发应用程序的框架。 LangChain 简化了LLM应用程序生命周期的每个阶段: 开发:使用 L…

JavaSE 利用正则表达式进行本地和网络爬取数据(爬虫)

爬虫 正则表达式的作用 作用1:校验字符串是满足规则 作用2:在一段文本中查找满足需要的内容 本地爬虫和网络爬虫 Pattern类 表示正则表达式 Matter类 文本编译器,作用按照正则表达式的规则去读取字符串,从头开始读取&#xf…

Everything 一款功能强大的搜索工具

要在电脑上使用Everything搜索文件,您需要使用以下步骤: 在您的电脑上下载并安装Everything软件。您可以从官方网站https://www.voidtools.com/downloads/下载最新版本的软件。 安装完成后,打开Everything软件。 在搜索栏中输入您要查找的文…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续字母长度(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

手把手教你如何部署自己的One Tool助手

手把手教你如何部署自己的One Tool助手 前言安装教程效果图在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0fc5cb0f451e4c50b55ec850a5517b0c.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/56331f878b9545d5bff6f938c4b317…

uniapp 项目,用HBuilder X在小程序端 运行项目,发布项目

1. 运行项目(直接在微信开发者工具中导入项目,运行项目会报错,要通过HBuilder X运行项目) 1.1 配置内容,必须是该小程序的开发者才能运行 查看appid, 项目 -- manifest.json 文件 -- 微信小程序配置 -- APPID 小程序…

用国内首家文生软件平台生成一个整蛊拼图小游戏是什么体验?

前言: 众所周知,2023年是中国大模型发展的元年,以ChatGPT3.5为代表的初代语言大模型横空出世,直接掀起了一阵全球范围内的AIGC浪潮。 在中国大模型追星赶月的这一年,技术迭代日新月异,行业趋势不断变化&a…

RabbitMQ 学习笔记

RabbitMQ学习笔记 一些概念 Broker :RabbitMQ服务。 virtual host: 其实就是分组。 Connection:连接,生产者消费者与Broker之间的TCP连接。 Channel:网络信道,轻量级的Connection,使用Chann…