docker redis主从+哨兵模式+ip漂移

本文详细介绍了如何在3台服务器上部署Docker环境,配置master和slave节点,使用sentinel实现Redis的高可用,并通过脚本管理VIP以应对主节点切换。通过实例演示了配置过程和故障转移验证。

一、环境说明

准备3台服务器:

192.168.6.95 master

192.168.6.96 slave

192.168.6.98 slave

分别安装docker服务

二、master 配置说明

1、192.168.6.95 在root下创建文件夹redis文件夹,放入下列文件

redis.conf redis配置文件
sentinel.conf 哨兵配置文件
setip.sh 哨兵漂移ip所用脚本
sh 哨兵首次需执行安装文件的脚本

redis.conf

#redis 密码
requirepass "test123456"
#请求新master需要的密码,你不设你不是master你就连不上别人了
masterauth "test123456"

sentinel.conf

port 26379

sentinel monitor manager 192.168.6.95 6379 1
#表示主节点失败至少需要1个sentinel节点同意,mymaster是主节点的别名 不是主机名

sentinel auth-pass manager test123456
#主redis认证密码

sentinel down-after-milliseconds manager 3000
#多少毫秒请求一次 超时认定不可达

sentinel parallel-syncs manager 2
#当sentinel节点集合对主节点故障判定达成一致时,sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs就是用来限制在一次故障转移之后,允许同时多少个从服务器一起复制

sentinel client-reconfig-script manager /data/setip.sh
#ip漂移

setip.sh

需要配置docker的宿主机的ip,宿主机密码,宿主机需要添加的vip子网掩码,和设置网卡接口,作为设置宿主机虚拟ip所用。

#!/bin/bash
MASTER_IP=$6  #第六个参数是新主redis的ip地址
LOCAL_IP='192.168.6.95' #本机ip 
password='test123456'
VIP='192.168.6.100'
NETMASK='24'
INTERFACE='ens33'
date >/data/1
echo ${MASTER_IP} = ${LOCAL_IP} >> /data/1
if [ ${MASTER_IP} = ${LOCAL_IP} ];then  #master的ip等于本机的话 本机设置vip,否则清除vip 
    sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip ${VIP}/${NETMASK} >> /data/1 2>&1
    echo sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip ${VIP}/${NETMASK} >> /data/1 2>&1
    exit 0
else 
    sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip down >> /data/1 2>&1 
    echo sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip down >> /data/1 2>&1 
   exit 0
fi
exit 1

sh

