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

news2024/11/15 11:58:20

文章目录

  • 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/188630.html

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

相关文章

在 Visual Studio 中更好地进行搜索

当在 IDE 中查找特定的代码文件、类、方法或者功能、选项,找到它们并不总是那么容易。有多种搜索方式,到底该选择哪一种才最便捷呢?新的“一站式”搜索(All-In-One Search)将代码和功能搜索合并到同一个 UI 中&#xf…

从GPT到chatGPT(三):GPT3(一)

#GPT3 文章目录前言正文摘要介绍方法模型结构训练数据集训练过程评估小结前言 OpenAI在放出GPT2后,并没有引起业界太大的影响和关注,究其原因,并不是zero-shot这种想法不够吸引人,而是GPT2表现出来的效果依然差强人意&#xff0c…

Unity数据持久化-PlayerPrefs

1. PlayerPrefs 是什么? 是Unity提供的可以用于存储读取玩家数据的公共类 1.1. 存储相关 PlayerPrefs的数据存储类似于键值对存储 一个键对应一个值 提供了存储3种数据的方法int float string 键:string类型 值: int float string对应3种API PlayerPrefs.SetInt(…

如何将宿主机工作文件夹映射到vmware虚拟机内

将宿主机工作文件夹映射到vmware虚拟机内vmware启用共享文件夹在虚拟机中使用vmtools进行挂载虚拟机为linux系统,操作中使用的是凝思系统 vmware启用共享文件夹 在vmware中将需要共享的工作文件夹添加到共享列表中,如图 在虚拟机中使用vmtools进行挂…

Tomcat部署项目及Tomcat间会话同步

目录一、Tomcat中部署项目的相关配置1.相关配置2.测试二、Tomcat间的会话同步1.配置Tomcat2.修改web工程的WEB-INF下的web.xml3.配置Nginx4.测试一、Tomcat中部署项目的相关配置 1.相关配置 在Tomcat中进入conf/tomcat-users.xml文件&#xff0c;将以下代码放到最后 <rol…

本地Exchange备份方案

Exchange Server的Windows服务器备份只能执行基础还原&#xff0c;并且不支持对邮箱项执行粒度还原。在需要恢复单个已删除的电子邮件或文件夹的情况下&#xff0c;本机解决方案提供了一个耗时且低效的过程。Exchange ServerRecoveryManager Plus帮助您克服这些限制。使用Recov…

国内有哪些移动开发平台?各有什么特点

开年找解决方案的时候接触了一批移动开发平台&#xff0c;猛然发现近几年移动开发平台如雨后春笋般出现&#xff0c;于是乎就想针对市场上越来越多的移动开发平台做一次盘点对比&#xff0c;看看他们的基本情况和自身特点优势&#xff0c;也希望能够对有需要的开发者有一定的参…

Docker - 4. 容器常用命令 docker run、exit、ps、rm、start、stop、kill

目录 1. 新建容器并启动 2. 从容器中退回主机 3. 列出所有运行的容器 4. 退出容器 5. 删除容器 6. 启动和停止容器 7. 易混淆地方 1. 新建容器并启动 语法&#xff1a;docker run [可选参数] 镜像名 参数&#xff1a; 参数含义--name "Name" 容器名字&a…

java泛型1

泛型&#xff08;为了集合&#xff09; Java 5增加泛型支持在很大程度上都是为了让集合能记住其元素的数据类型。在没有泛型之前&#xff0c;一旦把一个对象“丢进”Java集合中&#xff0c;集合就会忘记对象的类型&#xff0c;把所有的对象当成Object类型处理。当程序从集合中取…

基于深度学习框架设计的货运管家(功能总结)

项目背景&#xff1a; 在快递行业发达的今天&#xff0c;有数不胜数的货运公司、快递公司&#xff0c;这些公司都有自己的运输车辆&#xff0c;请师傅开车送货。 比如&#xff1a;快递公司、烟草运输公司、货物运输公司等等。 为了能方便管理货车&#xff0c;了解车辆行驶路线…

49.Isaac教程--Cartographer

Cartographer ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录Cartographer数据要求配置启动 Cartographer 示例应用程序监控和可视化输出Cartographer 是 Google 的一个&#xff08;同步定位和映射&#xff09;SLAM 系统&#xff0c;能够…

2023最新前端面试题5(持续更新)

Vue 74、vue 生命周期 74.1、什么是 Vue 生命周期? Vue 实例从创建到销毁的过程&#xff0c;就是生命周期。也就是从开始创建、初始化数据编译模板、挂载 Dom一渲染、更新一渲染、卸载等一系列过程&#xff0c;我们称这是 Vue的生命周期 74.2、Vue 生命周期的作用是什么?…

函数递归+青蛙跳台阶——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容终于要回到我们的C语言了&#xff0c;在之前&#xff0c;我写函数这篇博客的时候就讲过&#xff0c;会把函数递归的内容单独拿出来&#xff0c;然后呢当时是说下一篇博客就会更函数递归和青蛙跳台阶&#xff0c;由于一系列原…

拼多多控价,低价投诉,不被支持怎么办

治理电商平台上的低价乱价链接&#xff0c;首选方法是沟通调整&#xff0c;成本低、见效快。针对沟通调整不成功的&#xff0c;再进行平台投诉&#xff0c;通过电商平台的力量对其进行约束。 但是&#xff0c;平台投诉一定要注意一点&#xff1a;不要以低价为理由&#xff01;…

原命题和逆否命题

看Boyd的凸优化看到这样一个证明&#xff1a; 从左到右的证明是 使用了一个逆否命题的方法进行证明&#xff0c;有点忘记了原命题和逆否命题之间的相互转换&#xff0c;记录一下。 简单形式命题 简单形式命题没有全称量词∀\forall∀和存在两次∃\exists∃&#xff0c;也没有…

字符流、字节流、缓冲流、序列化流

1.文件拷贝的基本代码 2.一次读取多个字节 3.异常处理 但是上述的释放过程太繁琐&#xff0c;于是便用AutoCloseable接口简化释放过程 JDK7: JDK9: 4.各种字词计算机存储规则 所以底层二进制文件就是根据正负来区别英文和中文的。 5.乱码 6.字符流 7.字符输入流和输出流底层原理…

ASEMI桥式整流电路KBP206特性参数的计算

编辑-Z 什么是桥式整流电路&#xff1f; 桥式整流电路由四个二极管以闭环“桥式”配置连接&#xff0c;以产生所需的输出。这种桥式电路的主要优点是不需要特殊的中央抽头变压器&#xff0c;从而减小了尺寸和成本。单个次级绕组连接到二极管桥网络的一侧&#xff0c;负载连接到…

【正点原子FPGA连载】第二十一章根文件系统构建 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十一章根文件…

ch3_1系统总线的概念

1. 总线的基本概念 总线概念&#xff1a; 是连接各个部件的信息传输线&#xff0c;是各个部件共享的传输介质&#xff1b; 1.1 为何需要总线 总线结构便于增减 外设&#xff0c; 同时 减少了信息传输线的条数。 总线是信号的公共传输线&#xff0c; 1.2 总线上信息的传送 …

深入理解堆与优先队列

目录一、什么是堆&#xff1f;二、堆的实现2.1 上滤与下滤2.2 堆的常用操作2.3 建堆三、堆排序四、优先队列References一、什么是堆&#xff1f; 堆&#xff08;Heap&#xff09;是一种特殊的完全二叉树&#xff0c;满足性质&#xff1a;除叶节点外每个节点的值都大于等于&…