> Linux集群 > 服务器集群 >

keepalived+nginx双网卡服务器双机热备

平时在网上看到的大部分都是用keepalived对服务器的一个ip做热切换,在虚拟机做的测试也是如此,不过在去新浪面试云平台系统工程师的过程中,面试官针对实际应用问了我一个问题,问题是用keepalived如何做对双网卡服务器网卡检测与web服务检测,为没遇到过这种情况不知道该如何回答,后来在网上搜索资料,看了keepalived权威指南,有这么一段 

 

如果不使用 VRRP Sync Groups 如果keepalived 主机有两个网段,每个网段开启一个VRRP 实例,如果对外的网段出现问题,VRRPD认为自己仍然认为健康,因此 MasterBackup 相互切换,从而导致服务不能正常使用,同时高可用集群也不能正常运行,Sync group 就是为了解决该问题,可以把两个实例放进同一个Sync Group

 

在vmware虚拟机中安装了两个centos5.5系统进行测试了一下,先安装keepalived ,具体安装过程可以参考

 

master主机配置如下

  1. global_defs {        ####全局定义  
  2.    notification_email {        #####指定keepalived在发生事件时(比如切换),需要发送的email对象,可以多个,每行一个  
  3.     sdj@qq.com  
  4.    }  
  5.    notification_email_from sdj@qq.com  
  6.    smtp_server 127.0.0.1          #####指定发送email的smtp服务器  
  7.    smtp_connect_timeout 30  
  8.    router_id LVS_DEVEL          #######运行keepalived的机器的一个标识  
  9. }  
  10. vrrp_sync_group VG1 {  
  11.   group {  
  12.     VI_1  
  13.     VI_2  
  14.    }  
  15. }  
  16. vrrp_script chk_http_port {  
  17.         #script "/opt/nginx_pid.sh"     ###监控脚本  
  18.         script "</dev/tcp/127.0.0.1/80"    ####监控本地机器80端口,可以换为其他需要监控的端口,也可以监控进程例如监控haproxy可以写为 script "killall -0 haproxy"    
  19.         interval 2      ###监控时间  
  20.         #weight -2     ###经测试keepalived 1.17版本加这个配置不能切换,最新版本1.21加上这个则可以  
  21. }  
  22. vrrp_instance VI_1 {  
  23.     state MASTER         
  24.     interface eth0   
  25. track_interface {  
  26.        eth0  
  27.        eth1  
  28.     }  
  29.     virtual_router_id 51      #VRID标记 master和backup必须一致  
  30.     mcast_src_ip 192.168.2.113 #发送多播包的地址,如果不设置默认使用绑定的网卡的primary ip  
  31.     priority 150        
  32.     advert_int 1  
  33.     authentication {  
  34.         auth_type PASS  
  35.         auth_pass 1111  
  36.     }  
  37.    track_script {  
  38.         chk_http_port           ### 就是上面vrrp_script后面的实例名称   执行监控的服务  
  39.     }  
  40.     virtual_ipaddress {  
  41.        192.168.2.116  
  42.         }  
  43. }  
  44.   
  45. vrrp_instance VI_2 {  
  46.     state MASTER         
  47.     interface eth1  
  48.     track_interface {   
  49.        eth0  
  50.        eth1  
  51.     }  
  52.     virtual_router_id 52  
  53.     mcast_src_ip 192.168.100.113  
  54.     priority 150        
  55.     advert_int 1  
  56.     authentication {  
  57.         auth_type PASS  
  58.         auth_pass 1111  
  59.     }  
  60.     track_script {  
  61.         chk_http_port           ### 就是上面vrrp_script后面的实例名称   执行监控的服务  
  62.     }  
  63.     virtual_ipaddress {  
  64.        192.168.100.117  
  65.         }  
  66. }  




