Part1背景描述
! Configuration File for keepalived
global_defs {
notification_email {
xxxx@xxxx.com
}
notification_email_from xxxx@xxxx.com
smtp_server 192.168.xxx.xxx
smtp_connect_timeout 30
router_id Chproxy_Router_Id
}
vrrp_script chk_http_port {
script "/opt/check_chprpoxy.sh"
interval 40
weight 20
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id xxx
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.xxx.xxx
}
notify_master "/opt/keepalived_notify.sh"
}

[root@xxx-xxx-chproxy-keepalive-xxx ~]# tail -1f /var/log/messages
Oct 16 16:38:09 localhost Keepalived_vrrp[3712]: VRRP_Instance(VI_1) Dropping received VRRP packet...
Oct 16 16:38:16 localhost Keepalived_vrrp[3712]: (VI_1): ip address associated with VRID 53 not present in MASTER advert : 192.168.xxx.xxx
Oct 16 16:38:16 localhost Keepalived_vrrp[3712]: bogus VRRP packet received on ens33 !!!
Oct 16 16:38:16 localhost Keepalived_vrrp[3712]: VRRP_Instance(VI_1) Dropping received VRRP packet...
Oct 16 16:38:17 localhost Keepalived_vrrp[3712]: (VI_1): ip address associated with VRID 53 not present in MASTER advert : 192.168.xxx.xxx
Oct 16 16:38:17 localhost Keepalived_vrrp[3712]: bogus VRRP packet received on ens33 !!!
Oct 16 16:38:17 localhost Keepalived_vrrp[3712]: VRRP_Instance(VI_1) Dropping received VRRP packet...
Oct 16 16:38:20 localhost Keepalived_vrrp[3712]: (VI_1): ip address associated with VRID 53 not present in MASTER advert : 192.168.xxx.xxx
Party2 分析过程
localhost Keepalived_vrrp[3712]: (VI_1): ip address associated with VRID 53 not present in MASTER advert : 192.168.4.199
localhost Keepalived_vrrp[3712]: bogus VRRP packet received on ens33 !!!
localhost Keepalived_vrrp[3712]: VRRP_Instance(VI_1) Dropping received VRRP packet...
2.1 日志信息含义
这条日志表示 Keepalived 的 VRRP 实例 VI_1 收到了与 VRID 53 相关的广告包,但在这个广告包中并没有找到指定的虚拟 IP 地址 ( 192.168.xxx.xxx)。 可能意味着: 这通常是主节点发送的广告包与当前节点的配置不一致所导致的。 广告包中的虚拟 IP 配置与当前节点期望的配置不匹配,可能是由于配置不一致。 有其他节点错误地发送了与 VRID 53 相关的广告包,且该广告包中并未包含 192.168.xxx.xxx。
这条日志表示在网络接口 ens33 上接收到了一个“伪造的” VRRP 包。也就是说,这个 VRRP 包不符合节点对其所在集群的期望。 这种情况可能是由于: 网络中有其他设备错误地发送了 VRRP 广告包。 主备节点之间的配置不一致,导致某个节点发送了无效或不可识别的 VRRP 广告包。
这条日志表示 Keepalived 丢弃了收到的 VRRP 包,因为它认为这些包是无效的或伪造的。 由于接收到的 VRRP 包与期望不一致,因此将其丢弃以避免不正确的状态切换。
2.3 问题排查
小贴士
-- tcpdump 是一个网络抓包工具,用于在指定的网络接口上捕获网络数据包并分析。
tcpdump -nn 的作用是让 tcpdump 直接显示 IP 地址和端口号,避免 DNS 查询和服务名解析。
-nn 是 tcpdump 的常用选项之一,具体用法和含义如下:
-n:这个选项告诉 tcpdump 不解析主机名,直接显示 IP 地址,而不是将 IP 地址解析为主机名。这样可以提高性能,因为省去了 DNS 查询的过程。
例如,显示 192.168.1.1 而不是通过 DNS 查询显示类似 server.example.com。
-nn:当两个 n 连续使用时,除了不解析主机名外,还不解析端口号。这样 tcpdump 会直接显示端口号,而不是显示对应的服务名称。
例如,显示 192.168.1.1:80 而不是 192.168.1.1:http,显示 443 而不是 https。
-- 实例
# 捕获所有流量
tcpdump -nn
# 捕获特定接口的流量
tcpdump -nn -i ens33
# 捕获特定主机的流量
tcpdump -nn host 192.168.1.100
# 捕获特定端口的流量
tcpdump -nn port 80
# 捕获 VRRP 流量
tcpdump -nn -i any net 224.0.0.0/8 | grep "VRRP"
[root@xxx-xxx-chproxy-keepalive-xxx ~]# tcpdump -nn -i any net 224.0.0.0/8
-- 得到的信息如下
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
16:33:07.480496 IP 192.168.xxx.63 > 224.0.0.18: VRRPv2, Advertisement, vrid 184, prio 102, authtype none, intvl 1s, length 20
16:33:07.519685 IP 192.168.xxx.35 > 224.0.0.18: VRRPv2, Advertisement, vrid 76, prio 100, authtype simple, intvl 1s, length 20
16:33:07.538291 IP 192.168.xxx.116 > 224.0.0.18: VRRPv2, Advertisement, vrid 118, prio 100, authtype simple, intvl 1s, length 20
16:33:07.545689 IP 192.168.xxx.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 181, prio 102, authtype none, intvl 1s, length 20
...... 省略其它信息
-- 解释如下
此处以 16:33:07.480496 IP 192.168.xxx.63 > 224.0.0.18: VRRPv2, Advertisement, vrid 184, prio 102, authtype none, intvl 1s, length 20 为例来进行解释
1) 16:33:07.480496:
时间戳,表示捕获到此数据包的时间
2) IP 192.168.xxx.63 > 224.0.0.18:
192.168.xxx.63:源 IP 地址,这个数据包是从 IP 地址 192.168.xxx.63 发送的。
224.0.0.18:目标 IP 地址,这是一个组播地址,专用于 VRRP 的多播。224.0.0.18 被所有 VRRP 参与设备用于接收 VRRP 广告包。
3) VRRPv2, Advertisement:
表示该数据包是一个 VRRP 第 2 版(VRRPv2)的广告包(Advertisement)。
VRRP 广告包由主节点发送,用于告知备节点主节点的状态,以便实现高可用。
4) vrid 184:
vrid 表示 VRRP 实例的虚拟路由器 ID。这是一个唯一的标识符,用于标识特定的 VRRP 组。在这一行中,vrid 的值是 184。
不同的 VRID 对应不同的虚拟路由器,可以让多组 VRRP 实例在同一网络中运行而不会互相干扰。
5) prio 102:
prio 表示 VRRP 广告包中的优先级。优先级越高,表示该节点越有可能成为主节点(MASTER)。
在这一行中,优先级 (priority) 是 102。通常,主节点会配置一个较高的优先级,以确保自己能够保持主节点地位。
6) authtype none authtype simple:
authtype 表示 VRRP 包的认证类型:
none:没有认证。
simple:使用简单的明文密码认证。
在 VRRP 中,认证可以用来防止未经授权的节点加入 VRRP 组。
7) intvl 1s:
intvl 表示 VRRP 广告包的发送时间间隔,这里是 1 秒。这意味着该节点每隔 1 秒发送一个广告包,以告知其他节点其状态。
通常情况下,VRRP 主节点会周期性发送广告包,以确保备节点知道主节点的健康状况。
8)length 20:
length 表示数据包的长度(单位为字节)。在这一行中,VRRP 广告包的长度是 20 字节。

