此架构需考虑的问题
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+Tomcat
应用
根据需要是否增加服务器
根据需要
两台接入服务器公用一个虚拟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
}