在 入坑系列之HAProxy负载均衡 中已经详细讲过了怎么将高并发的请求按均衡算法分发到几台服务器上做均衡防止单机崩溃。
但这样的话有没有发现所有请求都经过了HAproxy代理,自然当并发量越来越高时HAproxy就成了瓶颈,突发时HAproxy就会挂掉,或HAproxy服务器出现故障,这时外部唯一的请求入口没有了,怎么办?重启是个办法,但还是需要抢修时间,这期间内客户都无法访问损失的锅又得程序猿来背。
这种情况下备胎出现了, Keepalived登场,他可以解决服务宕机自动无缝切换。
Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。
keepalived 默认需要使用D类多播地址224.0.0.18 进行心跳通信
keepalived 使用vrrp协议(虚拟路由冗余协议)进行通信(协议号码为112)
Keepalived也可以与LVS、Nginx、MySQL等结合使用,形成可靠的主备机,给了你宝贵的抢修时间。
下面来讲如何一步步搭建。
环境
CentOS6.X
HAProxy 1.7.3
Keepalived 1.3.4
用root用户安装
下载
若在线安装不用下载,可直接通过yum命令安装(建议),不过需要联网。
去官网下载 :http://www.keepalived.org/software/keepalived-1.3.4.tar.gz
下载后放进CentOS中的/usr/local/ 文件夹中
安装
分两种:
1、在线装:yum install -y ipvsadm keepalived (建议)
2、安装包;
此处按照下载好的安装包操作:
[root@H32 local]#tar -zxvf keepalived-1.3.4.tar.gz [root@H32 local]#cd keepalived-1.3.4 [root@H32 keepalived-1.3.4]#./configure --prefix=/usr/ --sysconfdir=/etc/ [root@H32 keepalived-1.3.4]#make [root@H32 keepalived-1.3.4]#make install
在此之前还需要设置主备机的时间一致,可用ntpdate向时间服务器同步,具体的方法有时间再详细说明。
设置
修改keepalived.conf文件配置
[root@H32 ~]# vi /etc/keepalived/keepalived.conf
具体配置内容:
! Configuration File for keepalived global_defs { notification_email { root@localhost #接受邮件方 } notification_email_from soul@104.com #发件人 smtp_server 127.0.0.1 #邮件服务器 smtp_connect_timeout 30 #超时时长 router_id LVS_DEVEL #ID;随意即可 } vrrp_script chk_state_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" #如果在/roo/下有down文件;就失败;转移到从上;否则正常 interval 2 weight 3 } vrrp_script chk_haproxy { script "/etc/keepalived/chk_haproxy.sh" # 设置执行的脚本,可以是脚本,也可以是命令 interval 2 # script执行周期,每个interval执行一次健康检查 weight 2 # 健康检查返回0 & weight大于0,优先级增加相应权值;健康检查非0 & weight小于0,优先级减小相应值; # 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况 } vrrp_instance VI_1 { # VRRP 配置标识 VI_1是实例名称,一个文件可配置多个 state MASTER # 指定Keepalvied角色 MASTER表示此主机为主服务器 BACKUP则是表示为备用服务器 # 当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。 # 实际应用中,可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt(非抢占)解决异常恢复后再次抢占的问题。 interface eth0 # 节点固有IP(非VIP)的网卡,用来发VRRP包 virtual_router_id 111 # 虚拟路由标识(0-255),同一个VRRP实例使用唯一的标识,DB中的规范是使用节点IP的最后一位。如10.10.16.51的51 (主备相同) priority 100 # 节点优先级,数字越大表示节点的优先级越高。keepalived启动时会通过选举将优先级最高的节点选举为master。如果某个节点初始state是master,但是优先级低,该节点会变成backup advert_int 1 # 发送通告的时间间隔, # 按照vrrp的官方文档,backup会接收master的advert_int的值,然后计算出skew time和master down interval,认为master宕机触发的选举时间应该是(3 * Master_Adver_Interval) + Skew_time authentication { auth_type PASS auth_pass 1111 # 同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信 (主备相同) } virtual_ipaddress { 192.168.80.114 # 设置虚拟IP地址 (VIP),又叫做漂移IP地址 可以有多个,每个一行 (主备机必须相同,也是对外的虚拟IP) } track_script { chk_haproxy # 该实例需要执行的健康执行脚本,每个一行 chk_state_down } notify_master "/etc/keepalived/notify.sh master 192.168.80.114" notify_backup "/etc/keepalived/notify.sh backup 192.168.80.114" notify_fault "/etc/keepalived/notify.sh fault 192.168.80.114" # 状态切换为master/backup/fault时执行对应的脚本 }
说明:
因为Keepalived在转换状态时会依照状态来呼叫:
当进入Master状态时会呼叫notify_master
当进入Backup状态时会呼叫notify_backup
当发现异常情况时进入Fault状态呼叫notify_fault
当Keepalived程序终止时则呼叫notify_stop
配置中notify.sh:
[root@H32 ~]# vi /etc/keepalived/notify.sh
配置内容:
#!/bin/bash # description: An example of notify script # contact='root104@localhost' notify() { mailsubject="`hostname` to be $1: $2 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/haproxy start exit 0 ;; backup) notify backup /etc/rc.d/init.d/haproxy stop exit 0 ;; fault) notify fault /etc/rc.d/init.d/haproxy stop exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac
其中chk_haproxy.sh
[root@H32 ~]# vi /etc/keepalived/chk_haproxy.sh
添加内容:
#!/bin/bash # # author: weizhifeng # description: # 定时查看haproxy是否存在,如果不存在则启动haproxy, # 如果启动失败,则停止keepalived # status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l) if [ "${status}" = "0" ]; then /etc/init.d/haproxy start status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l) if [ "${status2}" = "0" ]; then /etc/init.d/keepalived stop fi fi
将以上三个文件全部更改后 复制一份到备机;注意根据上述高亮描述进行更改。(非常重要)
还要给chk_haproxy.sh和notify.sh执行脚本的权限。
chmod +x /etc/keepalived/notify.sh chmod +x /etc/keepalived/chk_haproxy.sh
启动
配置完后进行启动keepalived 和haproxy,主备机均要启动:
service keepalived start
其它命令:
service keepalived stop #停止 service keepalived restart #重启
service keepalived enable #开机启动
测试
down掉主机的haproxy,查看haproxy监控访问VIP:192.168.80.32:8089/stats,看haproxy的ID是否有变化,然后重启主机的haproxy,再看haproxy的ID是否有变化。
执行ip a查看VIP在两台机子上有变化
[root@H32 ~]# ip a
思考:
虚拟IP必须与master 和 备机 在同一网段,经测试若虚拟IP与他们不在同一网段访问不了VIP。
防止keepalived互抢IP的办法,这个也有网有提出过,有相应的方法。
主备机互作主备,即主机也是备机,可以做配置多个实例来实现。
有网友测试出Keepalived限制死20个VIP问题,那这个是怎么解决的。
有时主备机都出现绑定了VIP,这时最可能的是主备机间无法通讯,最简单的测试方法是关掉两机的防火墙,再试,由于Keepalived基于vrrp 通讯,因此还需要加vrrp和防火墙:(在入坑系列之HAProxy负载均衡 中提到过)
vi /etc/sysconfig/iptables #编辑 -A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT #允许组播地址通信(在做keepalived时用得到) -A RH-Firewall-1-INPUT -p vrrp -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙 :wq! #保存退出 service iptables restart #重启防火墙使配置生效