标题:Nginx+Keepalived高可用负载均衡双机热备


 

Nginx进程基于于Master+Slave(worker)多进程模型,自身具有非常稳定的子进程管理功能。在Master进程分配模式下,Master进程永远不进行业务处理,只是进行任务分发,从而达到Master进程的存活高可靠性,Slave(worker)进程所有的业务信号都 由主进程发出,Slave(worker)进程所有的超时任务都会被Master中止,属于非阻塞式任务模型。
 
Keepalived是Linux下面实现VRRP 备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接,作用:主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现
 
 Nginx有很强代理功能,但是一台nginx就形成了单点,现在使用keepalived来解决这个问题,keepalived的故障转移时间很短.Nginx+keepalived双机实现nginx反向代理服务的高可用,一台nginx挂掉之后不影响应用也不影响内网访问外网.
 

 

Nginx+Keepalived高可用负载均衡双机热备 _Nginx+Keepalived负载均衡

(图画的有点难看....Nginx+Keepalived高可用负载均衡双机热备 _Nginx+Keepalived负载均衡_02

一、环境:
rhel5、nginx-0.7.51、keepalived-1.1.15
master:192.168.126.173
slave:192.168.126.176
vip:192.168.200.16

 
二:安装nginx(两台安装配置都一样!)
 
  1. #添加运行nginx的用户和组www 
  2. groupadd www  
  3. useradd -g www www
  4. wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.8.tar.gz 
  5. tar zxvf pcre-7.8.tar.gz 
  6. cd pcre-7.8/ 
  7. ./configure 
  8. make && make install 
  9. wget http://sysoev.ru/nginx/nginx-0.7.51.tar.gz 
  10. tar zxvf nginx-0.7.51.tar.gz 
  11. cd nginx-0.7.51/ 
  12. ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module 
  13. make && make install

三:安装keepalived

  1. wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz 
  2. tar zxvf keepalived-1.1.15.tar.gz 
  3. cd keepalived-1.1.15 
  4. ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux(这里为什么做软链接后面说!)
  5. ./configure --prefix=/usr --exec-prefix=/usr \
    --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share \
    --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec \
    --localstatedir=/var --mandir=/usr/share/man --infodir=/usr/share/info \
    --sharedstatedir=/usr/com \
    --with-kernel-dir=/usr/src/linux(这里指定的是软链接路径!!)
  6. make
  7. make install
  8. 启动nginx!/usr/local/nginx/sbin/nginx

四:配置keepalived.conf

1,MASTER 的keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {           #发送email 的地址
   rui.tong@XXX.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_http_port {     #执行监控的服务 
    script "/tmp/dd.sh"              #监控的脚本(脚本在下文写,详情见下文)
    interval 2                            #监控的时间
    weight 2
}

vrrp_instance VI_1 {
    state MASTER                    #设置为主
    interface eth0                       #监控的网卡
    virtual_router_id 51i             #暂时不知道什么,但是这个两台服务器必须一样!!!
    mcast_src_ip 192.168.126.173           #主nginx地址
    priority 150       #优先级,优先级MASTRE一定要高于BAUCKUP(其实叫权重值)
    advert_int 1
    authentication {
        auth_type PASS               #加密
        auth_pass 1111                 #加密的密码,两台服务器一定要一样!!! 
    }
    virtual_ipaddress {
        192.168.200.16     #VIP地址,就是本对应的虚拟IP,ip addr可以查看到
    }
}

2,BACKUP keepalived.conf(这里我就不解释参数了!)

! Configuration File for keepalived

global_defs {
   notification_email {
rui.tong@XXX.com  

}
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script chk_http_port {
    script "/tmp/dd.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    mcast_src_ip 192.168.126.176   
    priority 100      # 记住keepalived是根据这里来判断MASTER还是BACKUP!
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
    }
}

/etc/init.d/keepalived start !


 为什么我编译keepalived之前要做一个内核的软链接呢?因为之前我编译的时候指定系统默认的内核文件,结果最后安装完毕之后ps -ef | grep keepalived ,显示只有两个进程,但是正常情况下应该有3个keepalived的进程才对!

查阅相关资料,是因为当前linux系统未指定内核文件,可是我系统有啊,我就做了一个软链接,ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux,重新编译一下。有3个进程在跑了!

[root@localhost tmp]# ps -ef | grep keepalived
root     17708     1  0 12:18 ?        00:00:00 keepalived -D
root     17709 17708  0 12:18 ?        00:00:00 keepalived -D
root     17710 17708  0 12:18 ?        00:00:00 keepalived -D
root     17756  2490  0 15:51 pts/2    00:00:00 grep keepalived


关键:

!为什么这里要 指定监控的脚本呢?script "/tmp/dd.sh" !! 监控的脚本非常的关键!!!

keepalived本身的不足,只有服务器当keepalived  down了的时候,BACKUP才会去接管,但是当nginx死了之后,keepalived是不知道nginx死了,所以写一个脚本让keepalived去检测nginx的存活状态然后去停掉自己的主keepalived!这样BACKUP才会去接管!

cat /tmp/dd.sh

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ]
 then
        /usr/local/nginx/sbin/nginx
        sleep 1
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ]
          then
                killall keepalived
        fi
fi


五,监控一下Nginx Mastaer 的日志

 

Nginx+Keepalived高可用负载均衡双机热备 _keepalived主备切换_03 

监控一下Nginx Backup 正常,就不贴出来了。

 


六。测试

现在停掉Nginx Mastaer上的nginx...Nginx Backup脚本检测到nginx死了,就接管了Nginx Mastaer。我们来看一看日志~ tail -f /var/log/messages

Nginx+Keepalived高可用负载均衡双机热备 _keepalived主备切换_04 

很显然可以看出backup已经变成master!!

现在再启动原来master的nginx,再查看backup的日志

 

Nginx+Keepalived高可用负载均衡双机热备 _Nginx+Keepalived负载均衡_05 

很显然可以看出backup 自动叫交出了老大的权利,重现变为backup了!