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

327d2a0b40632fce578b764d6c3c32ac.png

此架构需考虑的问题

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

应用

根据需要是否增加服务器

根据需要

5788d42c1b141e3e0beca70debb81741.png

两台接入服务器公用一个虚拟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

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值