Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换
原文链接:http://unun.in/linux/156.html
方案:
采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 Nginx正常对外提供服务,即主Nginx服务进程死掉之后,keepalived能够通过脚本或者程序检测机制,将网站的访问切换到从Nginx上 来。后端的web应用服务器的监控由Nginx负责,keepalived只监控Nginx的健康状况。
性能:大约是硬件负载均衡器的10%
优势:虽然性能远弱于LVS+Keepalived方案,但Nginx本身就是web服务器,可处理静态文件,页面缓存,rewrite等WEB容器功能,在web前端的负载均衡应用优先选用此方案。
应用情景:作为web应用服务器集群前端的负载均衡器。
环境:
操作系统:centos6.5
Keepalived版本: keepalived-1.2.13.tar.gz
nginx版本:nginx-1.6.2.tar.gz
主机IP
Node0:192.168.99.138
Node1:192.168.99.155
虚拟IP: 192.168.99.168
后端WEB服务器IP:
ng2:192.168.99.152
ng3:192.168.99.135
----------------------------------------------------
这里我们选用的是lnmp环境,LNMP环境的可以自己编译安装,这里也有一个简单的配置教程:centos + nginx + php-fpm +mysql的简单配置,生产环境中最好自己编译安装。
----------------------------------------------------
keepalived安装配置步骤:
1.1 下载keepalived,官网下载地址:http://www.keepalived.org/download.html
cd /usr/local/src/ wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
不得不说的是keepalived的下载速度慢成翔,最终也是没有wget下载下来,我传到oschina上了
下载地址:http://git.oschina.net/xiaoshusheng/Slow-download-speed/tree/master/keepalived
1.2 解压、并编译安装keepalived
tar -zxvf keepalived-1.2.13.tar.gz cd keepalived-1.2.13 ./configure --prefix=/usr/local/keepalived make && make install
2.1 设置环境变量和init.d,配置conf文件
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived vi /etc/keepalived/keepalived.conf
Node1 这部分按照以下修改,其它的默认就行
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.99.168 } }
Node0 这部分按照以下修改,其它的默认就行
vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.99.168 } }
这里是让node1当的主,node0做的从,其他的部分,可以酌情根据自己的实际情况来做出相应的修改!
其实除了global_defs{}和vrrp_instance VI_1{}两个括着的留下来,其它的配置部分可以删掉
启动keepalived
/etc/init.d/keepalived start
使用ip addr 查看虚拟ip是否已绑定,
Node1的结果:
Node0的结果:
可以看到Node1在接管着虚拟ip(VIP)。
----------------------------------------------------
2.1 nginx的安装,请参见:centos + nginx + php-fpm +mysql的简单配置的nginx配置部分,或者:本帖的部分内容:http://unun.in/linux/153.html
----------------------------------------------------
3.1 nginx的反向代理和负载均衡请参考:使用nginx做反向代理及负载均衡
----------------------------------------------------
让keepalived监视nginx状态
4.1 安装nmap
yum install -y nmap
这里直接yum安装了,如果你编译安装也可以,这里不做过多说明了
4.2 编写shell脚本,检查端口是否open,如果不是,重启一下,仍然不是,那就废掉
vi /opt/chk_nginx.sh
加入如下内容:
#!/bin/bash # 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
编写完脚本,别忘了给予它可执行的权限,否则无效
cd /opt/ chmod +x chk_nginx.sh
----------------------------------------2015.08.03更-------------------------------
再次修改keepalived.conf
vi /etc/keepalived/keepalived.conf
在配置里面增加这两部分内容
vrrp_script chk_http_port { script "/opt/chk_nginx.sh" interval 2 weight 2 }
然后在vrrp_instance VI_1中增加如下配置
track_script { chk_http_port }
配置的最终结构样子该是这样的,注意前面说的主从配置的区别,这里是个主的最终配置:
global_defs { router_id LVS_DEVEL } vrrp_script chk_http_port { script "/opt/chk_nginx.sh" interval 2 weight 2 } 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.99.168 } track_script { chk_http_port } }
更进一步,为了避免启动keepalived之前没有启动nginx , 可以在/etc/init.d/keepalived的start中首先启动nginx:
vi /etc/init.d/keepalived
将start()部分修改为如下样子
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 }
------------------------------------------------------------------------------
检测是否成功
关闭nginx,重启keepalived,查看虚拟IP是否被接管
/etc/init.d/keepalived restart
在Node1(主)上使用
ip addr
可以看到,虚拟IP已被Node1(主)接管
然后用虚拟ip:192.168.99.168访问,访问正常
使用netstat -ltunp命令查看是否nginx存在:结果存在
然后干掉主服务的nginx进程
再使用netstat -ltunp命令查看nginx是否重启:结果已经重启
然后再干掉主服务的nginx进程
再使用netstat -ltunp命令查看nginx是否重启:结果已经重启
使用service keepalived status查看keepalived状态:结果显示:keepalived (pid 2439) is running...
修改Node1上的nginx配置,故意制造错误,然后杀掉nginx进程
使用netstat -ltunp命令查看nginx状态:已经起不来了
然后使用service keepalived status查看keepalived状态:结果显示:keepalived is stopped
然后访问虚拟ip:192.168.99.168,依然能够正常访问
在Node0(从)上使用ip addr查看,发现虚拟IP已被Node0(从)接管
使用netstat -ltunp命令查看是否nginx存在:结果存在
然后干掉主服务的nginx进程
再使用netstat -ltunp命令查看nginx是否重启:结果已经重启
在切换到Node1(主)上,将nginx的配置修改正确,然后启动keepalived
/etc/init.d/keepalived start
在使用ip addr命令查看,发现虚拟IP已被Node1(主)重新接管
使用netstat -ltunp命令查看nginx状态:已被启动
通过上面测试可以发现,可用性大大提高,克服了负载均衡器的单点问题,但是从负载均衡器很多时间处于闲置状态,还是有一定的浪费的!