对其vip漂移过程采用gdb跟踪
- keepalived工具
- 主要功能
- 产生vip漂移过程两种情况
- gdb调试常用命令
- gdb调试时打到的函数栈(供学习参考)
函数栈的图是本人理解下画的,不对请多指正
keepalived主要有三个进程,父进程是core进程,启动后产生两个子进程,分别是vrrp和check进程,三个均为守护进程
keepalived工具
在Keepalived与Haproxy协调工作的场景中,常见场景如下图。
主要分为三个部分:客户端、调度服务器、服务器集群。
调度服务中通过Keepalived负责将集群对用户显示为一个整体,提供VIP,并且提供调度服务器的故障转移,确保调度服务的高可用。HaProxy工具负责进行负载均衡功能,与服务器集群相连接。
keepalived是一个具有配置LVS负载均衡管理功能,又具有通过vrrp协议实现高可用功能的工具。它能够保证单个节点宕机时,整个网络可以不间断的运行。
主要功能
Keepalived提供了2个主要功能:
- LVS系统的健康检查
- 实现VRRPv2堆栈来处理负载均衡器的故障转移
重点关注keepalived的failover部分。
正常运行过程中,由主节点不断的向备节点发送vrrp通告(具备心跳消息)。当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。(与配置有关)
在搭建Keepalived时,主机一(Master)会向局域网发送一个ARP包,包中有IP地址与MAC的映射关系为VIP:MAC1,这时访问VIP,就会根据对应的MAC1访问到主机一,当主机二(backup)检测到主机一故障,将自己升为主控机,则主机二会向局域网中发送ARP包,包含IP与MAC的映射关系为VIP:MAC2,之后访问VIP,就会根据对应的MAC2访问主机二。
但是为了减少接管的影响,某些网络环境需要使用VMAC,可以通过Keepalived配置文件中调用use_mac关键字来实现VMAC支持。在内部,Keepalived代码引入虚拟接口,每个接口专用于特定的virtual_router。Keepalived使用linux内核macvlan驱动程序定义这些接口。因此,必须使用支持macvlan编译的内核。
产生vip漂移过程两种情况
整个过程中,对于客户端来说,不知道对于两台调度服务器发生了切换,客户端保持连接同一个vip,完成自身请求。
在这里面涉及两次切换,
①对于备节点收不到主节点的心跳消息时,触发定时器超时(vrrp_dispatcher_read_timeout),判断当前节点状态为备节点,执行升主操作(vrrp_gotomaster)。
②此时备节点已经变为主节点,当设置为抢占模式时,原来的主节点网络恢复,要与备节点进行连接,主会发送vrrp通告(vrrp_send_adv 包括优先级信息)。通过netlink接口中查到的vrrp包,通过路由过滤和规则过滤,当由备节点升为的主节点(128.20)此时知道自身优先级低,会执行设为备节点(set_backup->leave_master)。
Keepalived使用的vrrp虚拟路由冗余协议方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。
总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。
keepalived的功能全部可配置,可选择是否开启某项服务。
gdb调试常用命令
service keepalived stop
ip addr //查看vip在哪台服务器上
systemctl start keepalived
systemctl status keepalived
systemctl stop keepalived
#在sbin目录下执行以下命令
#注意目录中有可执行的 keepalived文件
gdb keepalived
set args -f /etc/keepalived/keepalived.conf
b <函数名>
r 启动
gdb调试时打到的函数栈(供学习参考)
发送arp包
netlink接口对包进行过滤
备升主函数
vrrp通告 包含优先级发送
禅让给优先级更高的服务器节点