Redis主从高可用+自动切换主从关系

Redis主从高可用+自动切换主从关系

机器 IP
db01 192.168.0.51(主)
db02 192.168.0.52(从)

说明:基于keepalived的MASTER或BACKUP状态去实现Redis的主从关系自动切换

db01-keepalived

! Configuration File for keepalived
global_defs {
     
   router_id LVS_DEVEL
   script_user root
   enable_script_security
}
vrrp_script check_redis {
     
    script "/etc/keepalived/redis-check.sh 127.0.0.1 password"
    interval 2
    weight -20
    fall 3
    rise 1
}
vrrp_instance VI_1 {
     
    state BACKUP #必须设置为双BACKUP,否则会出现MASTER故障恢复后,抢占VIP
    interface ens33
    virtual_router_id 51
    priority 100
    nopreempt
    advert_int 1
    authentication {
     
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 192.168.0.51
    unicast_peer {
     
        192.168.0.52
    }
    virtual_ipaddress {
     
        192.168.0.55/24
    }
    track_script {
     
    }
    notify_master "/etc/keepalived/redis-master.sh 127.0.0.1 192.168.0.52 6379"
    notify_backup "/etc/keepalived/redis-backup.sh 127.0.0.1 192.168.0.52 6379"
}

db02-keepalived

! Configuration File for keepalived
global_defs {
     
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_redis {
     
    script "/etc/keepalived/redis-check.sh 127.0.0.1"
    interval 2
    weight -20
    fall 3
    rise 1
}
vrrp_instance VI_1 {
     
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
     
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 192.168.0.52
    unicast_peer {
     
        192.168.0.51
    }
    virtual_ipaddress {
     
        192.168.0.55/24
    }
    track_script {
     
        check_redis
    }
    notify_master "/etc/keepalived/redis-master.sh 127.0.0.1 192.168.0.51 6379"
    notify_backup "/etc/keepalived/redis-backup.sh 127.0.0.1 192.168.0.51 6379"
}

检测脚本

检测脚本需要赋予x权限

==========================
# db01&db02,redis-mster.sh
==========================
#!/bin/bash
# 检测redis服务是否起来,如果没起来启动服务,如果服务启动了,解除主从关系
LOG_FILE=/etc/keepalived/redis.log
RE_CLI="/opt/redis-6.2.1/src/redis-cli -h $1"
function check_redis(){
     
        # 检查redis服务是否启动
        if [ $(ps -aux|grep redis-server|grep -v grep|wc -l) -eq 0 ]; then
                echo $(date "+%Y-%m-%d %H:%M:%S:MASTER-Redis服务未启动") >> $LOG_FILE
                /opt/redis-6.2.1/src/redis-server /opt/redis-6.2.1/redis.conf &>/dev/null
                # 是否能正常启动redis服务
                if [ $? -eq 0 ]; then
                        echo $(date "+%Y-%m-%d %H:%M:%S:MASTER-Redis服务启动完毕") >> $LOG_FILE
                else
                        echo $(date "+%Y-%m-%d %H:%M:%S:MASTER-Redis服务启动异常,关闭Keepalived") >> $LOG_FILE
                        systemctl stop keepalived.service
                fi
        else
                echo $(date "+%Y-%m-%d %H:%M:%S:MASTER-Redis服务正常运行") >> $LOG_FILE
        fi
}
function erase_relation(){
     
        # 解除Redis主从关系
        $RE_CLI slaveof NO ONE &> /dev/null
        echo $(date "+%Y-%m-%d %H:%M:%S:MASTER-Redis解除主从关系完毕") >> $LOG_FILE
}
check_redis
erase_relation

====================================
# db01&db02,redis-backup.sh
=====================================
#!/bin/bash
#:检查Redis服务起来没,同步主
LOG_FILE=/etc/keepalived/redis.log
RE_CLI="/opt/redis-6.2.1/src/redis-cli -h $1"
function check_redis(){
     
        # 检查redis服务是否启动
        if [ $(ps -aux|grep redis-server|grep -v grep|wc -l) -eq 0 ]; then
                echo $(date "+%Y-%m-%d %H:%M:%S:BACKUP-Redis服务未启动") >> $LOG_FILE
                /opt/redis-6.2.1/src/redis-server /opt/redis-6.2.1/redis.conf &>/dev/null
                # 是否能正常启动redis服务
                if [ $? -eq 0 ]; then
                        echo $(date "+%Y-%m-%d %H:%M:%S:BACKUP-Redis服务启动完毕") >> $LOG_FILE
                else
                        echo $(date "+%Y-%m-%d %H:%M:%S:BACKUP-Redis服务启动异常,关闭Keepalived") >> $LOG_FILE
                        systemctl stop keepalived.service
                fi
        else
                echo $(date "+%Y-%m-%d %H:%M:%S:BACKUP-Redis服务正常运行") >> $LOG_FILE
        fi
}
function slave_redis(){
     
        # 同步主库      
        $RE_CLI slaveof NO ONE &>/dev/null
        $RE_CLI slaveof $2 $3 &>/dev/null
        echo $(date "+%Y-%m-%d %H:%M:%S:BACKUP-Redis同步$2完成") >> $LOG_FILE
}
check_redis
slave_redis $1 $2 $3 #这里必须要将参数传递给函数,否则函数里面这个变量是没有值的


===========================
# redis-check.sh
===========================
#!/bin/bash
/opt/redis-6.2.1/src/redis-cli -h $1 PING &>/dev/null
if [ $? -ne 0 ]; then
        systemctl stop keepalived
else
        exit 0
fi

# db01部分日志
2021-05-01 08:18:53:BACKUP-Redis服务未启动
2021-05-01 08:18:53:BACKUP-Redis服务启动完毕
2021-05-01 08:18:53:BACKUP-Redis同步192.168.0.52完成
2021-05-01 08:18:58:MASTER-Redis服务正常运行
2021-05-01 08:18:58:MASTER-Redis解除主从关系完毕
2021-05-01 08:19:52:BACKUP-Redis服务正常运行
2021-05-01 08:19:52:BACKUP-Redis同步192.168.0.52完成
 
# db02部分日志
2021-05-01 08:18:53:BACKUP-Redis服务未启动
2021-05-01 08:18:53:BACKUP-Redis服务启动完毕
2021-05-01 08:18:53:BACKUP-Redis同步192.168.0.51完成
2021-05-01 08:19:28:MASTER-Redis服务正常运行
2021-05-01 08:19:28:MASTER-Redis解除主从关系完毕

你可能感兴趣的:(Redis)