在前面的一篇中讲到了Heartbeat做为高可用服务架构的解决方案,今天有试验了一种全新的解决方案,即采用Keepalived来实现这个功能。前端
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived能够用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会致使整个系统架构的不可用)的发生,经过配合Nginx能够实现web前端服务的高可用。node
Keepalived实现的基础是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的.nginx
VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,若是实际拥有这个对外IP的路由器若是工做正常的话就是MASTER,或者是经过算法选举产生,MASTER实现针对虚拟路由器IP的各类网络功能,如ARP请求,ICMP,以及数据的转发等;其余设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。web
VRRP协议使用多播数据来传输VRRP数据,VRRP数据使用特殊的虚拟源MAC地址发送数据而不是自身网卡的MAC地址,VRRP运行时只有MASTER路由器定时发送VRRP通告信息,表示MASTER工做正常以及虚拟路由器IP(组),BACKUP只接收VRRP数据,不发送数据,若是必定时间内没有接收到MASTER的通告信息,各BACKUP将宣告本身成为MASTER,发送通告信息,从新进行MASTER选举状态。算法
安装keepalived以前,也要安装一些依赖库bash
安装 openssl服务器
yum install openssl*网络
安装popt架构
yum install popt*负载均衡
安装ipvsadm
yum isntall ipvsadm
安装libnl-dev
yum install libnl-dev*
keepalived安装包地址:
下载解压后编译配置
./configure --prefix=/usr/local/keepalived
编译配置须要确保一下几项为Yes状态:
Use IPVS Framework : Yes IPVS sync daemon support : Yes IPVS use libnl : Yes Use VRRP Framework : Yes
而后就能够编译安装了:
make && make install
由于没有使用keepalived的默认路径安装(默认是/usr/local),安装完成以后,须要作一些工做
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
#复制keepalived启动文件到默认路径,也能够经过设置环境变量的path实现 cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ #复制服务启动脚本到,以即可以经过service控制keepalived服务 cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ #复制keepalived服务脚本到默认的地址,也经过修改init.d/keepalived文件中的相应配置实现 mkdir -p /etc/etc/keepalived/ cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ vi /etc/keepalived/keepalived.conf #复制默认配置文件到默认路径,其实也能够在/etc/init.d/keepalived中设置路径 chkconfig keepalived on #开机启动服务
接下来就是配置了,很简单,直接上配置文件
先是主服务器:
global_defs
{ notification_email #通知email,根据实际状况配置 { admin@example.com } notification_email_from admin@example.com smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id node1 #节点名标识,主要用于通知中 } vrrp_instance VI_NODE { state MASTER #配置为主服务器 interface eth0 #通信网卡 virtual_router_id 100 #路由标识 priority 200 #优先级,0-254 advert_int 5 #通知间隔,实际部署时能够设置小一点,减小延时 authentication { auth_type PASS auth_pass 123456 #验证密码,用于通信主机间验证 } virtual_ipaddress { 192.168.1.206 #虚拟ip,能够定义多个 } }
接下是从服务器设置:
global_defs { notification_email { admin@example.com } notification_email_from admin@example.com smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id node2 } vrrp_instance VI_NODE { state BACKUP #与主服务器对应 interface eth0 #从服务器的通讯网卡 virtual_router_id 100 #路由标识,和主服务器相同 priority 100 #优先级,小于主服务器便可 advert_int 5 #这里是接受通知间隔,与主服务器要设置相同 authentication { auth_type PASS auth_pass 123456 #验证密码,与主服务器相同 } virtual_ipaddress { 192.168.1.206 #虚拟IP,也要和主服务器相同 } }
上面的设置是最基础的设置,实现的功能是若是主服务器的Keepalived中止服务(通常状况下服务器宕机),则将虚拟IP切换至从服务器,主服务器恢复后重新切换回主服务器。
可是不少状况下咱们面临的处境是nginx挂掉了,而这个时候Keepalived就不能发挥做用,这时候就须要咱们来改良下Keepalived了。经过向Keepalived添加一个自定义脚原本监控neginx的运行状态,若是nginx进程结束,则kill Keepalived进程,以此来达到主从服务器的切换功能。
咱们在修改上面配置的主服务器的配置文件,在中间添加脚本实现
global_defs { notification_email { admin@example.com } notification_email_from admin@example.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id nginx_master } vrrp_script chk_http_port { script "/usr/local/keepalived/nginx.sh" #在这里添加脚本连接 interval 3 #脚本执行间隔 weight 2 #脚本结果致使的优先级变动 } vrrp_instance VI_NODE { state MASTER interface eth0 virtual_router_id 100 priority 200 advert_int 5 authentication { auth_type PASS auth_pass 123456 } track_script { chk_http_port #添加脚本执行 } virtual_ipaddress { 192.168.1.206 } }
具体的配置能够参考另外一篇文章Keepalived配置详解
若是咱们使用了LVS+Keepalived集成,那么keepalived能够代替ipvsadm来配置LVS,能够方便的经过配置就能够搞定,这在另外一篇文章Keepalived+LVS配置详解
修改完配置文件咱们写咱们的上面配置的nginx.sh,固然咱们假定Nginx已经安装完成
#!/bin/bash A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then killall keepalived fi
上面的脚本简单的查看nginx进程是否存在,不存在就kill keepalived进程。
接下来咱们对上面的哦脚本修改一下,当脚本检测到nginx没有运行的时候会尝试去启动nginx以此,若是失败则停掉keepalived进程
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx #nginx命令的路径 sleep 3 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
把脚本保存到上面配置的具体路径(我这里是/usr/local/keepalived),而后很重要的一步是修改脚本的执行权限
chmod +x nginx.sh
配置完成后就能够运行看下效果了,分别在主从服务器上启动nginx和keepalived
service keepalived start
启动以后经过·ip a·命令查看主服务器的网络信息,能够看到在eth0网卡下生成了192.168.1.206这个虚拟ip,并可经过这个ip访问到nginx
而后咱们关闭nginx的进程(若是配置了一次尝试重启那要注意下),而后咱们能够经过ps -e
查看keepalived进程是否关闭,正常状况下查看网络信息中,能够看到eth0网卡下的虚拟ip已经解除,而后在从服务器的网络信息中能够看到从服务器的eth0网卡绑定了虚拟ip,经过这个ip就访问到了从服务器的nginx去了,这是咱们从新启动主服务器的nginx和keepalieved,咱们能够发现虚拟ip就绑回到了主服务器。
这样就实现了基本双击主从热备功能了。
这里注意下防火墙的问题,就是这问题困扰了我好久。找了一些资料才将问题解决
由于Keepalived之间是经过组播来通知对方的是否存活,以及发送优先级的,而且经过组播来选举MASTER的,而224.0.0.18就是经常使用的组播地址,防火墙开启容许这个组播地址通讯就能够了:
1.若是用的是默认防火墙,只须要添加:
iptables -I RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT
2.若是是本身用脚本设置的防火墙,须要添加以下规则
iptables -A OUTPUT -o eth0 -d 224.0.0.18 -j ACCEPT iptables -A OUTPUT -o eth0 -s 224.0.0.18 -j ACCEPT iptables -A INPUT -i eth0 -d 224.0.0.18 -j ACCEPT iptables -A INPUT -i eth0 -s 224.0.0.18 -j ACCEPT