Redis基于docker跨服务器的一主两从三哨兵集群模式搭建

news2024/12/27 16:09:53

文章目录

  • 1 整体拓扑图
  • 2 redis与哨兵配置文件
    • 2.1 主节点配置文件
      • 2.1.1 主节点redis.conf配置文件
      • 2.1.2 主节点哨兵配置文件
    • 2.2 从节点配置文件
      • 2.1.1 从节点redis.conf配置文件
      • 2.1.2 从节点哨兵配置文件
  • 3 docke-compose编排文件
  • 4 启动并测试
    • 查看哨兵日志
    • 查看集群状态
    • 测试集群是否同步
    • 测试哨兵选举能力
  • 5 注意事项

redis经典的集群结构:一主两从三哨兵,由于平时习惯与部门规范,需要使用docker容器进行搭建。

1 整体拓扑图

在这里插入图片描述

可见,三个服务器之间的docker是完全隔离的,我们需要打通docker,或者通过docker的host模式进行访问。


2 redis与哨兵配置文件


2.1 主节点配置文件


2.1.1 主节点redis.conf配置文件

主节点按理说是不需要配置masterauth的,但是为什么主节点也要配置呢?
原因是主节点宕机后,会有其他从节点变成主节点,这是我们重启主节点后,哨兵会将我们变为从节点,这时加入到新的主节点后是需要密码的。

redis.conf示例:

# 自定义端口
port 8094
# 密码
requirepass "admin"

# 持久化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename "dump.rdb"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

# 主节点密码
masterauth "admin"

2.1.2 主节点哨兵配置文件

这里的配置的密码与上面同理

sentinel.conf示例:

# 哨兵端口
port 8095
# 开启守护线程
daemonize yes
# 与redis主节点通信 ip 端口 选举master时的quorum值
sentinel monitor mymaster 172.16.0.81 8094 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

# 关闭保护模式
protected-mode no
# 主节点密码
sentinel auth-pass mymaster admin
# 日志位置
logfile "/usr/local/redis/sentinel.log"

2.2 从节点配置文件


2.1.1 从节点redis.conf配置文件

两个从节点配置完全相同

初始化时,从节点需要加入到主节点:replicaof 172.16.0.81 8094

redis.conf示例:

# 自定义端口
port 8094
# 密码
requirepass "admin"

# 持久化
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename "dump.rdb"
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

# 主节点密码
masterauth "admin"

# 加入到主节点
replicaof 172.16.0.81 8094

2.1.2 从节点哨兵配置文件

这里的配置的密码与上面同理

sentinel.conf示例:

# 哨兵端口
port 8095
# 开启守护线程
daemonize yes
# 与redis主节点通信 ip 端口 选举master时的quorum值
sentinel monitor mymaster 172.16.0.81 8094 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

# 关闭保护模式
protected-mode no
# 主节点密码
sentinel auth-pass mymaster admin
# 日志位置
logfile "/usr/local/redis/sentinel.log"

3 docke-compose编排文件

三个节点编排文件完全一致

目录结构:

redis
├── conf
│   ├── redis.conf
│   └── sentinel.conf
├── data
│   ├── appendonly.aof
│   ├── dump.rdb
│   └── temp-1675068389.10.rdb
└── docker-compose.yml

docker-compose.yml示例:

version: "3"
services:
  redis:
    image: redis:6.2.6
    volumes:
      - ./conf:/usr/local/redis/conf/
      - ./data:/data/
    environment:
      TZ: Asia/Shanghai
    restart: always
    network_mode: host
    command:
      - sh
      - -c
      - |
          redis-sentinel /usr/local/redis/conf/sentinel.conf
          redis-server /usr/local/redis/conf/redis.conf

command下代表串行执行两个命令,如果需要并行:

command:
      - sh
      - -c
      - |
          redis-sentinel /usr/local/redis/conf/sentinel.conf &
          redis-server /usr/local/redis/conf/redis.conf

4 启动并测试

三个节点分别使用docker-compose up -d启动

查看哨兵日志

docker-compose exec redis tail -f /usr/local/redis/sentinel.log

发现已经找到了两个从节点和其余两个哨兵

