1、准备2台服务器
- 服务器名LB1,假设IP为192.168.1.100
- 服务器名LB2,假设IP为192.168.1.101
2、在LB1,LB2上分别安装Nginx
步骤参照:http://blog.csdn.net/yabingshi_tech/article/details/47416787
两台机器的Nginx均修改proxy_pass,指向web服务器。
3、在LB1,LB2上分别安装Keepalive
1.新建检查Nginx脚本
chmod +x /root/check_nginx.sh
vi /root/check_nginx.sh if [ "$(ps -ef | grep "nginx:master process"| grep -v grep )" == "" ] then /etc/init.d/keepalived stop else echo "nginx is running" fi
加入到作业计划
crontab -e */1 * * * * /root/check_nginx.sh >>/root/check_nginx.log
2.修改两台keepalived服务器配置文件
vi /etc/keepalived/keepalived.conf
#ConfigurationFile for keepalived global_defs { notification_email { ######定义接受邮件的邮箱 [email protected] } notification_email_from [email protected] ######定义发送邮件的邮箱 smtp_server mail.tuge.com smtp_connect_timeout 10 } vrrp_script check_nginx { ######定义监控nginx的脚本 script "/root/check_nginx.sh" interval 2 ######监控时间间隔 weight 2 ######负载参数 } vrrp_instance vrrptest { ######定义vrrptest实例 state BACKUP ######服务器状态 interface eth0 ######使用的接口 virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换 priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER advert_int 1 ######服务器之间的存活检查时间 authentication { auth_type PASS ######认证类型 auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致 } track_script {######执行监控nginx进程的脚本 check_nginx } virtual_ipaddress {######虚拟IP地址 10.192.203.106 } }
3.vi /etc/sysconfig/iptables
#注意,在两台机器上都要修改。添加:
-A INPUT -d 10.192.203.106/32 -j ACCEPT
-A INPUT -d 224.0.0.18 -j ACCEPT
#第二行意思是添加VRRP通讯支持
修改完后,重启防火墙
service iptables restart
4.启动keepalived
在两台服务器上分别启动:
service keepalived start
“脑裂”现象
由于Keepalive某些节点的失效,部分节点的网络连接会断开,并形成一个与原集群一样名字的集群,这种情况称为集群脑裂(split-brain)现象。这个非常危险,因为两个新形成的集群会同时索引和修改集群的数据。
如何避免脑裂
- 可以采用第三方仲裁的方法。由于keepalived体系中主备两台机器所处的状态与对方有关。如果主备机器之间的通信出了网题,就会发生脑裂,此时keepalived体系中会出现双主的情况,产生资源竞争。
- 一般可以引入仲裁来解决这个问题,即每个节点必须判断自身的状态。最简单的一种操作方法是,在主备的keepalived的配置文件中增加check配置,服务器周期性地ping一下网关,如果ping不通则认为自身有问题 。
- 最容易的是借助keepalived提供的vrrp_script及track_script实现。如下所示。
global_defs { router_id LVS_DEVEL } track_script { check_local } vrrp_script check_local { script "/root/check_gateway.sh" interval 5 } vrrp_sync_group VG_1 { group { VI_1 } notify_master /root/slave2master.py notify_backup /root/master2slave.py } vrrp_instance VI_1 { vrrp_unicast_bind 192.168.150.21 vrrp_unicast_peer 192.168.150.20 state BACKUP interface manbr virtual_router_id 51 nopreempt priority 100 advert_int 10 authentication { auth_type PASS auth_pass XXXX } virtual_ipaddress { 192.168.150.23 dev manbr } }
check_gateway.sh 就是我们的仲裁逻辑,发现ping不通网关,则关闭keepalived service keepalived stop。
该方法在服务器通信正常之后无法再将keepalived启动起来。