一、环境说明
准备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启动后他也只能为从了,直到新主挂掉为止