9:X 30 Jan 2023 18:06:10.586 # Configuration loaded
9:X 30 Jan 2023 18:06:10.587 * monotonic clock: POSIX clock_gettime
9:X 30 Jan 2023 18:06:10.588 * Running mode=sentinel, port=8095.
9:X 30 Jan 2023 18:06:10.588 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
9:X 30 Jan 2023 18:06:10.588 # Sentinel ID is d51d174841dc2be296b18359b05f181a1675f1f6
9:X 30 Jan 2023 18:06:10.588 # +monitor master mymaster 172.16.0.81 8094 quorum 2
9:X 30 Jan 2023 18:06:17.293 * +sentinel sentinel 08323b3dfe0150a0a0d31d59bf21b30706a7fc83 172.16.0.84 8095 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:06:21.710 * +slave slave 172.16.0.84:8094 172.16.0.84 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:06:21.712 * +slave slave 172.16.0.82:8094 172.16.0.82 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:06:22.305 * +sentinel sentinel 728694c0bfccdc12f5e82d17bf9aebd2aeedac69 172.16.0.82 8095 @ mymaster 172.16.0.81 8094

查看集群状态

使用redis-cli查看主节点:info replication

role:master
connected_slaves:2
slave0:ip=172.16.0.84,port=8094,state=online,offset=33332,lag=1
slave1:ip=172.16.0.82,port=8094,state=online,offset=33332,lag=1
master_failover_state:no-failover
master_replid:3f89e662faf55bfde5e0fb0ce11b96ef638ff71b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:33468
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:33468

使用redis-cli查看从节点:info replication

role:slave
master_host:172.16.0.81
master_port:8094
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:58524
slave_repl_offset:58524
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:3f89e662faf55bfde5e0fb0ce11b96ef638ff71b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:58524
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:58524

测试集群是否同步

在主节点添加key,在从节点上可以读取

测试哨兵选举能力

这时我们停掉主节点:docker-compose stop

然后去从节点查看哨兵日志:docker-compose exec redis tail -f /usr/local/redis/sentinel.log

通过日志发现已经选举出来的新的主节点:

9:X 30 Jan 2023 18:19:46.731 # +sdown master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:46.731 # +sdown sentinel d51d174841dc2be296b18359b05f181a1675f1f6 172.16.0.81 8095 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:46.832 # +odown master mymaster 172.16.0.81 8094 #quorum 2/2
9:X 30 Jan 2023 18:19:46.832 # +new-epoch 1
9:X 30 Jan 2023 18:19:46.832 # +try-failover master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:46.834 # +vote-for-leader 08323b3dfe0150a0a0d31d59bf21b30706a7fc83 1
9:X 30 Jan 2023 18:19:46.839 # 728694c0bfccdc12f5e82d17bf9aebd2aeedac69 voted for 08323b3dfe0150a0a0d31d59bf21b30706a7fc83 1
9:X 30 Jan 2023 18:19:46.918 # +elected-leader master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:46.918 # +failover-state-select-slave master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.009 # +selected-slave slave 172.16.0.84:8094 172.16.0.84 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.009 * +failover-state-send-slaveof-noone slave 172.16.0.84:8094 172.16.0.84 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.062 * +failover-state-wait-promotion slave 172.16.0.84:8094 172.16.0.84 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.863 # +promoted-slave slave 172.16.0.84:8094 172.16.0.84 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.863 # +failover-state-reconf-slaves master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:47.937 * +slave-reconf-sent slave 172.16.0.82:8094 172.16.0.82 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:48.883 * +slave-reconf-inprog slave 172.16.0.82:8094 172.16.0.82 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:48.883 * +slave-reconf-done slave 172.16.0.82:8094 172.16.0.82 8094 @ mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:48.938 # -odown master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:48.938 # +failover-end master mymaster 172.16.0.81 8094
9:X 30 Jan 2023 18:19:48.938 # +switch-master mymaster 172.16.0.81 8094 172.16.0.84 8094
9:X 30 Jan 2023 18:19:48.938 * +slave slave 172.16.0.82:8094 172.16.0.82 8094 @ mymaster 172.16.0.84 8094
9:X 30 Jan 2023 18:19:48.938 * +slave slave 172.16.0.81:8094 172.16.0.81 8094 @ mymaster 172.16.0.84 8094
9:X 30 Jan 2023 18:19:53.996 # +sdown slave 172.16.0.81:8094 172.16.0.81 8094 @ mymaster 172.16.0.84 8094

然后重启之前的主节点:docker-compose start ,这时之前的主节点已经变为从节点,经过测试,没有问题。

至此,完美撒花!

5 注意事项

注意注意注意:

使用docker时,如果不使用host网络模式,那么会有哨兵之间访问不通,也就是哨兵失效的问题。

