Nginx + keepalived实现双机热备高可用的负载均衡解决方案

2015-07-15 14:11:00
admin
原创 2950
摘要:Nginx + keepalived实现双机热备高可用的负载均衡解决方案

Nginx + keepalived实现双机热备高可用的负载均衡解决方案

此架构需考虑的问题

1) Master没挂,则Master占有vip且NginX运行在Master上
2) Master挂了,则Backup抢占vip且在backup上运行NginX服务
3) 如果Master服务器上的NginX服务挂了,则vip资源转移到backup服务器上
4) 检测后端服务器的健康状态
Master和Backup两边都开启 NginX服务,无论Master还是Backup,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上,
如果要想使NginX服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。
首先必须明确后端服务器的健康状态检测keepalived在这种架构上是无法检测的,后端服务器的健康状态检测是有NginX来判断的,但是NginX的检测机制有一定的缺陷,后端服务器某一个宕机之后,NginX还是会分发请求给它,在一定的时间内后端服务响应不了,NginX则会发给另外一个服务器,然后当客户的请求来了,NginX会一段时间内不会把请求分发给已经宕机的服务器,但是过一段时间后,NginX还是会把分发请求发给宕机的服务器上


注:以下内容中所涉及的IP和端口号和配置文件路径只是举例使用,并非真实存在

一、规划和准备

接入服务器
IP地址(虚拟IP)
需要安装软件
Master主
192.9.117.160  (VIP:192.9.117.162)
keepalived+NginX+Tomcat
Backup备
192.9.117.161    (VIP:192.9.117.162) 
keepalived+NginX +T o m c a t
应用
根据需要是否增加服务器
根据需要





两台接入服 务器公用一个虚拟IP(VIP):192.9.117.162

二、软件安装
两台接入服务器分别安装NginX和keepalived,安装方法略
三、配置
3.1 配置NginX
NginX实现后端服务的负载均衡,由于两边的配置文件必须保持一致,所以在Master配置完后直接copy到Backup上

[root@jie1 ~]# cd /etc/NginX/
  [root@jie1 NginX]# grep -v "#" NginX.conf | grep -v "^$"
  worker_processes  1;
  events {
      worker_connections  1024;
  }
  http {
      include       mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      upstream webapp {  #定义负载均衡的模块
          server tomcat服务IP:端口号 max_fails=3 fail_timeout=2s;
          server tomcat服务IP:端口号 max_fails=3 fail_timeout=2s;
       }
      server {
          listen       80;
          server_name  localhost;
          location / {
              root   html;
              index  index.html index.htm;
          }
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   html;
          }
          location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
              root        /var/www/html;  #此处定义后端服务器网页存放路径
              proxy_pass   http://webapp;
          }
      }
  }
  [root@jie1 NginX]# scp NginX.conf 192.9.117.161:/etc/NginX
3.2 配置keepalived



[root@jie1 ~]# cd /etc/keepalived/
  [root@jie1 keepalived]# vim keepalived.conf
  global_defs {
     notification_email {
       root@localhost
     }
     notification_email_from admin@localhost
     smtp_server 127.0.0.1
     smtp_connect_timeout 30
     router_id LTT
  }
#检测NginX服务是否在运行有很多方式,比如进程,用脚本检测等等



vrrp_script chk_NginX {  
     script "killall -0 NginX"  #用shell命令检查NginX服务是否存在
     interval 1  #时间间隔为1秒检测一次
     weight -2   #当NginX的服务不存在了,就把当前的权重-2
     fall 2      #测试失败的次数
     rise 1      #测试成功的次数
  }
  vrrp_instance IN_1 {
      state MASTER
      interface eth0
      virtual_router_id 22
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass aaaa
      }
      virtual_ipaddress {
  		192.9.117.162 #虚拟服务IP地址,两台负载均衡服务器这里配置一样
      }
     	track_script {
  		chk_NginX   #引用上面的vrrp_script定义的脚本名称
    	   	}
  }
  [root@jie1 keepalived]#scp keepalived.conf 192.9.117.161:/etc/keepalived 
#把配置文件copy到Backup服务器上,copy之前要保证Backup服务器上面已经安装了keepalived


3.3 让keepalived监控NginX的状态

#!/bin/sh
  # check nginx server status
  NGINX=/usr/local/nginx/sbin/nginx
  PORT=80
  nmap localhost -p $PORT | grep "$PORT/tcp open"
  #echo $?
  if [ $? -ne 0 ];then
      $NGINX -s stop
      $NGINX
      sleep 3
      nmap localhost -p $PORT | grep "$PORT/tcp open"
      [ $? -ne 0 ] && /etc/init.d/keepalived stop
  fi
不要忘了设置脚本的执行权限,否则不起作用。
假设上述脚本放在/opt/chk_nginx.sh,则keepalived.conf中增加如下配置
vrrp_script chk_http_port {
      script "/opt/chk_nginx.sh"
      interval 2
      weight 2
  }
  track_script {
      chk_http_port
  }
更进一步,为了避免启动keepalived之前没有启动nginx , 可以在/etc/init.d/keepalived的start中首先启动nginx:



start() {
      /usr/local/nginx/sbin/nginx
      sleep 3
      echo -n $"Starting $prog: "
      daemon keepalived ${KEEPALIVED_OPTIONS}
      RETVAL=$?
      echo
      [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
  }