您的位置:首页 > 运维架构 > Nginx

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

2017-10-15 21:38 791 查看
一、实验前准备



时间同步、关闭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/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
#!/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息