backup主机的配置如下

 

  1. global_defs {  
  2.    notification_email {  
  3.     sdj@qq.com  
  4.    }  
  5.    notification_email_from sdj@qq.com  
  6.    smtp_server 127.0.0.1  
  7.    smtp_connect_timeout 30  
  8.    router_id LVS_DEVEL  
  9. }  
  10. vrrp_sync_group VG1 {  
  11.   group {  
  12.     VI_1  
  13.     VI_2  
  14.    }  
  15. }  
  16.   
  17. vrrp_script chk_http_port {  
  18.         #script "/opt/nginx_pid.sh"     ###监控脚本  
  19.         script "</dev/tcp/127.0.0.1/80"  
  20.         interval 2               ###监控时间  
  21.         weight -2                ###在keepalived 1.17中需要注释,适用于新版本  
  22. }  
  23. vrrp_instance VI_1 {  
  24.     state BACKUP         
  25.     interface eth0  
  26. track_interface {   
  27.        eth0   
  28.        eth1  
  29.     }    
  30.     virtual_router_id 51  
  31.     mcast_src_ip 192.168.100.114  
  32.     priority 100        
  33.     advert_int 1  
  34.     authentication {  
  35.         auth_type PASS  
  36.         auth_pass 1111  
  37.     }  
  38.     track_script {  
  39.         chk_http_port           ### 就是上面vrrp_script后面的实例名称   执行监控的服务  
  40.     }  
  41.     virtual_ipaddress {  
  42.        192.168.100.116  
  43.         }  
  44. }  
  45. vrrp_instance VI_2 {  
  46.     state BACKUP         
  47.     interface eth1  
  48.     track_interface {             ####设置额外的监控,里面的任何一个网卡出现问题,都会进入FAULT状态   
  49.        eth0             
  50.        eth1  
  51.     }    
  52.     virtual_router_id 52  
  53.     mcast_src_ip 192.168.2.114  
  54.     priority 100        
  55.     advert_int 1  
  56.     authentication {  
  57.         auth_type PASS  
  58.         auth_pass 1111  
  59.     }  
  60.     track_script {  
  61.         chk_http_port           ### 就是上面vrrp_script后面的实例名称   执行监控的服务  
  62.     }  
  63.     virtual_ipaddress {  
  64.        192.168.2.117  
  65.         }  
  66. }  

 

配置完keepalived文件后  测试两个主机的VIP转移

把master主机网卡或者keepalived或者是nginx进程停止  都可以瞬间切换到backup主机

启动master主机的网卡 keepalived nginx master又抢占回vip

在业务应用如果master发生故障,切换回backup,master主机online后,又切换回到master,这样频繁的切换不能容忍的,可以设置不抢占的方法

具体方法是将master主机的state也设置为BACKUP,在state BACKUP下面加入nopreempt

backup主机不需要加入,两个主机根据priority的高低进行抢占,高的为MASTER主机

 

 

二、安装nginx(master和slave安装步骤一样)

64位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。

 

 

1.Tcmalloc 优化Nginx性能
  1. # tar zxvf libunwind-0.99-alpha.tar.gz  
  2. # cd libunwind-0.99-alpha/  
  3. # CFLAGS=-fPIC ./configure  
  4. # make CFLAGS=-fPIC  
  5. # make CFLAGS=-fPIC install  

 

2、安装google-perftools:

  1. # tar zxvf google-perftools-0.97.tar.gz  
  2. # cd google-perftools-0.97/  
  3. # ./configure  
  4. # make && make install  
  5. # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  
  6. # /sbin/ldconfig  
  7. # lsof -n|grep tcmalloc  

 

在编译Nginx时添加参数--with-google_perftools_module

3.安装 pcre

 

  1. #tar zxvf pcre-7.8.tar.gz  
  2. #cd pcre-7.8  
  3. #./configure  
  4. #make && make install  

 

4、安装nginx

 

  1. # tar zxvf nginx-0.7.62.tar.gz  
  2. # cd nginx-0.7.62  
  3. # ./configure --with-http_stub_status_module --with-google_perftools_module --prefix=/usr/local/nginx  
  4. # make && make install  
  

 

启动 nginx


 
  1. # /usr/local/nginx/sbin/nginx  

 

然后我们用IE测试一下http://IP地址或域名 就可以看到nginx的默认的页面证明nginx已经启动

 

 
  1. 关闭 nginx  
  2. # kill -QUIT `cat /usr/local/nginx/logs/nignx.pid`  
  3. 重启 nginx  
  4. # kill -HUP `cat /usr/local/nginx/logs/nignx.pid`  


(责任编辑:IT)