Keepalived 高可用集群的使用
Keepalived介绍Keepalived 服务的三个重要功能Keepalived 高可用故障切换转移原理(重点)扩展测试让keepalived监测Nginx服务非抢占模式的配置VIP脑裂单播模式keepalived 命令 Keepalived 高可用集群的使用 Keepalived介绍
Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。
Keepalived 软件主要通过 VRRP 协议实现高可用功能的,VRRP 是 Virtual Router Redundancy Protocol (虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决动态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对LVS 下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。
Keepalived 软件的官方站点: http://www.keepalived.org
Keepalived 服务的三个重要功能1)管理 LVS 负载均衡软件
早期的 LVS 软件,需要通过命令行或脚本实现管理,并且没有针对 LVS 节点的健康检查功能。为了解决 LVS 的这些使用不便的问题,Keepalived就诞生了,可以说,Keepalived软件起初是专为了解决 LVS 的问题而诞生的。因此,Keepalived和LVS的感情很深,它们的关系如同夫妻一样,可以紧密的结合,愉快的工作。Keepalived 可以通过读取自身的配置文件实现通过更底层的接口直接管理 LVS 的配置以及控制服务的启动、停止等功能,这使得 LVS 的应用就更加简单方便了。
2)实现对 LVS 集群节点健康检查功能(healthcheck)
Keepalived 可以通过在自身的keepalived.conf文件里配置 LVS 的节点 IP 和相关参数实现对 LVS 的直接管理;除此之外,当 LVS 集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived 服务会自动将失效的节点服务器从 LVS 的正常转发队列中清楚出去,并转换到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复后,Keepalived 服务又会自动地把它们加入到正常转发队列中,对客户提供服务。
3)作为系统网络服务的高可用功能(failover)
Keepalived 可以实现任意两台主机之间,例如 Master 和 Backup 主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是 LVS 负载均衡、Nginx 反向代理这样的服务器。
Keepalived 高可用功能实现的原理为:两台主机同时安装好 keepalived 软件并启动服务,开始正常工作时,由角色为 Master 的主机获得所有资源并对用户提供服务,角色 Backup 的主机作为 Master 主机的热备;当角色为 Master 的主机失效或出现故障时,角色为 Backup 的主机将自动接管 Master 主机的所有工作,包括接管 VIP 资源及相应资源服务;而当角色为 Master 的主机故障修复后,又会自动接管回它原来处理的工作,角色为 Backup 的主机则同时释放 Master 主机失效它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
Keepalived 高可用故障切换转移原理(重点)Keepalived 高可用服务对之间的故障切换转移,是通过 VRRP 协议(虚拟路由冗余协议)来实现的。
在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息了,备节点也就因此无法继续检测到来自Master 节点的心跳了,进而调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来备用角色。
扩展区分广播,组播和单播的区别
yum install keepalivedservice keepalived startsystemctl keepalived enable
**Master 配置 **
state MASTER/BACKUP
virtual_router_id 虚拟路由ID要保持一致
priority 越大优先级越高
virtual_ipaddress 虚拟IP
[ host200:/etc/keepalived ]# lskeepalived.conf[ host200:/etc/keepalived ]# cat keepalived.conf! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 }}
Backup配置
[ host201:/usr/share/nginx/html ]# cd /etc/keepalived/[ host201:/etc/keepalived ]# cat keepalived.conf! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 }}
测试 当系统异常宕机或者Keepalived进程异常,即VIP会发生漂移
前
kill keepalived进程后
原因: 由于Keepalive 虚IP的漂移的前提1) 网络不通,系统宕机 2) keepalived 进程异常,所以当nginx服务异常时,keepalive的VIP不会随之漂移,故需要编写脚本,让VIP进行迁移
#!/bin/bashnginx_status=`ps -C nginx --no-header | wc -l`if [ $nginx_status -eq 0 ]; thenservice keepalived stopfi
**Nginxcheck脚本配置到Keepalived.conf文件中
原因: 当VIP发生倒换时,倒换瞬间的用户访问会出现异常,为提高用户体验,故减少倒换次数。
# host200 主配置修改! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script check_nginx { script /sysadmin/manager/LNMP/nginx.sh interval 3}vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 51 priority 100 advert_int 1 track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 }}
# host201 备配置修改! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script check_nginx { script /sysadmin/manager/LNMP/nginx.sh interval 3}vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 51 priority 90 advert_int 1 track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 }}
VIP脑裂#抓包软件tcpdumpyum install tcpdump -y tcpdump -i ens33 vrrp -n # master是如何发送组播数据包# master服务器-->组播地址发送数据包-->backup服务器 # 当有一天,Backup接受不到组播地址发送过来的数据包,系统就会认为Master宕机,开始选出生成新的Master。# VIP脑裂最大的原因就是防火墙未关闭或者没有把VRRP协议添加到防火墙中。# 发生脑裂如何处理# 1) 抓包+查看vip 2) 关闭backup的keepalived软件 3) 检查防火墙 4)启动keepalived软件## 3.1测试环境systemctl stop firewalld## 3.2生成环境firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens33 --destination [广播IP地址] --protocol vrrp -j ACCEPTfirewall-cmd --reload
单播模式组播模式的弊端:1) 产生众多无用的信息,干扰和冲突,2)消耗带宽 3)云服务禁止组播
组播改单播配置
keepalivd1.3以上版本,注释vrrp_strict2)添加如下配置并重启keepalived软件
主配置
[ host200:/etc/keepalived ]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr# vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script check_nginx { script /sysadmin/manager/LNMP/nginx.sh interval 3}vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 51 priority 100 advert_int 1 track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 } unicast_src_ip 192.168.3.200 unicast_peer { 192.168.3.201 }}
备配置
! Configuration File for keepalivedglobal_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr# vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}vrrp_script check_nginx { script /sysadmin/manager/LNMP/nginx.sh interval 3}vrrp_instance VI_1 { state BACKUP nopreempt interface ens33 virtual_router_id 51 priority 90 advert_int 1 track_script { check_nginx } authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.3.150 } unicast_src_ip 192.168.3.201 unicast_peer { 192.168.3.200 }}
keepalived 命令[ host200:/etc/keepalived ]# keepalived -hUsage: keepalived [OPTION...] -f, --use-file=FILE Use the specified configuration file -P, --vrrp only run with VRRP subsystem -C, --check only run with Health-checker subsystem -l, --log-console Log messages to local console -D, --log-detail Detailed log messages -S, --log-facility=[0-7] Set syslog facility to LOG_LOCAL[0-7] -X, --release-vips Drop VIP on transition from signal. -V, --dont-release-vrrp Don't remove VRRP VIPs and VROUTEs on daemon stop -I, --dont-release-ipvs Don't remove IPVS topology on daemon stop -R, --dont-respawn Don't respawn child processes -n, --dont-fork Don't fork the daemon process -d, --dump-conf Dump the configuration data -p, --pid=FILE Use specified pidfile for parent process -r, --vrrp_pid=FILE Use specified pidfile for VRRP child process -c, --checkers_pid=FILE Use specified pidfile for checkers child process -a, --address-monitoring Report all address additions/deletions notified via netlink -x, --snmp Enable SNMP subsystem -A, --snmp-agent-socket=FILE Use the specified socket for master agent -s, --namespace=NAME Run in network namespace NAME (overrides config) -m, --core-dump Produce core dump if terminate abnormally -M, --core-dump-pattern=PATN Also set /proc/sys/kernel/core_pattern to PATN (default 'core') -i, --config_id id Skip any configuration lines beginning '@' that don't match id -v, --version Display the version number -h, --help Display this help message