问题复现:

docker容器内端口6379:映射到宿主机8094,那么!!!

在从节点向主节点注册时,注册的ip是宿主机的ip,端口则是容器内部的端口,你说坑不坑!

然后哨兵则会去主节点找相关从节点的信息,获取到的就是 宿主机的ip+容器内部的端口,讲道理,这根本不通的好吗!跨服务器docker的完全隔离的

解决方案

方案1:不使用docker,使用原生,是比较好的方案,但是我们公司的场景不允许

方案2:打通不同主机下docker网络,成本太高,不适用

方案3:修改redis配置文件,使容器内和映射出来的端口完全一致,啊这。。。有点舍近求远,而且只是曲线救国,掩盖了问题,不太好,pass了。

方案4:使用host网络模式:network_mode: host,这样docker容器会使用宿主机的ip和端口,嗯。。。这样就不用映射了,想改端口直接修改配置文件就行了,挺好


在一主两从三哨兵集群模式模式中,哨兵会动态修改我们的配置文件,如果有主节点挂了,那么哨兵会自动帮我们把新的主节点写入到配置文件中。

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

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

相关文章

Spring源码分析 (Spring启动过程之容器对象的创建) (十五)

点进去 1.this() 2.注册配置类 3.refresh() Spring会将所有交由Spring管理的类,扫描其class文件,将其解析成BeanDefinition,在BeanDefinition中会描述类的信息,例如:这个类是否是单例的,Bean的类型,是否是懒…

导向滤波算法——OpenGL实现

导向滤波 一、介绍 导向滤波又称引导滤波,通过一张引导图片反映边缘、物体等信息,对输入图像进行滤波处理,使输出图像的内容由输入图像决定,但纹理与引导图片相似。 导向滤波的原理是局部线性模型,在保持双边滤波的优…

【学习笔记】多线程

1、线程基础 1.1 创建线程的几种方式 继承Thread 类,覆盖run方法实现Runable接口。实现run方法。然后 通过Thread类构造方法获取Thread对象。实现Callable接口。实现call方法。 call方法可以抛出异常。也可以有返回值。 run与start 调用run方法任然是主线程在执行。…

这个 Python 游戏库,打开就能玩一天

会 Python 的小伙伴,选择用 Python 让“大风车”吱呦呦地转!还有的小伙伴,选择用 Turtle 库绘制童年的卡通人物 我们其实还可以选择用 Python 开发小游戏,回忆童年的美好时光。 “凹凸版”吃豆子 这次并非用pygame制作的&#…

MyBatis超详细学习笔记(黑马)

目录 一、MyBatis快速入门 (一)打开MyBatis中文官网 (二)在工程中(pom.xml)导入MyBatis依赖 (三)编写MyBatis核心配置文件——替换连接信息,解决硬编码问题 &#x…

关于加强网络舆情监测的几点建议,TOOM强化舆情监控有方法

网络舆情监测是一项旨在通过监测网络上的舆情信息,了解社会舆论和网络话语状况,分析舆情动态,预测舆情走向,并进行舆情管控的工作。主要通过计算机技术和信息科学手段对网络信息进行收集、整理、分析和报告,以便于管理…

Golang - 操作Redis

Golang - 操作Redis go-redis是Golang语言连接、操作Redis服务的客户端,几乎包含了对Redis的所有操作,具体如下: 简单易用 兼容多种Redis部署架构,可用于Redis服务器、Redis群集、Redis Sentinel,甚至Redis服务器环go-redis 支持…

配置TF-A源码

