docker Redis高可用配置
-
准备工作
- centos_1:192.168.168.101
- centos_2:192.168.168.102
-
分别安装redis
创建安装目录
mkdir /opt/redis/configs -p
mkdir /opt/redis/data -p
mkdir /opt/redis/logs -p
cd /opt/redis
centos_1添加redis配置文件
vim configs/redis.conf
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 "/data/redis.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
requirepass qwe123
masterauth qwe123
centos_2添加redis配置文件
vim configs/redis.conf
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 "/data/redis.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
requirepass qwe123
masterauth qwe123
slaveof 192.168.168.101 6379
分别添加docker-compose.yml
vim docker-compose.yml
version: '3.7'
services:
redis:
image: redis:6
ports:
- 6379:6379
command: redis-server /etc/redis/redis.conf
restart: always
volumes:
- ./data:/data
- ./configs/redis.conf:/etc/redis/redis.conf
networks:
- custom_net
networks:
custom_net:
external:
name: app_net
启动redis
docker-compose up -d
此时redis主从已经搭建完成,在centos_1 redis上写入数据,可在centos_2 redis上查看,centos_2 redis为从机,无法写入,接下来要做故障自动切换,当 centos_1 redis故障时,将centos_2 redis自动切换为主机。通过keepalived配置完成自动切换
-
分别添加redis脚本
在/etc/keepalived目录下新建scripts文件夹
mkdir /etc/keepalived/scripts
cd /etc/keepalived/scripts
添加redis_check.sh
vim redis_check.sh
#!/bin/bash
ALIVE=`redis-cli -h $1 -p $2 -a $3 PING`
LOGFILE="/var/log/keepalived-redis-check.log"
echo "[CHECK]" >> $LOGFILE
date >> $LOGFILE
if [ "$ALIVE" == "PONG" ]; then :
echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
exit 0
else
echo "Failed: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
exit 1
fi
添加redis_master.sh
vim redis_master.sh
#!/bin/bash
REDISCLI="redis-cli -h $1 -p $3 -a $4"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE
echo "Run MASTER cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE
sleep 10 #delay 10 s wait data async cancel sync
echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE
添加redis_backup.sh
vim redis_backup.sh
#!/bin/bash
REDISCLI="redis-cli -a $4"
LOGFILE="/var/log/keepalived-redis-state.log"
echo "[BACKUP]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >> $LOGFILE 2>&1
echo "Run SLAVEOF cmd ..." >> $LOGFILE 2>&1
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE
sleep 10 #delay 10 s wait data async cancel sync
添加redis_fault.sh
vim redis_fault.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
添加redis_stop.sh
vim redis_stop.sh
#!/bin/bash
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
给所有脚本添加执行权限
chmod +x redis_*
将脚本转换到 keepalived_unconfined_script_t 域
chcon -t keepalived_unconfined_script_exec_t redis_check.sh
chcon -t keepalived_unconfined_script_exec_t redis_master.sh
chcon -t keepalived_unconfined_script_exec_t redis_backup.sh
chcon -t keepalived_unconfined_script_exec_t redis_fault.sh
chcon -t keepalived_unconfined_script_exec_t redis_stop.sh
-
centos_1配置keepalived
安装redis-cli
yum install epel-release
yum install -y redis
systemctl stop redis
systemctl disable redis
#测试链接
redis-cli -h 127.0.0.1 -p 6379 -a qwe123
修改keepalived配置文件
cd /etc/keepalived
vim keepalived.conf
global_defs {
router_id NodeA
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 6379 qwe123"
interval 2
timeout 2
fall 3
}
vrrp_instance VI_1 {
state MASTER #设置为主服务器
interface eth0 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 150 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
nopreempt #nopreempt:设置不抢占
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.168.100/24 #VRRP HA虚拟地址
}
track_script {
chk_redis
}
notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.168.102 6379 qwe123" ## 10.0.32.73应修改为实际的slave IP地址
notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.168.102 6379 qwe123" ## 10.0.32.73应修改为实际的slave IP地址
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
重启keepalived
systemctl restart keepalived
-
centos_2配置keepalived
安装redis-cli
yum install epel-release
yum install -y redis
systemctl stop redis
systemctl disable redis
#测试链接
redis-cli -h 127.0.0.1 -p 6379 -a qwe123
修改keepalived配置文件
cd /etc/keepalived
vim keepalived.conf
global_defs {
router_id NodeA
}
vrrp_script chk_redis {
script "/etc/keepalived/scripts/redis_check.sh 127.0.0.1 6379 qwe123"
interval 2
timeout 2
fall 3
}
vrrp_instance VI_1 {
state BACKUP #设置为主服务器
interface eth0 #监测网络接口
virtual_router_id 51 #主、备必须一样
priority 100 #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
advert_int 1 #VRRP Multicast广播周期秒数
authentication {
auth_type PASS #VRRP认证方式,主备必须一致
auth_pass 1111 #(密码)
}
virtual_ipaddress {
192.168.168.100/24 #VRRP HA虚拟地址
}
track_script {
chk_redis
}
notify_master "/etc/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.168.101 6379 qwe123" ## 10.0.32.73应修改为实际的slave IP地址
notify_backup "/etc/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.168.101 6379 qwe123" ## 10.0.32.73应修改为实际的slave IP地址
notify_fault /etc/keepalived/scripts/redis_fault.sh
notify_stop /etc/keepalived/scripts/redis_stop.sh
}
重启keepalived
systemctl restart keepalived