3ewewwe 发表于 2017-10-17 09:32:20

Keepalived+Nginx实现前端负载均衡的高可用

一、实验前准备

时间同步、关闭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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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简单配置了下负载均衡如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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.logmain;

    location / {
      proxy_pass http://lb/;
      root   /usr/share/nginx/html;
      indexindex.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

1
2
3
4
5
6
7
8
9
10
#!/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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/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



页: [1]
查看完整版本: Keepalived+Nginx实现前端负载均衡的高可用