配置Keepalive实现nginx高可用

版权声明:未经本人允许严禁转载 https://blog.csdn.net/WanJiaBaoBao/article/details/83587461

搭建环境

  • 已关闭防火墙,关闭selinux;
  • 所用服务器IP地址如下:
IP地址 服务器 服务
192.168.91.129 master keepalived、nginx
192.168.91.130 backup keepalived、nginx
192.168.91.254(VIP) master、backup ----------------------

搭建步骤

配置keepalived

  • 配置192.168.91.129和192.168.91.130网络源
[root@master ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@master ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
[root@master ~]# yum -y install epel-release
[root@master ~]# yum -y install keepalived nginx
[root@master ~]# scp /etc/yum.repo/CentOS-Base.repo [email protected]:/etc/yum.repo.d/
[root@backup ~]# yum -y install epel-release
[root@backup ~]# yum -y install keepalived nginx
  • 启动192.168.91.129和192.168.91.130的nginx服务,并查看端口
[root@master ~]# systemctl start nginx
[root@master ~]# ss -ntl
State       Recv-Q Send-Q               Local Address:Port                 Peer Address:Port 
LISTEN      0      128                              *:80                              *:*      
LISTEN      0      128                             :::80                             :::*     
  • 在浏览器上进行访问

    • 192.168.91.129(master)上nginx的的测试页面
      在这里插入图片描述
    • 192.168.91.130(backup)上nginx的测试页面
      在这里插入图片描述
  • 配置192.168.91.129(master)的/etc/keepalived/keepalived.conf配置文件

[root@master ~]# cp -a  /etc/keepalived/keepalived.conf{,.bak}
[root@master ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
   router_id 001
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.91.254
    }   
}
virtual_server 192.168.91.254 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    
    real_server 192.168.91.129 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.91.130 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
EOF
  • 配置192.168.91.129(backup)的/etc/keepalived/keepalived.conf配置文件(注:route_id不同)
[root@master ~]# cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
   router_id 002
}

vrrp_instance VI_1 {
    state BACKUP				##修改初始状态为BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 90					##低于MASTER优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.91.254
    }   
}
virtual_server 192.168.91.254 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    
    real_server 192.168.91.129 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.91.130 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
EOF
  • 启动master和backup上的keepalived服务,并设置开机自动启动
[root@master ~]# systemctl start keepalived
[root@master ~]# systemctl enable keepalived
ln -s '/usr/lib/systemd/system/keepalived.service' '/etc/systemd/system/multi-user.target.wants/keepalived.service'
  • 查看虚拟IP地址在哪个服务器上
## master上的IP地址 ##
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:47:34:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.129/24 brd 192.168.91.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet 192.168.91.254/32 scope global eno16777736
       valid_lft forever preferred_lft forever

## backup上的IP地址 ##
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:39:25:f5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.130/24 brd 192.168.91.255 scope global eno16777736
       valid_lft forever preferred_lft forever

脚本监控nginx

让keepalived监控nginx负载均衡机

  • 在192.168.91.129服务器(master)创建脚本存放位置,并编写脚本
[root@master ~]# mkdir /etc/keepalived/scripts
[root@master ~]# vim /etc/keepalived/scripts/check_n.sh
#!/bin/bash
nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
if [ $nginx_status -lt 1 ];then
        systemctl stop keepalived
fi

[root@master ~]# chmod +x /etc/keepalived/scripts/check_n.sh 
[root@master ~]# ll /etc/keepalived/scripts/check_n.sh
-rwxr-xr-x. 1 root root 146 Nov  1 02:45 /etc/keepalived/scripts/check_n.sh
[root@master ~]# vim /etc/keepalived/scripts/notify.sh
#!/bin/bash
VIP=$2
function sendmail () {
        subject="${VIP}'s server keepalived state is change."
        connect="$(date +'%F %T'): $(hostname)'s state change to master"
        echo $connect | mail -s "$subject" <收件人>
}
case "$1" in
        master)
                nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
                if [ $nginx_status -lt 1 ];then
                        systemctl start nginx
                fi
                sendmail
        ;;
        backup)
                nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
                if [ $nginx_status -gt 0 ];then
                        systemctl stop nginx
                fi
                sendmail
        ;;
        *)
                echo "Usage:$0 master|backup VIP"
        ;;
