使用docker-compose安装Redis的主从+哨兵模式
必看
本文是一主二从一哨兵模式;其余的单机/集群/多哨兵模式的话,不在本文...
本文的环境主要是:应用app在本地,redis在云服务器上;
图解
图如下:这个图很重要;

之所以要这样画图,是因为网上很多都是在本地的虚拟机中模拟的,有些问题没有遇到...
解释下:宿主机127.0.0.1~4(即云服务器的公网ip,此处为了简单,统一127.0.0.*,标明不是在同一台服务器);
- 其中127.0.0.1的6777端口映射到doker内部容器172.30.0.2的6379端口;
- 其中127.0.0.2的6778端口映射到doker内部容器172.30.0.3的6379端口;
- 其中127.0.0.3的6779端口映射到doker内部容器172.30.0.4的6379端口;
- 其中127.0.0.4的26379端口映射到哨兵的doker内部容器的26379端口;
之所以是重置了端口,有2个原因。1是如果使用常见端口,容易被有心人扫描到,造成不安全;2是我是在同一台云服务器上部署的3台redis和哨兵,所以对外暴露的端口要不一样,如果正式的生产环境可以换成一样的。
单机模式
docker-compose.yml
version: '3.5'
services:redis:image: redis:7.0.0container_name: redisrestart: alwayscommand: redis-server --requirepass passports:- 6379:6379volumes:- ./redis/data:/data- ./redis/config/redis.conf:/etc/redis/redis.conf
redis.conf
下载redis.conf:wget http://download.redis.io/redis-stable/redis.conf
简化redis.conf配置
#开启保护
protected-mode yes
#开启远程连接
#bind 127.0.0.1
#自定义密码
requirepass pass
port 6379
timeout 0
# 在900s(15分钟)之后,如果有一个key发生改变,则dump系统快照
save 900 1
# 在300s(5分钟)之后,如果有10个key发生改变,则dump系统快照
save 300 10
# 每隔60s,如果有超过1000个key发生了变更,那么就生成一个新的dump.rdb文件,就是当前redis内存中完整的数据快照,这个操作也被称之为snapshotting,快照
save 60 1000
logfile /logs/redis.log
rdbcompression yes
dbfilename dump.rdb
dir /apps/czg-compose/redis/data
# AOF持久化,默认是关闭的,默认是打开RDB持久化
appendonly yes
appendfilename "appendonly.aof"
#每秒将os cache中的数据fsync到磁盘,这个最常用的,生产环境一般都这么配置,性能很高,QPS还是可以上万的
appendfsync everysec
单机模式不做详解;
主从+哨兵模式
注意:本文主要是解决redis和app不在同一台机子下的问题,所以将redis和sentinel的配置都放在一个docker-compose.yml中,不影响使用。
如果要借据配置问题,可以参考上面的单机模式...
仅需关注下面配置中的“很重要很重要很重要:....”即可。
docker-compose.yml
services:redis-master:image: redis:7.0.0container_name: redis-masterports:- "6777:6379" # 主节点的端口映射volumes:- redis-master-data:/data # 主节点数据持久化networks:redis-net:ipv4_address: 172.30.0.2#很重要很重要很重要:之所以requirepass和masterauth密码是一样的,见下面的PS2#很重要很重要很重要:之所以要配置replica-announce-ip、replica-announce-port,见下面的PS3command: redis-server --requirepass password --masterauth password --replica-announce-ip 127.0.0.1(外网要访问进来的ip) --replica-announce-port 6777(外网要访问进来的端口) # 可选:设置密码restart: alwaysredis-slave1:image: redis:7.0.0container_name: redis-slave1ports:- "6778:6379" # 从节点的端口映射volumes:- redis-slave-data:/data # 从节点数据持久化networks:redis-net:ipv4_address: 172.30.0.3#很重要很重要很重要:之所以requirepass和masterauth密码是一样的,见下面的PS2#很重要很重要很重要:之所以要配置replica-announce-ip、replica-announce-port,见下面的PS3command: redis-server --slaveof redis-master 6379 --requirepass password --masterauth password --replica-announce-ip 127.0.0.2(外网要访问进来的ip) --replica-announce-port 6778(外网要访问进来的端口) # 配置为主节点的从节点restart: alwaysdepends_on:- redis-masterredis-slave2:image: redis:7.0.0container_name: redis-slave2ports:- "6779:6379" # 从节点的端口映射volumes:- redis-slave-data:/data # 从节点数据持久化networks:redis-net:ipv4_address: 172.30.0.4 #很重要很重要很重要:之所以requirepass和masterauth密码是一样的,见下面的PS2#很重要很重要很重要:之所以要配置replica-announce-ip、replica-announce-port,见下面的PS3command: redis-server --slaveof redis-master 6379 --requirepass password --masterauth password --replica-announce-ip 127.0.0.3(外网要访问进来的ip) --replica-announce-port 6779(外网要访问进来的端口) # 配置为主节点的从节点restart: alwaysdepends_on:- redis-masterredis-sentinel:image: redis:7.0.0container_name: redis-sentinelports:- "26379:26379"command: redis-sentinel /etc/redis/sentinel.confvolumes:- ./conf/sentinel.conf:/etc/redis/sentinel.confnetworks:redis-net:ipv4_address: 172.30.0.16depends_on:- redis-master- redis-slave1- redis-slave2restart: alwaysnetworks:redis-net:driver: bridgeipam:config:- subnet: 172.30.0.0/16 # 子网范围gateway: 172.30.0.1 # 网关
volumes:redis-master-data:redis-slave-data:
sentinel.conf
# 哨兵监听的端口号
port 26379# 哨兵进程在前台运行,不以后台守护进程方式运行
daemonize no# 指定PID文件的存储路径
pidfile /redis-sentinel.pid# 设置 Sentinel 服务器的密码
#requirepass "password"# 不记录日志文件,日志输出到标准输出
logfile ""# 设置工作目录为/data,用于存储临时文件
dir /data# 这是 Sentinel 用来监控主节点 redis-master(主节点的主机名和端口)是否正常工作。1 表示至少需要 1 个 Sentinel 同时认为主节点不可用时才会触发故障转移。
### mymaster:要在spring.data.redis.sentinel.master=mymaster中配置
### 此处的172.30.0.2和redis-master是一样的意思,就是master的虚拟机里面的ip;
### 但是不知道为啥我的Sentinel加入不到redis-net的网络中(可以使用docker exec redis-sentinel nslookup redis-master 验证在redis-sentinel容器中是否能解析redis-master),所以配置redis-master的时候访问不到,只能配置172.30.0.2虚拟机ip;不过这里不重要,反正在生产中sentinel和redis不会在docker虚拟机的同一个网段...不纠结...
#sentinel monitor mymaster redis-master 6379 1
#sentinel monitor mymaster 172.30.0.2 6379 1### 很重要很重要很重要:之所以不采用上面两个方法,原因见下面“PS1”
sentinel monitor mymaster 127.0.0.1(master的对外ip) 6777(master的对外的端口) 1# 在sentinel.conf中为每个Redis节点添加announce配置
sentinel announce-ip 127.0.0.4(哨兵对外暴露的ip)
#sentinel announce-port 26379# 为每个Redis节点设置公网通告配置;
### 很重要很重要很重要:之所以要配置通告,见下面的PS3
### 注意,如果不配置这个的话,当原master宕机slave成为新的master以后,客户端获取到的ip地址是docker内部地址,是无法访问的,所以需要配置对外通告ip、端口;
### 除此还要配置redis.conf文件(或docker-compose.yml中的启动配置)...
sentinel config-epoch mymaster 0
# master(6777)的通告配置
sentinel known-replica mymaster 127.0.0.1(master的对外ip) 6777
# slave1(6778)的通告配置
sentinel known-replica mymaster 127.0.0.2(slave1的对外ip) 6778
# slave2(6779)的通告配置
sentinel known-replica mymaster 127.0.0.3(slave2的对外ip) 6779# 设置 Sentinel 使用的密码进行连接(如果你的 Redis 配置了密码)。
sentinel auth-pass mymaster password
#sentinel deny-scripts-reconfig yes
# 表示当 Sentinel 监控到主节点 30 秒钟无法响应时,认为主节点宕机。
sentinel down-after-milliseconds mymaster 30000# 设置故障转移的超时时间,单位是毫秒。
sentinel failover-timeout mymaster 180000# 设置在故障转移时并行同步的从节点数量。
sentinel parallel-syncs mymaster 1
很重要很重要很重要:PS1
如果在sentinel的配置中,配置master的虚拟机ip(172.30.0.2),在我们使用自己的本地应用程序app-client连接的时候是无法连接到master。我们使用应用程序连接redis的时候,先连接sentinel,sentinel会告诉我们master的ip以及端口,获取到master的ip+端口后,应用程序再去连接redis。此时如果我们在这里配置的是虚拟机ip或者容器名称,那么sentinel返回的就是虚拟机ip,而我们的应用程序在本地、redis在云服务器上,这两者不在同一台机子,所以应用程序使用172.30.0.2:6379或者容器名称是没法访问到虚拟机内部的master的(如果master和app-client是在同一台机子是没有问题的);所以此处要配置成宿主机ip+映射的端口(即公网/外网ip----或者你使用Redis Desktop Manager之类的客户端工具能直接连接的ip+端口即可)。
很重要很重要很重要:PS2
之所以要保持requirepass和masterauth密码是一样的,就是为了减少复杂配置;假如我们的每台机子密码不一样,当我们的master宕机后,slave1成为新的master后,slave2要去连接这个新的master,也就是slave2连接slave1,此时如果密码不一致,那么还需要在slave2中配置slave1的密码,反之奕然,所以最简单的方法就是所有密码保持一致...
在网上很多文章的redis其实是没有密码设置的,所以并没有配置这个。
当然这样做可能有一定风险,所以将端口给重置化,使用不常用的端口,可以减少风险;除此之外,可以通过云服务器的后台管理端,绑定固定ip访问。比如只能slave1、slave2、master、sentinel以及你本地/应用服务器的ip这几者之间可以互相通信,其他ip都直接拒绝即可。这样做的话可以防止绝大多数恶意访问,总比不设置密码好很多;
很重要很重要很重要:PS3
之所以要配置通告,原因类似于PS1。因为,如果当原来的master宕机后,sentinel会选择slave节点成为新的master,而此时就会出现PS1中的问题,在app-client中获取到的就是docker内部容器的ip,使用本地的app-client是无法访问到服务器的docker容器内的redis的,所以需要配置通告对外公布自己可以访问的ip和端口,也就是说要配置我们通过第三方客户端例如“Redis Desktop Manager”之类工具访问的ip和端口...;
注意:如果master、slave、sentinel、app-client应用都在同一个网段,甚至同一台服务器是不会出现PS1和PS3的问题的;
验证安装是否成功
1、使用redis-cli工具查看
master节点查看
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a pass info replicationdocker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a pass info replication| grep -E "role|master_host|master_port"
master只需要关注:role、master_host、master_port即可
slave节点查看
docker exec -it redis-slave1 redis-cli -h 127.0.0.1 -p 6379 -a pass info replicationdocker exec -it redis-slave2 redis-cli -h 127.0.0.1 -p 6379 -a pass info replication| grep -E "role|connected_slaves|slave*"slave只需关注:role、connected_slaves、slave*即可
sentinel节点查看
docker exec -it redis-sentinel redis-cli -h 127.0.0.1 -p 26379 -a pass info sentinel|grep -E "sentinel_masters|master*"
sentinel只需要关注:sentinel_masters、master0即可
此时如果停止原来的master,等待一段时间(本文是30s左右)后sentinel会选举slave成为新的master,此时也可以通过上面方式查看;
此时如果重新启动原来的master,会自动链接到新的master,成为新的slave。有兴趣的可以试一试...
2、使用桌面工具
如果安装成功了,可以使用sentinel的ip+端口进行访问
本文就是:127.0.0.4:26379+密码...

