一、实验前准备

时间同步、关闭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/bashcounter=$(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    fifi

三、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 scriptvip=192.168.1.205contact='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