keepalived双进程双VIP配置及原理图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38637595/article/details/89817734

目标

  • 现在只有两台服务器,都运行着nginx和mysql
  • 当两台服务器都正常的时候
    • 用户访问nginx默认访问服务器A,如果A的nginx异常则访问B的nginx
    • 用户访问mysql默认访问服务器B,如果B的Mysql异常则访问A的Mysql
  • 意思就是对这两台的服务器做两个VIP,实现两个进程的高可用

配置

  • 如果大家对单个进程的高可用检测原理能够理解
  • 那么对双进程也是很好理解的
  • 可以理解为在同一个配置文件里配置两个单进程的高可用检测

配置效果图

  • 关于配置的几点说明(在配置文件中都有)
    • 配置了两个虚拟路由组VI_NGINXVI_MYSQL
    • 两个虚拟路由的vrid要不一样(这里一个配了51,一个配了52)
    • 服务器A的nginx初始权重为100,B为90
    • 服务器A的mysql初始权重为90,B为100
    • vip_nginx为192.168.1.200
    • vip_mysql为192.168.1.201
    • nginx和mysql的检测进程检测到异常时,会使得本机的权重下降20
VI_NGINX
VI_MYSQL
chk_mysql检测正常
chk_nginx检测正常
vip_nginx
服务器A的nginx 主 权重100
服务器B的nginx 备 权重90
vip_mysql
服务器B的mysql 主 权重100
服务器A的mysql 备 权重90
用户

服务器A

vrrp_script chk_nginx_process {
    script "/opt/context/keepalive_check/checkNginx.sh"
    interval 2            
    weight -20 
}

vrrp_instance VI_NGINX {
    state MASTER
    interface bond0
    virtual_router_id 51
    priority 100
    mcast_src_ip 192.168.1.100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5678
    }
    virtual_ipaddress {
        192.168.1.200
    }

    track_script {
        chk_nginx_process
    }
}

vrrp_instance VI_MYSQL {
    state BACKUP
    interface bond0
    virtual_router_id 52
    priority 90
    mcast_src_ip 192.168.1.100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 15678
    }
    virtual_ipaddress {
        192.168.1.101
    }
}

服务器B

vrrp_script chk_mysql {
    script "/opt/context/keepalive_check/checkMysql.sh"
    interval 2
    weight -20
}

vrrp_instance VI_NGINX {
    state BACKUP
    interface bond0
    virtual_router_id 51
    priority 90
    mcast_src_ip 192.168.1.101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5678
    }
    virtual_ipaddress {
        192.168.1.200
    }
}

vrrp_instance VI_MYSQL {
    state MASTER
    interface bond0
    virtual_router_id 52
    priority 100
    mcast_src_ip 192.168.1.101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 15678
    }
    virtual_ipaddress {
        192.168.1.201
    }

    track_script {
        chk_mysql
    }
}

检测脚本

  • nginx
#!bin/bash

NginxProNum=`ps -C nginx --no-header | wc -l`
if [ $NginxProNum -eq 0 ];then
        #systemctl stop keepalived
        exit 1
fi
exit 0
  • mysql
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=rep
MYSQL_PASSWORD=pukkasoft
CHECK_TIME=3
  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
  
MYSQL_OK=1
  
function check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
    if [ $? = 0 ] ;then
    MYSQL_OK=1
    else
    MYSQL_OK=0
    fi
    return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
    let "CHECK_TIME -= 1"
    check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
    CHECK_TIME=0
    exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]
then
    pkill keepalived
    exit 1
fi
sleep 1
done

猜你喜欢

转载自blog.csdn.net/weixin_38637595/article/details/89817734