Docker compose部署redis哨兵集群
Docker compose部署redis哨兵集群
- 安装Docker和docker-compose
- 准备docker-compose文件
- redis exporter本地部署
- 准备Redis配置文件
- ACL用户权限配置
- Linux内核参数优化
- 启停Redis实例
- 主从复制配置
环境准备:
| IP | 版本 | 角色 |
|---|---|---|
| 172.x.x.11 | RHEL 7.9 | master |
| 172.x.x.12 | RHEL 7.9 | replica |
| 172.x.x.13 | RHEL 7.9 | replica |
安装Docker和docker-compose
安装docker-ce:
# 移除旧版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 配置仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#官方源
#sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#阿里云源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast# 检查可安装的版本
yum list docker-ce --showduplicates | sort -r# 安装指定版本
#sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
yum install -y docker-ce-25.0.1 docker-ce-cli-25.0.1 containerd.io docker-buildx-plugin docker-compose-plugin# 启动
sudo systemctl enable docker
sudo systemctl start docker
配置阿里云镜像源:
cat > /etc/docker/daemon.json << EOF
{"registry-mirrors" : ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOFsudo systemctl restart docker
🐬Docker社区版部署参见:
- https://docs.docker.com/engine/install/centos/
- https://gottdeskrieges.blog.csdn.net/article/details/113242029
安装docker-compose:
curl -SL https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod 755 /usr/local/bin/docker-compose
📖参考:https://docs.docker.com/compose/install/standalone/
准备docker-compose文件
- Redis版本:7.2.4
- Redis安装路径:/opt/docker-compose/redis
准备单台服务的compose文件,每台服务器上部署一个redis实例、一个sentinel实例和一个redis exporter。容器网络采用仅主机模式,避免NAT转发的复杂性。
version: '3'services:redis-server:image: redis:7.2.4network_mode: hostcontainer_name: redis-serverrestart: unless-stopped#ports:# - 6379:6379environment:TZ: "Asia/Shanghai"command: ["/conf/redis.conf"]volumes:- ./conf/:/conf/- ./data/:/data/redis-sentinel:image: redis:7.2.4network_mode: hostcontainer_name: redis-sentinelrestart: unless-stoppedenvironment:TZ: "Asia/Shanghai"#ports:# - 26379:26379command: ["/conf/sentinel.conf","--sentinel"]volumes:- ./conf/:/conf/redis-exporter:image: oliver006/redis_exporternetwork_mode: hostrestart: unless-stoppedenvironment:TZ: Asia/ShanghaiREDIS_ADDR: redis://localhost:6379REDIS_USER: redis_monitorREDIS_PASSWORD: Monpass_xxxx# ports:# - 9121:9121
redis exporter本地部署
如果没有现成的redis exporter镜像,可以采用本地部署,并注释掉docker compose文件中的对应内容。
直接下载二进制安装包:
cd /opt
wget https://github.com/oliver006/redis_exporter/releases/download/v1.58.0/redis_exporter-v1.58.0.linux-amd64.tar.gztar -xvf redis_exporter-v1.58.0.linux-amd64.tar.gz
cd redis_exporter
./redis_exporter --redis.addr=redis://localhost:6379 --redis.user=redis_monitor --redis.password="Monpass_xxxx"
检查redis exporter采集到的数据:
curl -X GET http://localhost:9121/metrics
📖参考:https://github.com/oliver006/redis_exporter
准备Redis配置文件
哨兵节点配置文件/opt/docker-compose/redis/conf/sentinel.conf:
#port 26379
loglevel verbose
sentinel announce-ip "<REDIS_SENTINEL_IP>"
sentinel announce-port 26379
dir "/data"sentinel monitor <SVC_NAME> <REDIS_SERVER_IP> 6379 2
sentinel auth-user <SVC_NAME> sentinel_user
sentinel auth-pass <SVC_NAME> xxxxxx
sentinel down-after-milliseconds <SVC_NAME> 15000
其中,<SVC_NAME>是自定义的哨兵集群服务名。由于数据库实例和哨兵实例都部署在同一台服务器上,<REDIS_SENTINEL_IP>和<REDIS_SERVER_IP>可以都填写本地宿主机IP。
数据库节点配置文件/opt/docker-compose/redis/conf/redis.conf:
bind 0.0.0.0
#port 6379
timeout 3600
tcp-keepalive 300
loglevel notice
databases 16save 600 100
save 120 10000
save 7200 1dir /data
masteruser <username> # 主从复制用户
masterauth <password>replica-read-only yes
#min-replicas-to-write 3
#min-replicas-max-lag 10replica-announce-ip "<REDIS_SERVER_IP>"
replica-announce-port 6379
aclfile /conf/users.aclmaxclients 10000
maxmemory 10gb
maxmemory-policy noevictionappendonly yes
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
ACL用户权限配置
配置好管理员用户、监控用户、sentinel用户、主从复制用户、以及应用用户。
在redis.conf中配置aclfile参数,ACL文件(conf/users.acl)示例如下:
user default off nopass &* -@all
user root on >Rootpass_xxxx allkeys allchannels +@all
user redis_monitor on >Monpass_xxxx +client +ping +info +config|get +cluster|info +slowlog +latency +memory +select +get +scan +xinfo +type +pfcount +strlen +llen +scard +zcard +hlen +xlen +eval allkeys
user sentinel_user on >Senpass_xxxx allchannels +multi +slaveof +ping +exec +subscribe +config|rewrite +role +publish +info +client|setname +client|kill +script|kill
user replica_user on >Replpass_xxxx +psync +replconf +ping
user appuser on >Apppass_xxxx allkeys allchannels +@all -@admin -@dangerous
导入ACL文件配置:
# 列出已有的用户权限清单
docker exec -it redis-server redis-cli acl list# 导入ACL文件中的用户权限配置
docker exec -it redis-server redis-cli acl loaddocker exec -it redis-server redis-cli acl list
📖参考:https://redis.io/docs/management/security/acl/#create-and-edit-user-acls-with-the-acl-setuser-command
Linux内核参数优化
修改Linux内核参数:
sed -i '/vm.overcommit_memory/d' /etc/sysctl.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn=2048" >> /etc/sysctl.conf
sysctl -p
禁用透明大页:
cat <<EOF >> /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/enabled
fi
EOFchmod +x /etc/rc.d/rc.local
编辑/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf,添加以下配置:
* soft core unlimited
* hard core unlimited
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
最后重启服务器生效。
启停Redis实例
修改文件权限:
cd /opt/docker-compose/
chown -R polkitd:root redis/
在docker-compose.yml文件所在路径下执行以下命令来启停单个节点上的REDIS实例。
#启动容器
cd /opt/docker-compose/redis && docker-compose up -d#停止容器
cd /opt/docker-compose/redis && docker-compose stop
主从复制配置
将当前节点redis实例配置为172.x.x.11上的实例的从实例:
docker exec -it redis-server redis-cli --user xx -a xxxxxx replicaof 172.x.x.11 6379
也可以把replicaof 172.x.x.11 6379配置到从实例的redis.conf文件中。
检查各节点角色和同步状态:
docker exec -it redis-server redis-cli --user xx -a xxxxxx -h 172.x.x.11 -p 6379 info replication
docker exec -it redis-server redis-cli --user xx -a xxxxxx -h 172.x.x.12 -p 6379 info replication
docker exec -it redis-server redis-cli --user xx -a xxxxxx -h 172.x.x.13 -p 6379 info replication
测试主从切换:
# 停止172.x.x.11上的主实例
docker stop redis-server# 检查哨兵节点日志输出
docker logs -fn100 redis-sentinel# 输出以下日志内容表示发生了故障转移
...
1:X 01 Jun 2020 17:31:50.435 # +sdown master mymaster 172.x.x.11 6379 # ->主实例客观宕机
1:X 01 Jun 2020 17:31:50.458 # +new-epoch 4
1:X 01 Jun 2020 17:31:50.460 # +vote-for-leader 79c1f8276a8fedd78a9f987da8c85fce0ea7f751 4
1:X 01 Jun 2020 17:31:50.527 # +odown master mymaster 172.x.x.11 6379 #quorum 3/2 # ->主实例主观宕机
1:X 01 Jun 2020 17:31:50.527 # Next failover delay: I will not start a failover before Mon Jun 1 17:37:50 2020
1:X 01 Jun 2020 17:31:51.708 # +config-update-from sentinel 79c1f8276a8fedd78a9f987da8c85fce0ea7f751 172.x.x.12 26379 @ mymaster 172.x.x.11 6379
1:X 01 Jun 2020 17:31:51.708 # +switch-master mymaster 172.x.x.11 6379 172.x.x.12 6379 # ->主实例地址发生切换
1:X 01 Jun 2020 17:31:51.708 * +slave slave 172.x.x.13:6379 172.x.x.13 6379 @ mymaster 172.x.x.12 6379
1:X 01 Jun 2020 17:31:51.708 * +slave slave 172.x.x.11:6379 172.x.x.11 6379 @ mymaster 172.x.x.12 6379
...
上面的信息表示主实例从172.x.x.11切换到了172.x.x.12。
主从切换后,主从节点的sentinel.conf中的replicaof参数会发生变化,相应的epoch参数也会自动+1。
References:
【1】https://www.codenong.com/cs106478941/
【2】https://lipeng1667.github.io/2021/06/21/set-up-redis-with-replication-and-sentinel-using-docker-compose/
相关文章:
Docker compose部署redis哨兵集群
Docker compose部署redis哨兵集群 安装Docker和docker-compose准备docker-compose文件redis exporter本地部署准备Redis配置文件ACL用户权限配置Linux内核参数优化启停Redis实例主从复制配置 环境准备: IP版本角色172.x.x.11RHEL 7.9master172.x.x.12RHEL 7.9repli…...
Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-1、线条平滑曲面(原始图形)
环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fro…...
有趣的数学 毕达哥拉斯定理
随便找个学生,让他举出一位著名的数学家——如果他能想到的话,他往往会选择毕达哥拉斯。如果不是,也许他想到的是阿基米德。哪怕是杰出的艾萨克牛顿,在两位古代世界的巨星面前也只能叨陪末座了。阿基米德是一位思想巨人࿰…...
理解记忆相关
foreach循环 在 Java 中,foreach 循环(也称为增强型 for 循环)是一种简洁的语法,用于遍历数组或集合(如 List、Set、Map 等)。以下是 foreach 循环的基本用法: 遍历数组: String[] …...
零基础学习JS--基础篇--使用对象
JavaScript 的设计是一个简单的基于对象的范式。一个对象就是一系列属性的集合,一个属性包含一个名和一个值。一个属性的值可以是函数,这种情况下属性也被称为方法。除了浏览器里面预定义的那些对象之外,你也可以定义你自己的对象。本章节讲述…...
DHCP中继实验(华为)
思科设备参考:DHCP中继实验(思科) 一,技术简介 DHCP中继,可以实现在不同子网和物理网段之间处理和转发DHCP信息的功能。如果DHCP客户机与DHCP服务器在同一个物理网段,则客户机可以正确地获得动态分配的IP…...
【数据结构】初识二叉搜索树(Binary Search Tree)
文章目录 1. 二叉搜索树的概念2. 二叉搜索树的操作1.1 二叉搜索树的查找1.2 二叉搜索树的插入1.3 二叉搜索树的删除 1. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它可能是一棵空树,也可能是具有以下性质的二叉树: 若它的左子树不为空&am…...
数据库系统概念(第一周)
⚽前言 🏐四个基本概念 一、数据 定义 种类 特点 二、数据库 三、数据库管理系统(DBMS) 四、 数据库系统(DBS) 🏀数据库系统和文件系统对比 文件系统的弊端 🥎数据视图 数据抽象 …...
如何确定限流阈值:面试官问我,我怎么答?
在面试过程中,系统高并发是经常需要考察的,而熔断限流又是必考的,当面试官问及如何确定限流的阈值时,他们实际上是在考察你是否理解限流的本质及其在实际工作中是否有过经验。限流是一种常用的系统保护措施,用于防止过…...
HW干货集合 | HW面试题记录(1)
整理最近护网面试问的问题 前言 一开始会问问你在工作中负责的是什么工作(如果在职),参与过哪些项目。还有些会问问你之前有没有护网的经历,如果没有的话一般都会被定到初级(技术特牛的另说)。下面就是一…...
数据集踩的坑及解决方案汇总
数据集踩的坑及解决方案汇总 数据集各种格式构建并训练自己的数据集汇总Yolo系列SSDMask R-CNN报错 NotADirectoryError: [Errno 20] Not a directory: /Users/mia/Desktop/P-Clean/mask-RCNN/PennFudanPed2/labelme_json/.DS_StoreFaster R-CNN数据的格式转换划分数据集设定内…...
机器学习流程—数据预处理 Encoding
机器学习流程—数据预处理 Encoding 在机器学习中,我们经常会遇到分类变量,这些分量变量往往机器学习模型没有办法从中学习,往往有两种,一种是字符型,一种是数值型。通常需要对分类型变量做一些处理,常用的方法有两种:label encoding和one hot encoding。 例如,假设数…...
04-微服务 面试题
目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…...
Qt连接所有同类部件到同一个槽函数
void MainWindow::AutoConnectSignals() {// 查找所有 QSpinBoxconst auto spinBoxes findChildren<QSpinBox*>();for (auto *spinBox : spinBoxes){connect(spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &ParameterW…...
spring boot 使用 webservice
spring boot 使用 webservice 使用 java 自带的 jax-ws 依赖 如果是jdk1.8,不需要引入任何依赖,如果大于1.8 <dependency><groupId>javax.jws</groupId><artifactId>javax.jws-api</artifactId><version>1.1</version&g…...
【嵌入式】嵌入式系统稳定性建设:最后的防线
🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…...
【算法】一类支持向量机OC-SVM
【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机,从基础的回归和分类到后来的优化,在接触到支持向量机还有一类支持向量机的…...
深入学习默认成员函数——c++指南
前言:类和对象是面向对象语言的重要概念。 c身为一门既面向过程,又面向对象的语言。 想要学习c, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…...
psutil, 一个超级有用的Python库
Python的psutil是一个跨平台的库,可以用于获取系统运行时的各种信息,包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、…...
[Python]`threading.local`创建线程本地数据
在Python中,threading.local是一个用于创建线程本地数据的工具。它允许每个线程拥有自己独立的变量副本,这样可以在多线程程序中避免共享变量带来的问题。 通过使用threading.local,你可以为每个线程创建一个独立的变量空间,这样…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