3、使用应用程序进行连接
...... 可自行百度....
redis-cli常用命令
### 原生redis-cli
redis-cli -h host -p port -a password
### docker安装
docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a pass
127.0.0.1:6379> PING
PONG ### 即成功
127.0.0.1:6379> set LTingZxTest04 ZHANGSANLISIWANGWU
OK
127.0.0.1:6379> get LTingZxTest04
"ZHANGSANLISIWANGWU"
切换DB库:
127.0.0.1:6379> SELECT DB库(1、2、3...)
获取所有key:
阻塞:
127.0.0.1:6379> KEYS * :获取所有key
127.0.0.1:6379> KEYS *user* :获取所有包含 "user" 的键。
非阻塞:
127.0.0.1:6379> SCAN 0 :开始扫描键。
127.0.0.1:6379> SCAN 0 MATCH user* :匹配特定模式的键。
127.0.0.1:6379> SCAN 0 COUNT 10 :每次返回10个键。
查看类型
type key_name
过期key
EXPIRE key time :过期key :
TTL key :查看键的剩余生存时间(秒)
PTTL key :查看键的剩余生存时间(毫秒)。
发布/订阅
SUBSCRIBE channel :订阅频道,例如 SUBSCRIBE mychannel。
PUBLISH channel message :发布消息到频道,例如 PUBLISH mychannel "Hello"。
获取list key
lrange key start end
获取所有:lrange key 0 -1 :获取列表中所有元素
获取前2条:lrange key 0 2 :获取列表的前3个元素
查看hash
HGETALL hashkey :获取哈希中所有字段和值,例如 HGETALL myhash。
HGET hashkey field :获取哈希中特定字段的值,例如 HGET myhash username。
查看集合
SMEMBERS setkey :获取集合中所有成员,例如 SMEMBERS myset。
其他有用命令
EXISTS key :检查键是否存在,返回1表示存在,0表示不存在。
LLEN key :查看列表的长度,例如 LLEN mylist。
HLEN hashkey :查看哈希中字段的数量,例如 HLEN myhash。
SCARD setkey :查看集合中成员的数量,例如 SCARD myset。
DEL key :删除键,例如 DEL mykey。
EXPIRE key seconds :设置键的过期时间,例如 EXPIRE mykey 3600。
相关文章:
使用docker-compose安装Redis的主从+哨兵模式
必看 本文是一主二从一哨兵模式;其余的单机/集群/多哨兵模式的话,不在本文... 本文的环境主要是:应用app在本地,redis在云服务器上; 图解 图如下:这个图很重要; 之所以要这样画图࿰…...
数据结构(Java版)第七期:LinkedList与链表(二)
专栏:数据结构(Java版) 个人主页:手握风云 一、链表的实现(补) 接上一期,下面我们要实现删除所有值为key的元素,这时候有的老铁就会想用我们上一期中讲到的remove方法,循环使用remove方法&#…...
ant-design-vue 1.X 通过id获取a-input组件失败
1.ant-design-vue 1.X 问题描述 当我在a-form组件中,以v-decorator指令绑定表单组件时,无法根据我设置的verify-code-input获取元素 <a-input type"text" id"verify-code-input" class"paIpt":placeholder"$t(…...
Flutter:吸顶效果
在分页中,实现tab吸顶。 TDNavBar的screenAdaptation: true, 开启屏幕适配。 该属性已自动对不同手机状态栏高度进行适配。我们只需关注如何实现吸顶。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import p…...
MATLAB语言的数据类型
MATLAB语言的数据类型详解 MATLAB(矩阵实验室)是一种广泛应用于科学计算、数据分析、算法开发及模型构建的高性能语言和环境。MATLAB的强大之处不仅在于其丰富的数学工具和可视化功能,还有其灵活多变的数据类型。这篇文章将详细介绍MATLAB中…...
priority_queue优先队列
目录 1. 最短路径算法(Dijkstra算法) 应用场景: 优先队列的作用: 2. 最小生成树算法(Prim算法) 应用场景: 优先队列的作用: 3. 哈夫曼编码(Huffman Coding&#x…...
HarmonyOS 鸿蒙Next 预览pdf文件
HarmonyOS 鸿蒙Next 预览pdf文件 1、使用filePreview 2、使用web组件 在线pdf(网址是直接下载的,不是直接可以预览的),先下载再预览 import media from ohos.multimedia.media;import web_webview from ohos.web.webview;import …...
vscode开启调试模式,结合Delve调试器调试golang项目详细步骤
1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板,输入Go: Install/Update Tools,并单击该命令执行,安装或更新Go语…...
身份鉴权(PHP)(小迪网络安全笔记~
免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...
【git】-初始git
一、什么是版本控制? 二、Git的安装 三、掌握Linux常用命令 四、Git基本操作 1、提交代码 2、查看历史提交 3、版本回退 一、什么是版本控制? 版本控制是一种用于记录文件或项目内容变化的系统。它通过版本标识和版本历史记录来管理不同版本&#…...
CSS 盒模型
盒模型 CSS盒模型是网页布局的核心概念之一,它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范,每个HTML元素都被视为一个矩形盒子,这个盒子由以下四个部分组成: 内容区(Content areaÿ…...
[0405].第05节:搭建Redis主从架构
Redis学习大纲 一、3主3从的集群配置: 1.1.集群规划 1.分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 2.每组是一主一从&#x…...
6 分布式限流框架
限流的作用 在API对外互联网开放的情况下,是无法控制调用方的行为的。当遇到请求激增或者黑客攻击的情况下,会导致接口占用大量的服务器资源,使得接口响应效率的降低或者超时,更或者导致服务器宕机。 限流是指对应用服务进行限制…...
sosadmin相关命令
sosadmin命令 以下是本人翻译的官方文档,如有不对,还请指出,引用请标明出处。 原本有个对应表可以跳转的,但是CSDN的这个[](#)跳转好像不太一样,必须得用html标签,就懒得改了。 sosadmin help 用法 sosadm…...
关于大数据的基础知识(四)——大数据的意义与趋势
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于大数据的基础知识(四&a…...
【EI,Scopus检索 | 往届均已检索见刊】第四届智能系统、通信与计算机网络国际学术会议(ISCCN 2025)
重要信息: 大会官网:更多详情【论文投稿】 截稿时间:以官网信息为准 大会时间:2025年2月21-23日 接受/拒稿通知:投稿后3-5个工作日内 收录检索:EI,Scopus 出版信息: 本会议所有…...
smplx blender插件笔记
目录 liunx安装: liunx安装: pip install smplx 这个创建模型报错 SMPL_blender_addon...
【算法】移除元素
今天讲的是力扣题目的题解: 力扣题目: 72.移除元素 题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不…...
【后端面试总结】设计一个分布式锁需要考虑哪些东西
分布式锁是我们在分布式场景中经常用到的一种技术,在后端面试中也是出镜率很高,那么我们设计分布式锁的时候应该从那几方面去考虑呢 实现分布式锁需要考虑的点 设置超时时间 设置超时时间的目的是为了避免这个场景:进程A拿了锁,…...
awr报告无法生成:常见案例与解决办法
awr报告无法生成:常见案例与解决办法 STATISTICS_LEVEL设置过低数据库打开状态不对主库隐含参数设置错误MMON子进程被SuspendSYS模式统计信息过期WRH$_SQL_PLAN表数据量太大AWR绑定变量信息收集超时撞上数据库Bug 9040676STATISTICS_LEVEL设置过低 STATISTICS_LEVEL设置为BAS…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