esac
[root@master ~]# chmod +x /etc/keepalived/scripts/notify.sh
[root@master ~]# ll /etc/keepalived/scripts/notify.sh
-rwxr-xr-x. 1 root root 596 Nov  1 02:55 /etc/keepalived/scripts/notify.sh8
  • 在192.168.91.130服务器(backup)创建脚本存放位置,并编写脚本
[root@backup ~]# mkdir /etc/keepalived/scripts
[root@backup ~]# vim /etc/keepalived/scripts/notify.sh
#!/bin/bash
VIP=$2
function sendmail () {
        subject="${VIP}'s server keepalived state is translate."
        content="$(date +'%F %T'): $(hostname)'s state change to master."
        echo $connect | mail -s "$subjecj" [email protected]
}
case "$1" in
        master)
                nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
                if [ $nginx_status -lt 1 ];then
                        systemctl start nginx
                fi
                sendmail
        ;;
        backup)
                nginx_status=$(ps aux | grep -Ev "grep|$0" | grep '\bnginx\b' | wc -l)
                if [ $nginx_status -gt 0 ];then
                        systemctl stop nginx
                fi
                sendmail
        ;;
        *)
                echo "Usage:$0 master|backup VIP"
        ;;

[root@backup ~]# chmod +x /etc/keepalived/scripts/notify.sh
[root@backup ~]# ll /etc/keepalived/scripts/notify.sh
-rwxr-xr-x. 1 root root 604 Nov  1 04:01 /etc/keepalived/scripts/notify.sh

配置keepalived加入监控脚本的设置

  • 配置192.168.91.129(master)的/etc/keepalived/keepalived.conf配置文件
global_defs {
   router_id 002
}

vrrp_script nginx_check {
        script "/etc/keepalived/scripts/check_n.sh"			##执行监控脚本
        interval 1				##1秒钟执行一次
        weight -20
}
......
    virtual_ipaddress {
        192.168.91.254
    }
    track_script {
        nginx_check
    }
    ## 执行脚本,发送邮件报警。当状态从BACKUP改变为MASTER时发送邮件 ##
    notify_master "/etc/keepalived/scripts/notify.sh master 192.168.91.254"
    ## 执行脚本,发送邮件报警。当状态从MASTER改变为BACKUP时发送邮件 ##
    notify_backup "/etc/keepalived/scripts/notify.sh backup 192.168.91.254"
......
  • 配置192.168.91.130(backup)的/etc/keepalived/keepalived.conf配置文件
[root@backup ~]# vim /etc/keepalived/keepalived.conf
......
    virtual_ipaddress {
        192.168.91.254
    }
    notify_master "/etc/keepalived/scripts/notify.sh master 192.168.91.254"
    notify_backup "/etc/keepalived/scripts/notify.sh backup 192.168.91.254"
......
  • 当master这台服务器中nginx服务挂掉后,keepalived服务监控到后会将自己停止掉
[root@master ~]# ip a
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:47:34:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.129/24 brd 192.168.91.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet 192.168.91.254/32 scope global eno16777736
       valid_lft forever preferred_lft forever
[root@master ~]# ps aux|grep -E "keepalived|nginx"
root      60367  0.0  0.2 121148  2092 ?        Ss   12:03   0:00 nginx: master process /usr/sbin/nginx
nginx     60368  0.0  0.3 121612  3312 ?        S    12:03   0:00 nginx: worker process
nginx     60369  0.0  0.3 121612  3312 ?        S    12:03   0:00 nginx: worker process
root      60376  0.0  0.1 119144  1376 ?        Ss   12:03   0:00 /usr/sbin/keepalived -D
root      60377  0.0  0.2 119264  2588 ?        S    12:03   0:00 /usr/sbin/keepalived -D
root      60378  0.0  0.2 121240  2464 ?        S    12:03   0:00 /usr/sbin/keepalived -D
[root@master ~]# systemctl stop nginx
[root@master ~]# ps aux|grep -E "keepalived|nginx"
root      65627  0.0  0.0 112640   992 pts/1    S+   12:16   0:00 grep --color=auto -E keepalived|nginx
  • 当master服务器出现问题后,VIP会跳到BACKUP上,并发送邮件
[root@backup ~]# ip a
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:39:25:f5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.91.130/24 brd 192.168.91.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet 192.168.91.254/32 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe39:25f5/64 scope link 
       valid_lft forever preferred_lft forever

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/WanJiaBaoBao/article/details/83587461