配置TF-A源码 1.对tf-a源码进行解压 $> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.打补丁 进入/home/ubuntu/FSMP1A/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2目录 执行 for p in ls -1 ../*.patch; do patch -p1 < $p; done 3.配置工具链 1)进入/home/ubuntu/FS…

05 CSS-CSS语法【尚硅谷JavaWeb教程】

05 CSS-CSS语法【尚硅谷JavaWeb教程】 JAVAWEB的学习笔记 学习视频来自&#xff1a;https://www.bilibili.com/video/BV1AS4y177xJ/?vd_source75dce036dc8244310435eaf03de4e330 为什么需要CSS 传统的园区网络采用设备和链路冗余来保证高可靠性&#xff0c;但其链路利用率低、…

Task7:动态函数

目录注意一 Filter函数二 Subtotal函数注意 filter&#xff0c;目前只有office365支持 一 Filter函数 作用&#xff1a;需要根据指定的条件&#xff0c;将符合条件的所有记录从数据源表格式查找过来之前方法&#xff1a; 用高级筛选&#xff08;缺点&#xff1a;在查询下一个…

SAP ADM100-Unit4 数据库工作原理:中央数据库管理与DBA Cockpit

概览 本节介绍DBA Cockpit,介绍SAP环境下数据库管理和监控的要点。 使用DBA Cockpit计划日历去计划数据和日志信息的周期性备份。 课程目标 备份数据库内容 检查数据库备份是否成功被执行。 1、DBA Cockpit总览 为了最少的系统停机时间和更高的系统性能,必须计划定期的…

云计算|OpenStack|社区版OpenStack安装部署文档(一 --- 前期硬件准备和部署规划)

前言&#xff1a; 社区版OpenStack是比较难以安装部署的&#xff0c;本文将就安装部署做一个详细的说明。 首先&#xff0c;OpenStack社区版本众多&#xff0c;如何选择一个合适的版本是第一个要解决的问题&#xff08;这里的合适是指的OpenStack版本和操作系统的版本合适&am…

MATLAB-自动控制原理-时域分析

目录 step函数&#xff08;求阶跃响应&#xff09;: impulse函数&#xff08;求脉冲响应&#xff09;: lsim函数&#xff08;求输出&#xff09;: 1&#xff0c;求二阶系统不同阻尼比条件下的阶跃响应曲线 2&#xff0c;求二阶负反馈系统的动态性能指标 利用MATLAB可以方…

五、好友关注,feed流推送

文章目录关注和取消关注&#xff0c;共同关注Feed流推送Feed介绍Timeline推模式Feed流滚动分页滚动分页查询收邮箱官方命令文档&#xff1a;https://redis.io/commands/ 关注和取消关注&#xff0c;共同关注 需求&#xff1a; 可以对一个用户进行关注和取消关注查询和一个用…

深刻理解状态机设计需要避免的冒险;处理单元里的control和datapath;时序电路可能存在essential hazard;竞争冒险【SV】【VLSI】

深刻理解状态机设计需要避免的冒险&#xff1b;处理单元里的control和datapath&#xff1b;时序电路可能存在essential hazard&#xff1b;竞争冒险【SV】【VLSI】0. 前言&#xff1a;时序电路可能存在essential hazard1. 理解control和datapath1.1 Datapath control2. 硬件电路…

JavaScript XHR、Fetch

前后端分离的优势 ◼ 早期的网页都是通过后端渲染来完成的&#xff1a;服务器端渲染&#xff08;SSR&#xff0c;server side render&#xff09;&#xff1a; \qquad 客户端发出请求-> 服务端接收请求并返回相应HTML文档-> 页面刷新&#xff0c;客户端加载新的HTML文…

如何采用conda配置python虚拟环境

文章目录一、创建python虚拟环境二、配置刚创建的虚拟环境三、将虚拟环境配置到相应项目一、创建python虚拟环境 首先选中要配置环境的文件 如下&#xff1a; 在此处输入cmd按回车 此处我创建一个环境名为hands3dtext&#xff0c;环境版本为3.7.2的初始环境 conda create -n…

Visual Studio 2015配置OpenCV4.5.3(c++版)

学习目标学会在Visual Studio 2015部署Opencv一个简单的C Opencv实例一、 Visual Studio 2015配置Opencv4.5.31.1 Visual Studio 2015网上关于Visual Studio 2015的下载&#xff0c;也有很多介绍。大家自行搜索安装。1.2 OpenCVOpenCV大家根据需求下载相应版本&#xff0c;官网…

ObjectARX如何修改多行文字的格式

一 AutoCAD中多行文字的格式设置 AutoCAD在设置多行文字格式时使用了非常特殊的方式&#xff0c;多行文字整体可以有诸多格式属性&#xff0c;比如字高、颜色、旋转角度等等&#xff1b;但是&#xff0c;多行文字的每一个字符其实也可以有自己单独的格式。 比如&#xff0c;下…

java ssm学校二手服饰交易系统服装商城的卖家

目 录 Abstract 1 第一章 绪论 2 1.1课题背景 2 1.2课题研究的目的和意义 3 1.3论文所做的主要工作 3 第二章 技术介绍 4 2.1 B/S架构 4 2.2 MySQL 介绍 4 2.3 JSP技术介绍 4 第三章 系统分析与设计 6 3.1 可行性分析 6 3.2系统说明 6 3.…