Redis一主一从Docker方式部署通过keepalived和 sentinel哨兵模式实现高可用

有两台服务器一台是主,master : 172.24.69.180
另外一台是从, slave :172.24.69.181
vip 地址: 172.24.69.185

1、关闭防火墙

两台服务器都关闭防火墙

systemctl disable --now firewalld
firewall-cmd --state

关闭SELinux

setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus

首先关闭防火墙,有一次我没有关闭,vip一直无法漂移,找了好久

2、安装docker

两台服务器都安装docker
用二进制安装:
1、获取docker离线二进制包

docker二进制包获取地址:https://download.docker.com/linux/static/stable/x86_64/

2、上传服务器,解压缩

tar xzf docker-20.10.8.tgz
#解压缩完成后将docker目录中的所有文件复制至/usr/bin/目录下
cp docker/* /usr/bin

3、配置docker.service文件
vim /usr/lib/systemd/system/docker.service
在文件输入下面内容

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target

4、创建挂载目录

创建目录
mkdir /data/docker

5、确认daemon.json

mkdir /etc/dockervim /etc/docker/daemon.json

在daemon.json中输入下面内容:

{"graph": "/data/docker","storage-driver": "overlay2","registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],"bip": "172.7.21.1/24","log-driver":"json-file","log-opts":{ "max-size" :"100m","max-file":"3"},"exec-opts": ["native.cgroupdriver=systemd"]
}

6、启动docker 服务

systemctl daemon-reload
systemctl enable --now docker

3、安装redis

两台服务器都安装redis ,只是主从的配置稍有不一样
1、拉取镜像

 docker pull redis:6.2.6

2、 创建挂载目录

mkdir -p /data/redis/logs
mkdir -p /data/redis/data
chmod 777 /data/redis/data
chmod 777 /data/redis/logs

3、 主节点的配置, 在172.24.69.180上

cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16save 900 1
save 300 10
save 60 10000dbfilename dump.rdbloglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysecrequirepass pass123
masterauth pass123
EOF

配置文件中的 pass123 是设置的redis的密码

从节点的配置,在172.24.69.181 上

cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16save 900 1
save 300 10
save 60 10000dbfilename dump.rdbloglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysecrequirepass pass123
masterauth  pass123slaveof 172.24.69.180 6379        
EOF

slaveof 172.24.69.180 这个是主节点的ip

4、Docker启动redis
主节点

docker run -dit --name mianredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

从节点

docker run -dit --name slaveredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

5、启动redis之后copy redis-cli 到宿主机的 /usr/local/bin/目录下
主节点

docker cp mianredis:/usr/local/bin/redis-cli /usr/local/bin/

从节点

docker cp slaveredis:/usr/local/bin/redis-cli /usr/local/bin/

4、Redis主从+sentinel(哨兵)+keepalived

两个节点都安装,只是配置不一样

实现的原理

在master和backup服务器分别安装哨兵和keepalived,master的优先级为100,backup的优先级为99,在salve服务器上配置vrrp_script检查脚本规则,检查slave当前的角色状态,一旦slave的redis角色状态为master,就把slave的优先级加2变为101,使其获得vip的权限;
当master的redis服务挂掉后,哨兵会将slave提升为新的master,slave检查角色状态为master时将优先级加2获得vip,当原来master的redis服务起来后哨兵将其作为slave加入到主从复制
当变为master的slave节点上redis服务挂掉后,哨兵会将redis的master设置为原来的master节点,vrrp_script检查自己的redis不是master时,将优先级减2变为99,原来的master优先级比slave优先级高,原来的master获得vip权限

1、sentinel.conf配置
主节点配置
路径在/data/redis/sentinel.conf, 在sentinel.conf输入下面的内容

port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.180"
sentinel announce-port 26379

从节点配置
sentinel.conf配置, 路径在/data/redis/sentinel.conf

port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.181"
sentinel announce-port 26379

172.24.69.180此处是主节点ip
172.24.69.181 是从节点ip

2、启动哨兵
主节点:

docker run -d --name main --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

从节点:

docker run -d --name slave --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

5、安装keepalived

两个服务器都安装,只是配置不一样
安装keepalived

yum -y install keepalived 

1、 修改配置文件
主节点的配置:
配置文件为/etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {router_id redis-225 ##设备名称
}
vrrp_script chkmaster{script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为masterinterval 3 #每3秒检查一次weight -2 #当本机为master检测结果返回1,将优先级加2
}
vrrp_instance VI_redis {state MASTER ##当前设备为masterinterface enp4s1  ##vip绑定的网卡virtual_router_id 79 ##备份组id,同一备份组要一致priority 100 ##优先级,优先级高的成为masteradvert_int 3 ##每多少秒进行一次健康检查unicast_src_ip  172.24.69.180 ##(本地IP地址)unicast_peer {172.24.69.181  ##(对端IP地址)此地址一定不能忘记}authentication {auth_type PASSauth_pass redis}virtual_ipaddress {172.24.69.185/24}track_script{ ##调用状态检查chkmaster}
}

从节点配置

! Configuration File for keepalived
global_defs{router_id redis-224}
vrrp_script chkmaster{script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为masterinterval 3 #每3秒检查一次weight -2 #当本机为master检测结果返回1,将优先级加2}
vrrp_instance VI_redis
{state BACKUP #本机的状态信息interface enp4s1   #vip绑定的网卡virtual_router_id 79 ##备份组id,同一备份组要一致priority 99 ##优先级,优先级高的成为masteradvert_int 3 ##每多少秒进行一次健康检查unicast_src_ip  172.24.69.181 ##(本地IP地址)unicast_peer {172.24.69.180  ##(对端IP地址)此地址一定不能忘记}authentication{auth_type PASSauth_pass redis}virtual_ipaddress{172.24.69.185/24}track_script{ ##调用状态检查chkmaster}
}

2、主从的脚本都一样状态检查脚本内容:

#!/bin/bash
STATUS=`/usr/local/bin/redis-cli -h $1 -p $2 -a $3 info | grep role:master | wc -l`
echo $STATUS
if [ "$STATUS" -eq 0 ];then    exit 1
else    exit 0
fi

3、给脚本权限

chmod -R 755 /etc/keepalived/chkmaster.sh

4、重启keepalived

systemctl daemon-reload
systemctl enable --now keepalived
systemctl stop keepalived     #关闭keepalived
systemctl start keepalived     #启动keepalived

5、验证redis是否正常

#登录redis
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123
#查看redis信息
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123 info

6、验证vip 是否可以漂移
查看此时vip 在哪台服务器上,手动停止vip所在服务器上的redis 容器,看vip 是否能漂移到另外一台服务器,如果能漂移,把停掉的服务重新启动,再把vip所在的服务器的redis 容器停掉,看vip是否能漂移到另外一台,如果可以就成功了。

通过查看keepalived的状态,看到优先级的变化
在这里插入图片描述

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

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

相关文章

uniapp-秋云图表 ucharts echarts 对比与关系

科普&#xff1a; 秋云图表库&#xff0c;包含二种配置属性对应二种js配置文件。 一种是 &#xff1a;echarts.js,一种是 &#xff1a; ucharts。 二者的配置属性不一样&#xff01; ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库&#xff0c;它…

考研408 | 【操作系统】终章

I/O设备的基本概念和分类 I/O设备&#xff1a; I/O设备的分类 1.按使用特性&#xff1a; 2.按传输速率分类&#xff1a; 3.按信息交换的单位分类&#xff1a; 总结&#xff1a; I/O控制器 I/O设备的机械部件&#xff1a; I/O设备的电子部件&#xff08;I/O控制器&#…

工程师是怎样对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师&#xff0c;亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践&#xff0c;也看到了很多 Bad Cases&#xff0c;所以想把自己的一些心得体会写在这里&#xff0c;供工程师进行…

Python八大排序实现方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片 1.基数排序 基数排序的基本思想是先将数字按照个位数上数字的大小进行排序&#xff0c; 排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序&#xff0c;依次推…

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录&#xff0c;如果你使用root登陆&#xff0c;那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…

Silicon Labs BG22、xG24、BG27无线SoC比较及信驰达无线模块选型指南

作为安全、智能无线技术领域的前沿品牌&#xff0c;全球知名IC设计公司——Silicon Labs&#xff0c;在最近几年陆续推出了EFR32BG22、EFR32xG24、EFR32BG27等系列无线SoC。RF-star作为物联网行业领先的无线通信模组厂商&#xff0c;基于Silicon Labs的无线SoC推出了RF-BM-BG22…

iOS开发Swift-5-自动布局AutoLayout-摇骰子App

1.在iOS坐标系中&#xff0c;以向左、向下为正方向。图片以左上角为基准点。 2.打开之前的摇骰子App&#xff0c;对它的界面做一些适应所有iPhone机型的效果。 3.先对上方logo做一个y轴约束和一个宽高约束。 宽高约束&#xff1a; 水平居中&#xff1a; 对y轴进行约束。将虚线点…

window 常用基础命令

0、起步 0-1) 获取命令的参数指引 netstat /? 0-2) 关于两个斜杠&#xff1a; window 文件路径中使用反斜杠&#xff1a;\ linux 文件路径中使用&#xff1a;/ 1、开关机类指令 shutdown /s # 关机shutdown /r # 重启shutdown /l …

自然语言处理 微调大模型ChatGLM-6B

自然语言处理 微调大模型ChatGLM-6B 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词&#xff0c;使用上下文将其预测出来&#xff08;相当于完形填空任务&#xff09;&#xff1b; GPT的主要任务是根据前…

ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of

文章目录 ListArrayListLinkedListArrayList与LinkedList的区别快速构建list集合Collections.singletonListArrays.asListImmutableList.of Java集合类型有三种&#xff1a;set(集)、list(列表)和map(映射)&#xff0c;而List集合是很常用的一种集合类型&#xff0c; List 我…

Shell自动化日志维护脚本

简介&#xff1a; 系统日志对于了解操作系统的运行状况、故障排除和性能分析至关重要。然而&#xff0c;长期积累的日志文件可能变得庞大&#xff0c;影响系统性能。在这篇文章中&#xff0c;我们将介绍一个自动化的解决方案&#xff0c;使用 Bash 脚本来监控和维护系统日志文件…

ZooKeeper数据模型/znode节点深入

1、Znode的数据模型 1.1 Znode是什么&#xff1f; Znode维护了一个stat结构&#xff0c;这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。版本号和时间戳一起&#xff0c;可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化&#xff0c;版本号就增加。…

【微服务】服务发现和管理技术框架选型调研

选型背景 方案对比 结论 结合实际业务和开发需要&#xff0c;着重考虑性能可靠性、功能和社区支持程度三方面&#xff0c;认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下&#xff1a; 性能更好&#xff0c;可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…

【Hadoop】DataNode 详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Keil 编译 Debug

# 头文件无法导入进来 # 导入头文件&#xff0c;只有函数声明&#xff0c;但缺少函数实现 已经导入了air32f10x_gpio.h但是没有导入 .c&#xff0c;就导致 编译出错出现undefined symbol (某个函数)&#xff0c;这时候按照下面的操作&#xff0c;导入外设模块就好。

HarmonyOS开发:探索动态共享包的依赖与使用

前言 所谓共享包&#xff0c;和Android中的Library本质是一样的&#xff0c;目的是为了实现代码和资源的共享&#xff0c;在HarmonyOS中&#xff0c;给开发者提供了两种共享包&#xff0c;HAR&#xff08;Harmony Archive&#xff09;静态共享包&#xff0c;和HSP&#xff08;H…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

MySQL中日期、时间直接相减的坑

前言 在牛客网上写一道 SQL 题时&#xff0c;需要计算两个日期之间相隔的秒数&#xff0c;我在写的时候直接将两个日期进行相减&#xff0c;得出来的值却不是相差的秒数。 情景再现 我在 MySQL 中进行了测试&#xff0c;得出的结论是&#xff1a;如果日期类型直接相减&#…

“亚马逊云科技创业加速器”首期聚焦AI,促进入营企业业务发展

生成式AI技术飞速发展&#xff0c;颠覆着人们的生活&#xff0c;正在掀起新一轮的科技革命。在生成式AI的浪潮中&#xff0c;亚马逊云科技旨在为中国的优秀初创企业提供全方位支持&#xff0c;助其抢占先机。 在6月底举办的亚马逊云科技中国峰会上&#xff0c;亚马逊云科技联合…