[root@xxx-xxx-chproxy-keepalive-xxx ~]# tcpdump -nn -i any net 224.0.0.0/8 | grep "vrid 53"
-- 得到的信息如下
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
13:40:27.104788 IP 192.168.xxx.51 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 102, authtype simple, intvl 1s, length 20
13:40:28.105340 IP 192.168.xxx.51 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 102, authtype simple, intvl 1s, length 20
13:40:29.106068 IP 192.168.xxx.51 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 102, authtype simple, intvl 1s, length 2013:40:30.106548 IP 192.168.xxx.51 > 224.0.0.18: VRRPv2, Advertisement, vrid 53, prio 102, authtype simple, intvl 1s, length 20

2.4 解决办法
[root@xxx-xxx-chproxy-keepalive-xxx ~]# tcpdump -nn -i any net 224.0.0.0/8 | grep "vrid 59"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

-- MASTER 节点 信息如下
! Configuration File for keepalived
global_defs {
notification_email {
xxx@xxx.com
}
notification_email_from xxx@xxx.com
smtp_server 192.168.xxx.xxx
smtp_connect_timeout 30
router_id Chproxy_Router_Id
}
vrrp_script chk_http_port {
script "/opt/check_chprpoxy.sh"
interval 40
weight 20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 59
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.xxx.xxx
}
notify_master "/opt/keepalived_notify.sh"
}
-- BACKUP 节点信息如下
! Configuration File for keepalived
global_defs {
notification_email {
xxx@xxx.com
}
notification_email_from xxx@xxx.com
smtp_server 192.168.xxx.xxx
smtp_connect_timeout 30
router_id Chproxy_Router_Id
}
vrrp_script chk_http_port {
script "/opt/check_chprpoxy.sh"
interval 40
weight 20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 59
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.xxx.xxx
}
notify_master "/opt/keepalived_notify.sh"
}
ip addr命令查看当前 VIP 漂移到哪个节点。当发现 VIP 位于 MASTER 节点时,我选择对 BACKUP 节点的 keepalived 服务进行重启。
# systemctl restart keepalived
/var/log/messages,确认未再出现 VRID 被占用的相关信息。

三、总结
试用阿里云 ClickHouse企业版
轻松节省30%云资源成本?阿里云数据库ClickHouse架构全新升级,推出和原厂独家合作的ClickHouse企业版,在存储和计算成本上带来双重优势,现诚邀您参与100元指定规格测一个月的活动,了解详情:https://t.aliyun.com/Kz5Z0q9G


征稿启示
面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com


文章转载自ClickHouseInc,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




