Keepalived软件起初是专门为LVS负载均衡软件设计的用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了能够实现高可用的VRRP功能。所以,Keepalived除了可以管理LVS软件外,还能够做为其余服务的高可用解决方案软件。ios
Keepalived软件主要是经过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的nginx
1.master在工做状态会不断群发一个广播包(内涵优先参数)算法
2.其余路由收到收到广播后会和本身的优先参数做对比,若是优先参数小于本身则什么都不执行,若是优先参数大于本身则开启争抢机制vim
3.若是启动了争抢机制,他就会群发本身的优先参数,最终优先参数最小的称为master路由.bash
core核心模块 chech健康监测 vrrp虚拟路由冗余协议服务器
1.管理LVS 2.对LVS集群节点检查 3.做为系统网络服务的高可用功能网络
#其中3高可用可做为任意网络功能负载均衡
Keepalived高可用故障切换,是经过VRRP虚拟路由器冗余协议来实现的。 ssh
在Keepalived服务正常工做时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点本身还活着,当主Master节点发生故障时,就没法发送心跳消息,备节点没法检测到来自主Master节点心跳了,因而调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。oop
yum -y install keepalived #安装keepalived vim /etc/keepalived/keepalived.conf #修改主keepalived配置文件 yum -y install openssh-clients #安装scp scp /etc/keepalived/keepalived.conf root@192.168.50.149:/etc/keepalived/ #发从给从 /etc/init.d/keepalived start #启动keepalived
! Configuration File for keepalived global_defs { #全局定义部分 notification_email { #设置警报邮箱 acassen@firewall.loc #邮箱 failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #设置发件人地址 smtp_server 192.168.50.1 #设置smtp server地址 smtp_connect_timeout 30 #设置smtp超时链接时间 以上参数能够不配置 router_id LVS_DEVEL #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是惟一的 } vrrp_instance VI_1 { #VRRP实例定义区块名字是VI_1 state MASTER #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,而且须要大写这些字符ASTER为正式工做的状态,BACKUP为备用的状态 interface eth0 virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是惟一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的. priority 100 #priority为优先级 越大越优先 advert_int 1 #为同步通知间隔。MASTER与BACKUP之间通讯检查的时间间隔,单位为秒,默认为1. authentication { #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通讯。 auth_type PASS auth_pass 1111 } virtual_ipaddress { #设置虚拟IP地址 192.168.50.16 #此格式ip a显示 ifconfig不显示 192.168.50.17/24 dev eth0 label eth0:1 #绑定接口为eth0,别名为eth0:1 } #至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除 #如下为虚拟服务器定义部分 virtual_server 192.168.50.16 80 { #设置虚拟服务器,指定虚拟IP和端口 delay_loop 6 #健康检查时间为6秒 lb_algo rr #设置负载调度算法 rr算法 lb_kind NAT #设置负载均衡机制 #有NAT,TUN和DR三种模式可选 nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号 persistence_timeout 50 #链接保留时间,50秒无响应则从新分配节点 protocol TCP #指定转发协议为TCP real_server 192.168.5.150 80 { #RS节点1 weight 1 #权重 TCP_CHECK { #节点健康检查 connect_timeout 8 #延迟超时时间 nb_get_retry 3 #重试次数 delay_before_retry 3 #延迟重试次数 connect_port 80 #利用80端口检查 } } real_server 192.168.50.149 80 { #RS节点2 weight 1 TCP_CHECK { connect_timeout 8 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
配置完毕后启动keepalived 并检测是否有虚拟端口
/etc/init.d/keepalived start ip a | grep 192.168.50.16 #出现上述带有vip:192.168.50.16行的结果表示lb01的Keepalived服务单实例配置成功
! Configuration File for keepalived global_defs { notification_email { 215379068@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 #此参数和lb01 MASTER不一样 } vrrp_instance VI_1 { #和lb01 MASTER相同 state BACKUP #此参数和lb01 MASTER不一样 interface eth0 #和lb01 MASTER相同 virtual_router_id 55 #和lb01 MASTER相同 priority 90 #此参数和lb01 MASTER不一样 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.50.17/24 dev eth0 label eth0:1 } } #如下都相同
配置完成后,启动Keepalived服务 并模拟实验 主从vip漂移(只需开启关闭主 .关闭主,主VIP消失从显示VIP ,开启主 从VIP消失,主VIP显示)
router_id dd1 router_id dd2 路由标识
state MASTER state BACKUP 主备状态
priority 100 priority 90 优先级
Keepalived双实例双主模式配置
启动两个vrrp vrrp_instance VI_1和vrrp_instance VI_2 让他俩互为主从.
Keepalived软件仅仅在对方机器宕机或Keepalived停掉的时候才会接管业务。但在实际工做中,有业务服务中止而Keepalived服务还在工做的状况,这就会致使用户访问的VIP没法找到对应的服务
实现方法1.能够写守护进程脚原本处理,。当服务有问题时,就停掉本地的Keepalived服务,实现IP漂移到对端继续提供服务。
例 nginx高可用
#!/bin/sh while true do if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi sleep 5 done #此脚本的基本思想是若没有80端口存在,就停掉Keepalived服务实现释放本地的VIP。在后台执行上述脚本并检查:
第二个方法:能够使用Keepalived的配置文件参数触发写好的监测服务脚本。首先要开发检测服务脚本,注意这个脚本与上一个脚本的不一样。
#!/bin/bash if [ `netstat -antup | grep nginx | wc -l` -ne 1 ];then /etc/init.d/keepalived stop fi
在keepalived的配置文件加入如下模块
vrrp_script chk_nginx_proxy { #定义vrrp脚本,检测HTTP端口 script "/server/scripts/chk_nginx_proxy.sh" #执行脚本,当Nginx服务有问题,就停掉Keepalived服务 interval 2 #间隔2秒 weight 2
当在同一个局域网内部署了多组Keepalived服务器对,而又未使用专门的心跳线通讯时,可能会发生高可用接管的严重故障问题。以前已经讲解过Keepalived高可用功能是经过VRRP协议实现的,VRRP协议默认经过IP多播的形式实现高可用对之间的通讯,若是同一个局域网内存在多组Keepalived服务器对,就会形成IP多播地址冲突问题,致使接管错乱,不一样组的Keepalived都会使用默认的224.0.0.18做为多播地址。此时的解决办法是,在同组的Keepalived服务器全部的配置文件里指定独一无二的多播地址,配置以下:
global_defs { #全局配置 router_id LVS_19 #服务标识 vrrp_mcast_group4 224.0.0.19 #这个就是指定多播地址的配置 } #提示: 1)不一样实例的通讯认证密码也最好不一样,以确保接管正常。 2)另外一款高可用软件Heartbeat,若是采用多播方式实现主备通讯,一样会有多播地址冲突问题。
在备节点上执行脚本,若是能够ping通主节点而且备节点有VIP就报警,让人员介入检查是否裂脑。
#!/bin/bash lb01_vip=192.168.0.240 lb01_ip=192.168.0.221 while true do ping -c 2 -W 3 $lb01_ip &>/dev/null if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then echo "ha is split brain.warning." else echo "ha is OK" fi sleep 5 done
能够将此脚本整合到Nagios或Zabbix监控服务里,进行监控报警。