一、实验前准备

wKiom1niKkTgaZWRAAA0ycwOOXM395.jpg

时间同步、关闭iptables+selinux、各主机能相互解析

在192.168.0.101和192.168.0.102上安装Keepalived和Nginx,通过Nginx负载均衡至192.168.0.103及192.168.0.104上,node3和node4上分别用httpd提供网页node3及node4

该实验实现的是主从模式

双机高可用方法目前分为两种:
1、双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态(使用DNS达到两个外网IP地址的轮询),同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。

二、安装及配置Keepalived及Nginx

1、配置192.168.0.101上的keepalived,192.168.0.102类似(需调整state为BACKUP,priority为90)

global_defs {
   notification_email {
   }
   notification_email_from root
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_10
}
vrrp_script chk_nginx {   //chk_nginx后面有空格,实验中没加空格不能导致检测nginx脚本失败
        script "killall -0 nginx &>/dev/null"  //检测脚本
        interval 1    //脚本执行间隔 1s
        weight -20    //如果脚本检查结果为非0,则priority -20
        fall 2        //失败需连续检测2次
        rise 1        //成功只需1次,成功不修改优先级
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
         }
    virtual_ipaddress {
        192.168.0.250/24 dev eth0 label eth0:1
    }
        track_script {    //执行监控的服务
                chk_nginx    //引用VRRP脚本
        }
}

2、配置nginx

192.168.0.101及102 nginx简单配置了下负载均衡如下

upstream lb {
        server 192.168.0.103;
        server 192.168.0.104;
        }


server {
    listen       80;
    server_name 192.168.0.250;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass http://lb/;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
3、主备配置差别主要为(建议这么配置): 
- 主机:(state MASTER;priority 100) 
- 备机:(state BACKUP;priority 99) 
- 非抢占:nopreempt 
或者: 
- 主机:(state BACKUP;priority 100) 
- 备机:(state BACKUP;priority 100) 

- 默认抢占 

4、nginx的检查脚本

最简单的做法是监控NginX进程,更靠谱的做法是检查NginX端口,最靠谱的做法是检查多个url能否获取到页面。

注意:这里要提示一下keepalived.conf中vrrp_script配置区的script一般有2种写法:
1)通过脚本执行的返回结果,改变优先级,keepalived继续发送通告消息,backup比较优先级再决定。这是直接监控Nginx进程的方式。
2)脚本里面检测到异常,直接关闭keepalived进程,backup机器接收不到advertisement会抢占IP。这是检查NginX端口的方式。

第一种方式如上述实验中的"killall -0 nginx"

Killall -0

做进程自检:
如果进程还在使用,通过echo $? 可得返回为0;
如果进程已经死了,返回为1,并伴有error信息。

通过脚本判断,有异常时exit 1,正常退出exit 0,然后keepalived根据动态调整的 vrrp_instance 优先级选举决定是否抢占VIP:
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,原本配置的优先级不变,即配置文件中priority对应的值。

第二方式检测nginx后停止keepalived

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi

三、Keepalive的通知机制

1、实例状态通知

      1) notify_master :节点变为master时执行

      2) notify_backup : 节点变为backup时执行

      3) notify_fault  : 节点变为故障时执行

2、虚拟服务器检测通知

      1) notify_up   : 虚拟服务器up时执行

      2) notify_down  : 虚拟服务器down时执行

notify_master "/etc/keepalived/notify.sh master

#!/bin/bash
# description: An example of notify script

vip=192.168.1.205
contact='root@localhost'

notify() {
    mailsubject="`hostname` to be $1: $vip floating"
    mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
    echo $mailbody | mail -s "$mailsubject" $contact
}

case "$1" in
    master)
        notify master
        /etc/rc.d/init.d/nginx start
        exit 0
    ;;
    backup)
        notify backup
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    fault)
        notify fault
        /etc/rc.d/init.d/nginx stop
        exit 0
    ;;
    *)
        echo 'Usage: `basename $0` {master|backup|fault}'
        exit 1
    ;;
esac