keepalived学习记录:对其vip漂移过程采用gdb跟踪

简介: keepalived学习记录:对其vip漂移过程采用gdb跟踪

keepalived工具


在Keepalived与Haproxy协调工作的场景中,常见场景如下图。

主要分为三个部分:客户端、调度服务器、服务器集群。

调度服务中通过Keepalived负责将集群对用户显示为一个整体,提供VIP,并且提供调度服务器的故障转移,确保调度服务的高可用。HaProxy工具负责进行负载均衡功能,与服务器集群相连接。

34d74bf1975544fd820ec184decefad4.png

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)。


2.png


②此时备节点已经变为主节点,当设置为抢占模式时,原来的主节点网络恢复,要与备节点进行连接,主会发送vrrp通告(vrrp_send_adv 包括优先级信息)。通过netlink接口中查到的vrrp包,通过路由过滤和规则过滤,当由备节点升为的主节点(128.20)此时知道自身优先级低,会执行设为备节点(set_backup->leave_master)。

3.png

Keepalived使用的vrrp虚拟路由冗余协议方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。


总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。


90f660653d694c88869ebfe815c3b358.png


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包

4.png

netlink接口对包进行过滤

5.png

备升主函数

6.png

vrrp通告 包含优先级发送

7.png

禅让给优先级更高的服务器节点

8.png

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
8月前
|
NoSQL Linux 文件存储
GDB学习入门之gdb准备2
GDB学习入门之gdb准备2
62 0
GDB学习入门之gdb准备2
|
8月前
|
NoSQL Shell Linux
GDB学习入门之gdb准备
GDB学习入门之gdb准备
65 0
|
8月前
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
173 0
|
8月前
|
NoSQL
GDB调试学习(三):观察点
GDB调试学习(三):观察点
81 0
|
8月前
|
NoSQL
GDB调试学习(二):断点
GDB调试学习(二):断点
86 0
|
8月前
|
NoSQL IDE Linux
Linux的学习之路:8、Linux调试器-gdb使用
Linux的学习之路:8、Linux调试器-gdb使用
75 0
|
8月前
|
NoSQL Shell C语言
GDB调试学习(一):单步执行和跟踪函数调用
GDB调试学习(一):单步执行和跟踪函数调用
178 1
|
8月前
|
NoSQL 编译器 Linux
GDB 学习入门之GDB初识
GDB 学习入门之GDB初识
85 0
|
8月前
|
NoSQL Linux Android开发
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
OPENJTAG调试学习(三):使用 gdb 命令行进行调试
126 0
|
NoSQL Linux 编译器
【Linux系统化学习】开发工具——gdb(调试器)
前几篇文章分别介绍了在Linux下的代码编辑器、编译器。在编写代码时难免会遇到一些Bug需要我们手动去调试我们的代码片段,在Windows系统下的集成化开发环境我们可能使用某个快捷键就可以进入调试,但是在没有可视化图标的Linux下我们要使用我们的调试器gdb进行调试。