keepalived + docker redis高可用配置

549 阅读3分钟

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