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

news2024/11/19 4:46:55

有两台服务器一台是主,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/docker

vim /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 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass 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 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass pass123
masterauth  pass123
 
slaveof 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是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
}
vrrp_instance VI_redis {
    state MASTER ##当前设备为master
    interface enp4s1  ##vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 100 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.180 ##(本地IP地址)
    unicast_peer {
                  172.24.69.181  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication {
        auth_type PASS
        auth_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是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
  }
vrrp_instance VI_redis
{
   state BACKUP #本机的状态信息
   interface enp4s1   #vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 99 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.181 ##(本地IP地址)
    unicast_peer {
                  172.24.69.180  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication
    {
        auth_type PASS
        auth_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.coloradmin.cn/o/955956.html

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

相关文章

audio 标签

<audio>标签是HTML5中用于嵌入音频内容的元素。它提供了一种简单的方式来在网页上播放音频文件。 以下是<audio>标签的基本用法&#xff1a; <audio src"路径/到/音频文件.mp3" controls></audio>在上面的示例中&#xff0c;src属性指定了…

Briefings in Bioinformatics投稿经验分享

期刊名: BRIEFINGS IN BIOINFORMATICS期刊名缩写:BRIEF BIOINFORM期刊ISSN:1467-5463E-ISSN:1477-40542023年影响因子/JCR分区:9.5/Q1latex模板:http://static.primary.prod.gcms.the-infra.com/static/site/journals/document/oup-authoring-template.zip?node=7987de4…

langchain介绍之-Prompt

LangChain 是一个基于语言模型开发应用程序的框架。它使得应用程序具备以下特点&#xff1a;1.数据感知&#xff1a;将语言模型与其他数据源连接起来。2.代理性&#xff1a;允许语言模型与其环境进行交互 LangChain 的主要价值在于&#xff1a;组件&#xff1a;用于处理语言模型…

网络编程 day 5

1、根据select TCP服务器流程图编写服务器 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.…

Mysql死锁卡死

查询 show processlist是显示用户正在运行的线程 show processlist;删除卡死的进程id kill 110651;

2023年最新项目追踪工具排行榜发布!

项目跟踪是确保项目顺利交付的重要环节&#xff0c;项目跟踪可以提高团队协作、管理项目风险、控制项目进度。不过对于项目经理而言&#xff0c;如何高效进行项目追踪工作并不是件轻松的工作。 项目跟踪工具的出现&#xff0c;减缓了项目经理的压力&#xff0c;它帮助团队监控…

适配ADRC自抗扰控制算法的MFP450-ADRC 套件焕新而来

关注 FMT 开源自驾仪的开发者可能知道&#xff0c;早在 2018 年 7 月 FMT开源自驾仪的早期版本就已经实现了 ADRC 算法。 经过几年的发展&#xff0c;FMT 在自抗扰控制算法的适配上做了进一步的优化&#xff0c;为了方便科研工作者和开发者快速上手&#xff0c;我们针对搭载 F…

静态代码检查工具PMD安装、使用

介绍 PMD官网&#xff1a;https://pmd.github.io/ 文档&#xff1a;https://docs.pmd-code.org/latest/ https://docs.pmd-code.org/latest/pmd_languages_java.html Java检查规则&#xff1a;https://docs.pmd-code.org/pmd-doc-7.0.0-rc3/pmd_rules_java.html PMD是一款可扩…

掌握这个工具,轻松管理所有物流信息

在电子商务高度发达的今天&#xff0c;物流快递行业在全球范围内发挥着至关重要的作用。然而&#xff0c;在如此复杂的物流环境中&#xff0c;快递退回件的管理和查询成为了一个难题。为了解决这个问题&#xff0c;我们有一个神奇的工具——快递批量查询高手。 快递批量查询高…

OpenGL-入门-BMP像素图glReadPixels(2)保存显示的界面

用glReadPixels保存显示的界面 #include <GL/glut.h> #include <iostream> #include <fstream> #include <vector>// Save pixel data as BMP image void saveBMP(const std::string& filename, int width, int height, const std::vector<GLu…

OA项目之左侧菜单动态选项卡

目录 1.左侧导航 参考地址&#xff1a;http://layui.org.cn/doc/element/nav.html 2.导入数据表及无限级分类 1) 数据导入&#xff08;此步骤在第一次文章已完成&#xff09; 2) 无限级分类&#xff1a;父亲找儿子的过程&#xff0c;将对应的儿子放在父亲下面&#xff0c;形…

无涯教程-Flutter - 简介

Flutter是一个由谷歌开发的开源移动应用软件开发工具包&#xff0c;用于为Android、iOS、 Windows、Mac、Linux、Google Fuchsia开发应用。 通常&#xff0c;创建移动应用程序是一个非常复杂和具有挑战性的任务。有许多框架可用&#xff0c;它提供了开发移动应用程序的出色函数…

yolov5的pytorch配置

1. conda create -n rdd38 python3.82、pip install torch1.8.0 torchvision0.9.0 torchaudio0.8.0 -f https://download.pytorch.org/whl/cu113/torch_stable.html -i https://pypi.tuna.tsinghua.edu.cn/simple 3、conda install cudatoolkit10.2

Flutter的未来与趋势,23年还学吗?

随着移动应用市场的不断扩大&#xff0c;跨平台开发框架的需求也越来越大。Flutter框架可以帮助开发者在不同平台上快速开发高质量的移动应用程序&#xff0c;这种趋势将进一步推动Flutter的发展和普及。 作为一名前端开发工程师&#xff0c;学习Flutter框架是非常有必要的。因…

NameError: name ‘_mysql‘ is not defined

报错信息 Traceback (most recent call last):File "/Users/xuruilong/Desktop/cmabc_back/.enve/lib/python3.9/site-packages/MySQLdb/__init__.py", line 18, in <module>from . import _mysql ImportError: dlopen(/Users/xuruilong/Desktop/cmabc_back/.…

报文信息转换器

HttpMessageConverter HttpMessageConverter:报文信息转换器&#xff0c;将请求报文转换为Java对象&#xff0c;或将Java对象转换为响应报文。它提供了两个注解和两个类型&#xff1a; RequestBody, ResponseBody, RequestEntity, ResponseEntity(响应用的较多) 准备 创建模块并…

HCIP学习--扩展知识点

端口镜像-SPAN 抓包软件只能抓取经过本地的网卡的流量 也就是抓取流量只能抓取本设备的流量 [r1]observe-port interface GigabitEthernet 0/0/2 定义一个SPAN的会话&#xff0c;然后定义监控接口&#xff08;也就是你要用的接口&#xff0c;你连接这个接口来对其他接口抓包…

IDEA批量处理行尾注释

前言 行尾注释写起来比较方便&#xff0c;所以很多时候我们都会习惯把注释写在行尾。 但这个是不符合编程规范的&#xff0c;写的代码注释主要是给后续接手人进行阅读帮助的。按照正常的阅读方式都是先读注释&#xff0c;然后再看代码&#xff0c;如果先看代码再看注释&#…

创建智能问答机器人:上线智能机器人客服,实时为客户提供解决方案

随着企业扩大规模和业务增长&#xff0c;客户咨询和服务请求增加。传统人工客服难以处理大量咨询&#xff0c;而智能化的AI客服可以同时满足多个客户需求。 智能问答机器人 创建智能问答机器人后&#xff0c;能自动化处理大量客户咨询&#xff0c;显著降低企业运营成本&#xf…