{ \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free"; \
} > /etc/apt/sources.list
apt-get update
apt-get install openssh-client sshpass -y
2、执行以下命令创建docker,因为试验了太多次了,这边就一直删了建删了建的,直接运行以下就行了
rm -rf /opt/redis-master
cp -R /root/redis/ /opt/redis-master

docker rm -f redis-master;docker run --name redis-master -p 6379:6379 -v /opt/redis-master/:/data/ --restart=always -d redis redis-server /data/redis.conf


docker rm -f redis-sentinel;docker run --name redis-sentinel -p 26379:26379 -v /opt/redis-master/:/data/ --restart=always -d redis redis-server /data/sentinel.conf --sentinel

docker exec -it redis-sentinel sh /data/sh

为什么一定要复制配置文件再去挂载? 因为redis会改你配置文件,你总想留一份原本的配置文件吧

三、slave 配置说明

1、 直接上配置 没什么区别,这边需要设置master的地址和认证信息

redis.conf

requirepass "test123456"
masterauth "test123456"
replicaof 192.168.6.95 6379

sentinel.conf

port 26379

sentinel monitor manager 192.168.6.95 6379 1
#表示主节点失败至少需要1个sentinel节点同意,mymaster是主节点的别名 不是主机名

sentinel auth-pass manager test123456
#主redis认证密码

sentinel down-after-milliseconds manager 3000
#多少毫秒请求一次 超时认定不可达

sentinel parallel-syncs manager 2
#当sentinel节点集合对主节点故障判定达成一致时,sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,parallel-syncs就是用来限制在一次故障转移之后,允许同时多少个从服务器一起复制

sentinel client-reconfig-script manager /data/setip.sh
#ip漂移

setip.sh
记得改 记得改 记得改,当前宿主机的ip

#!/bin/bash
MASTER_IP=$6  #第六个参数是新主redis的ip地址
LOCAL_IP='192.168.6.96' #本机ip 
password='test123456'
VIP='192.168.6.100'
NETMASK='24'
INTERFACE='ens33'
date >/data/1
echo ${MASTER_IP} = ${LOCAL_IP} >> /data/1
if [ ${MASTER_IP} = ${LOCAL_IP} ];then  #master的ip等于本机的话 本机设置vip,否则清除vip 
    sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip ${VIP} >> /data/1 2>&1
    echo sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip ${VIP} >> /data/1 2>&1
    exit 0
else 
    sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip down >> /data/1 2>&1 
    echo sshpass -p ${password} ssh -o StrictHostKeyChecking=no root@${LOCAL_IP} ifconfig ${INTERFACE}:vip down >> /data/1 2>&1 
   exit 0
fi
exit 1

sh

{ \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free"; \
echo "deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free"; \
} > /etc/apt/sources.list
apt-get update
apt-get install openssh-client sshpass -y
rm -rf /opt/redis-master
cp -R /root/redis/ /opt/redis-master

docker rm -f redis-master;docker run --name redis-master -p 6379:6379 -v /opt/redis-master/:/data/ --restart=always -d redis redis-server /data/redis.conf


docker rm -f redis-sentinel;docker run --name redis-sentinel -p 26379:26379 -v /opt/redis-master/:/data/ --restart=always -d redis redis-server /data/sentinel.conf --sentinel

docker exec -it redis-sentinel sh /data/sh
2、 第三台按上文一样配置。

四、验证说明

1、在第一台执行

docker exec -it redis-master redis-cli -a test123456 info

发现自己是master,剩下两台slave都加入到master里了,redis的主从 的 从服务器是不能写的,只能主写从读,所以vip的作用是让这个ip固定在redis master那台
在这里插入图片描述
因为设置vip需要容器跑脚本,而脚本只会在转移master时触发,容器前面命令没装完他跑不了脚本,需要手动设置一下vip ifconfig ens33:vip 192.168.6.100
在这里插入图片描述

虚拟机做实验可能存在无ARP信息,电脑无法ping通虚拟ip,用那台虚拟机ping一下本机即可
在这里插入图片描述

查看哨兵的状态

docker exec -it redis-sentinel redis-cli -p 26379 info

在这里插入图片描述

2. 模拟故障,关闭master的redis

发现vip已经被脚本下掉了
在这里插入图片描述

第二台执行 docker exec -it redis-master redis-cli -a test123456 info

发现他也是slave,master变成第三台了,状态是up的

在这里插入图片描述
第三台ifconfig找到vip
在这里插入图片描述

原来的master 当原来master启动后他也只能为从了,直到新主挂掉为止
在这里插入图片描述

使用docker-compose安装Redis主从哨兵可按以下步骤进行: ### 安装前准备 创建一个目录用于存放相关文件,如 `[root@localhost ]#mkdir -p /usr/local/docker-compose-redis-sentinel`,并将准备文件全部上传到该目录。同时,要准备好Redis的主配置文件(redis.conf)、从配置文件(redis.conf)以及哨兵的配置文件(redis-sentinel.conf)[^1]。 ### 配置docker-compose.yml文件 在三台服务器分别配置docker-compose,以下是一个示例配置: ```yaml version: '3' services: redis: image: redis:6.2.14 container_name: redis-master ports: - 6379:6379 volumes: - ./redis/conf/redis-master.conf:/usr/local/etc/redis/redis.conf - ./redis/data:/usr/local/etc/redis/data restart: always privileged: true command: redis-server /usr/local/etc/redis/redis.conf networks: - my-network sentinel: image: redis:6.2.14 container_name: redis-sentinel command: redis-sentinel /usr/local/etc/redis/sentinel.conf ports: - "26379:26379" volumes: - ./redis/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf restart: always networks: - my-network networks: my-network: name: my-network driver: bridge ``` 此配置文件指定了Redis主节点哨兵节点的镜像、容器名称、端口映射、挂载卷、重启策略等信息。其中,`redis` 服务为Redis主节点,`sentinel` 服务为哨兵节点,它们共享同一个网络 `my-network` [^3]。 ### 启动服务 在每台机器上进入项目目录(如 `/opt/redis-sentinel` )并运行以下命令启动服务: ```bash cd /opt/redis-sentinel docker-compose up -d ``` 需要确保 `docker-compose.yml` 文件存在,否则直接运行 `docker-compose up` 会报错 [^2]。 ### 验证安装 可以使用以下命令验证Redis主从哨兵是否安装成功: ```bash docker exec -it redis-master redis-cli -h 127.0.0.1 -p 6379 -a pass ``` 进入Redis客户端后,执行 `PING` 命令,如果返回 `PONG`,则表示连接成功。还可以进行数据读写操作,如 `set LTingZxTest04 ZHANGSANLISIWANGWU` 和 `get LTingZxTest04` 来验证数据的读写功能 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值