一、keepalived是什么
keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。
二、keepalived工作原理
keepalived是基于VRRP协议实现基础的高可用。
VRRP(虚拟路由冗余协议)是一种容错协议.通常,一个网络内的所有主机都设置一条默认路由,这样,主机发出的目的地址不在本网段的报文将被通过默认路由发往路由器RouterA,从而实现了主机与外部网络的通信。当路由器RouterA 坏掉时,本网段内所有以RouterA 为默认路由下一跳的主机将无法与外部通信,这就是单点故障。VRRP就是为解决上述问题而提出的。
VRRP 将局域网的一组路由器组织成一个虚拟路由器。这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,同一时间内只有一台物理路由器占有这个虚拟IP,作为master实际负责ARP响应和数据包转发等工作;其它物理路由器作为backup,不提供对外服务,仅接收master的vrrp状态通告信息。
master由优先级选举产生,每个物理路由器都有一个 1-255 之间的优先级,级别最高的(highest priority)将成为master,若优先级相同,则IP地址较大者胜出。
在vrrp协议中,所有的报文都是通过IP多播形式发送的,而在一个虚拟路由器中,只有处于master角色的路由器会一直发送VRRP数据包,处于backup角色的路由器只接收master发过来的报文信息,用来监控master的运行状态,因此不会发生backup抢占的现象,除非它的优先级更高。当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行优先级最高的backup就将成为新的master,这样就保证了服务的持续可用性。
三、keepalived的组件
keepalived的主要组件:
WatchDog:负责监控checkers和VRRP进程
Checkers:实现对服务器运行状态检测和故障隔离
VRRP Stack:实现vrrp协议,即实现HA集群中失败切换功能
IPVS wrapper:将设置好的ipvs规则送给内核ipvs模块
Netlink Reflector:负责虚拟IP的设置和切换
四、keepalive的适用场景
keepalived理论上可以为mysqld,httpd等服务提供高可用,给这些服务做高可用通常需要配置共享存储资源,对此keepalived需要借助额外的命令或脚本实现,这种情况下keepalived的性能是显然不如heartbeat或corosync的。keepalived适合提供轻量级的高可用方案,如对作为反向代理的nginx、haproxy以及ipvs做高可用,给这些服务做高可用都无需配置共享存储资源。keepalived即能给ipvs做高可用,又能基于ipvs做负载均衡,并且能应用一系列的健康状态检测机制,获知后端服务器的状态,实现服务器池的动态维护和管理。
五、使用keepalived做反向代理nginx的高可用
1、实验拓扑图
2、在node3上安装httpd,在node1和node2上安装nginx并配置为反向代理服务器,代理至node3;
另外,要确保做高可用的两个节点时间同步。
node3:
# yum -y install httpd
# vim /var/www/html/test.html #创建一个测试页面
hello,keepalived
# service httpd start
node1:
# yum -y install nginx;ssh root@node2 'yum -y install nginx'
# vim /etc/nginx/conf.d/default.conf
location ~ \.html$ {
proxy_pass http://192.168.30.13;
}
# scp /etc/nginx/conf.d/default.conf root@node2:/etc/nginx/conf.d/
# service nginx start;ssh root@node2 'service nginx start' #启动两个节点上的nginx服务
3、在node1和node2上安装配置keepalived
node1:
# yum -y install keepalived;ssh root@node2 'yum -y install keepalived'
# rpm -ql keepalived
主配置文件路径:/etc/keepalived/keepalived.conf
查看配置文件帮助信息:man keepalived.conf
keepalived的日志信息会输出至/var/log/messages
keepalived配置文件主要包括四大段:
global_defs:全局配置段,主要配置邮件通知和机器标识
vrrp_instance:vrrp实例配置段,配置高可用集群
virtual_server:lvs配置段,配置负载均衡集群
vrrp_script:vrrp脚本配置段,用来实现对集群资源的监控,要在vrrp_instance配置段中调用才能生效
注:以上各配置段并非都必不可少,可按需配置。如果只是单纯地做负载均衡集群,可不用配置vrrp_instance段,反过来也是;甚至如果不想使用邮件通知,都不需要配置global_defs段。
# cd /etc/keepalived/
# mv keepalived.conf keepalived.conf.back
# vim keepalived.conf
!Configuration File for keepalived #以“!”开头的为注释
global_defs { #全局配置段,主要配置邮件通知和机器标识
notification_email { #指定keepalived在发生事件(如切换、故障)时发送email给谁,多个写多行
root@localhost #收件人
}
notification_email_from [email protected] #发件人
smtp_connect_timeout 10 #连接smtp服务器的超时时长
smtp_server 127.0.0.1 #smtp服务器地址
router_id nginx-node1 #机器标识;通常为hostname,但不是必须为hostname,会显示在邮件主题中
}
vrrp_script chk_nginx { #vrrp脚本配置段,要在vrrp实例中调用才生效
script "killall -0 nginx" #信号0用来判断进程的状态;返回状态码为0表示正常,返回状态码非0表示异常
interval 1 #检测的间隔时长
weight -2 #确定异常则将优先级减2
fall 3 #确定为异常需要检测的次数
rise 1 #确定为正常需要检测的次数
}
vrrp_script chk_mantaince_down { #此vrrp脚本的作用在于可以让我们通过手动创建文件的方式使节点降级
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -2
fall 3
rise 1
}
vrrp_instance VI_1 { #vrrp实例配置段,可定义多个,每个vrrp实例名称要惟一
interface eth0 #指定vrrp绑定的物理接口
state MASTER #指定节点的初始状态;但这里指定的不算,keepalived启动时根据节点的优先级高低来确定节点的角色
priority 100 #优点级,1-255
virtual_router_id 11 #虚拟路由id,用来区分多个instance的VRRP组播
garp_master_delay 1 #当切为master状态后多久更新ARP缓存,默认5秒
smtp_alert #当有状态切换时使用全局配置段的邮件设置来发送通知
authentication { #节点间通信认证,认证类型有PASS和AH
auth_type PASS
auth_pass magedu #在一个vrrp实例中,master和backup要使用相同密码才能正常通信
}
track_interface { #跟踪接口,若接口出现故障,则节点状态变成fault
eth0
}
virtual_ipaddress {
192.168.30.30/24 dev eth0 label eth0:0 #虚拟IP地址,会添加在master上
}
track_script { #调用vrrp脚本
chk_nginx
chk_mantaince_down
}
}
vrrp实例配置段中其它常用参数:
nopreempt 表示不抢占。允许一个priority较低的节点保持master状态,即使priority更高的节点恢复正常。
因为节点的切换会毕竟会造成服务短暂的中断,而且存在一定的风险和不稳定性。因此应尽量减少切换操作。
要配置非抢占模式,在优先级较高节点的配置文件中:
state BACKUP
nopreempt
preempt_delay 抢占延迟时间;有时候系统重启之后需要经过一段时间后才能工作,在这种情况下进行主备切换是没必要的
notify_master/backup/fault 分别表示节点状态为主/备/出错时所执行的脚本
use_vmac 是否使用VRRP的虚拟MAC地址
node2做同样的安装操作(只有配置文件有点区别):
#vim /etc/keepalived/keepalived.conf #对node2上的keepalived配置文件做适当修改
...
router_id nginx-node2
...
state BACKUP
priority 99 #从节点优点级较低
...
#service keepalived start #先尝试启动从节点
#tail -f /var/log/messages
keepalived会启动Healthcheck和VRRP两个子进程;
keepalived备节点在启动keepalived后,由于自身角色为backup,所以会首先进入backup状态,然后运行vrrp_script模块检查资源状态,
如果nginx正常,则输出succeeded。因为keepalived主节点还没启动,此时备节点发现自己的优先级最高,于是转变为master状态,然后设置vip。
#ip addr show #可以看到vip已配置
node1启动服务:
#service keepalived start
# tail -f /var/log/messages
从日志可看出,在keepalived主节点启动后,由于自身角色为master,所以先用vrrp_script模块进行检测,检测正常后才转为master状态
当收到一个优先级较低的通告,强制进行新的选举,然后确定进入master状态
#ip addr show #可以看到node1已抢到vip
4、测试
#curl 192.168.30.30/test.html
hello,keepalived
停掉node1上的nginx,观察VIP会不会飘到node2上
六、使用keepalived做ipvs的高可用,采用双主模型
1、实验拓扑图