使用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。

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

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

相关文章

电脑提示directx错误导致玩不了游戏怎么办?dx出错的解决方法

想必大家都有过这样的崩溃瞬间:满心欢喜打开心仪的游戏,准备在虚拟世界里大杀四方或者畅游冒险,结果屏幕上突然弹出个 DirectX 错误的提示框,紧接着游戏闪退,一切美好戛然而止。DirectX 作为 Windows 系统下游戏运行的…

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)

汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2) 下面我们继续来介绍AutoSAR CP分层架构,下面的文字和图来自AutoSAR官网目前最新的标准R24-11的分层架构手册。该手册详细讲解了AutoSAR分层架构的设计,下面让我们来一起学习一下。 Introductio…

消息中间件类型介绍

消息中间件是一种在分布式系统中用于实现消息传递的软件架构模式。它能够在不同的系统或应用之间异步地传输数据,实现系统的解耦、提高系统的可扩展性和可靠性。以下是几种常见的消息中间件类型及其介绍: 1.RabbitMQ 特点: • 基于AMQP&#…

WEB攻防-通用漏洞_文件上传_黑白盒审计流程

目录 前置知识点 Finecms-CMS文件上传 ​编辑 Cuppa-Cms文件上传 Metinfo-CMS 文件上传 前置知识点 思路: 黑盒就是寻找一切存在文件上传的功能应用 1 、个人用户中心是否存在文件上传功能 2 、后台管理系统是否存在文件上传功能 3 、字典目录扫描探针文件上传构…

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的,所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示: FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上…

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

在Windows环境下搭建无人机模拟器

最近要开发无人机地面站,但是没有无人机,开发无人机对我来说也是大姑娘坐花轿——头一回。我们要用 MAVLink 和无人机之间通信,看了几天 MAVLink,还是不得劲儿,没有实物实在是不好弄,所以想先装一个无人机模…

HTB:Topology[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 提取并保存靶机TCP开放端口号 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用浏览器访问靶…

【 Verdi实用技巧-Part-3】

Verdi实用技巧-Part-3 3 Verdi实用技巧-Part-33.1 nWave window(看波形窗口)3.2 收集coverage3.3 nWave window3.4 Verdi-->app3.5 Force信号用Verdi去debug 本篇文章继续介绍Verdi实用技巧–Part-3; 3 Verdi实用技巧-Part-3 3.1 nWave window(看波形窗口) nWave window …

Vue sm3国密 IE模式报错处理

1、sm-crypto 转义错误 查看报错信息包名 在vue.config.js的transpileDependencies中把依赖包添加进去,让babel能够转译sm-crypto包 babel.config.js module.exports {presets: [[vue/app, {useBuiltIns: entry}]] }2、exports.destroy (() > { … }&a…

docker 基本使用

-do1.安装docker: Redirecting… 0. docker内使用gpu, 安装nvidia-docker: https://github.com/NVIDIA/nvidia-docker, 安装后使用:nvidia-container-cli -k -d /dev/tty list, 验证正确,无报错,即为正确 1. docker 启动image,如…

手机的ip地址是根据电话卡归属地定吗

在智能手机普及的今天,IP地址作为我们连接互联网的“门牌号”,其来源和确定方式常常引发用户的好奇。特别是关于手机IP地址是否与电话卡的归属地直接相关,这一话题更是众说纷纭。本文将深入探讨这一问题,为您揭开手机IP地址与电话…

计算机网络 (32)用户数据报协议UDP

前言 用户数据报协议(UDP,User Datagram Protocol)是计算机网络中的一种重要传输层协议,它提供了无连接的、不可靠的、面向报文的通信服务。 一、基本概念 UDP协议位于传输层,介于应用层和网络层之间。它不像TCP那样提…

YOLOv5改进 | CARAFE提高精度的上采样方法

目录 1 CARAFE模块原理 1.1 上采样的表示 1.2 Motivation 2 YOLOv5中加入CARAFE模块 2.1 ultralytics/nn/modules/block.py文件配置 2.2 ultralytics/nn/tasks.py配置 2.3 创建添加优化点模块的yolov5x-CARAFE.yaml 参考文献 1 CARAFE模块原理 上采样操作可以表示为…

高通,联发科(MTK)等手机平台调优汇总

一、常见手机型号介绍: ISP除了用在安防行业,还有手机市场,以及目前新型的A/VR眼睛,机器3D视觉机器人,医疗内窥镜这些行业。 下面是一些最近几年发布的,,,旗舰SOC型号: 1.联发科:天玑92…

windows从0开始配置llamafactory微调chatglm3-6b

后续会更新 从0学习LLaMaFactory参数解释说明 ,请期待~ 文章目录 一、准备工作1、创建python虚拟环境(annoconda)2、配置pytorch傻瓜版3、llamafactory配置4、微调数据准备5、开始微调5.1 webui启动微调5.2 指令启动微调 一、准备工作 1、创建python虚拟环境(annoc…

某漫画网站JS逆向反混淆流程分析

文章目录 1. 写在前面1. 接口分析2. 反混淆分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Pyth…

netplan apply报错No module named ‘netifaces‘

Ubuntu 20.04.5 LTS \n \l,ctrlaltf2切换字符登录f1切换图形 处理办法: root登录执行 rootnode37:/disk1/Qwen2.5-72B-Instruct-GPTQ-Int4# cat /etc/netplan/01-network-manager-all.yaml # Let NetworkManager manage all devices on this system …

LabVIEW 系统诊断

LabVIEW 系统诊断是指通过各种工具和方法检测、评估、分析和解决 LabVIEW 程序和硬件系统中可能存在的故障和性能问题。系统诊断不仅涵盖软件层面的调试与优化,还包括硬件交互、数据传输、实时性能等方面的检查和分析。一个成功的系统诊断能够显著提升LabVIEW应用程…