Files
go-alived/TESTING.md
2025-12-08 22:23:45 +08:00

7.7 KiB
Raw Permalink Blame History

VRRP 功能测试指南

测试环境准备

1. 单机测试(使用虚拟网卡)

# macOS 创建虚拟网卡lo0 回环接口别名)
sudo ifconfig lo0 alias 192.168.100.1/24

# Linux 创建虚拟网卡(使用 dummy 模块)
sudo modprobe dummy
sudo ip link add dummy0 type dummy
sudo ip addr add 192.168.100.1/24 dev dummy0
sudo ip link set dummy0 up

2. 双机测试(推荐,真实场景)

需要两台机器(虚拟机或物理机),在同一网段:

  • Node1: 192.168.1.10/24
  • Node2: 192.168.1.20/24
  • VIP: 192.168.1.100/24

测试配置文件

Node1 配置 (config-node1.yaml)

global:
  router_id: "node1"
  notification_email: "admin@example.com"

vrrp_instances:
  - name: "VI_1"
    interface: "eth0"          # 修改为实际网卡名
    state: "BACKUP"
    virtual_router_id: 51
    priority: 100              # 较高优先级
    advert_interval: 1
    auth_type: "PASS"
    auth_pass: "secret123"
    virtual_ips:
      - "192.168.1.100/24"     # 修改为实际网段

Node2 配置 (config-node2.yaml)

global:
  router_id: "node2"
  notification_email: "admin@example.com"

vrrp_instances:
  - name: "VI_1"
    interface: "eth0"          # 修改为实际网卡名
    state: "BACKUP"
    virtual_router_id: 51
    priority: 90               # 较低优先级
    advert_interval: 1
    auth_type: "PASS"
    auth_pass: "secret123"
    virtual_ips:
      - "192.168.1.100/24"     # 修改为实际网段

测试步骤

测试 1: 启动和日志检查

Node1:

sudo ./go-alived --config config-node1.yaml --debug

预期输出:

[2025-12-05 14:25:51] INFO: starting go-alived...
[2025-12-05 14:25:51] INFO: loading configuration from: config-node1.yaml
[2025-12-05 14:25:51] INFO: configuration loaded successfully
[2025-12-05 14:25:51] INFO: loaded VRRP instance: VI_1
[2025-12-05 14:25:51] INFO: starting VRRP instance (VRID=51, Priority=100, Interface=eth0)
[2025-12-05 14:25:51] INFO: [VI_1] state changed: INIT -> BACKUP
[2025-12-05 14:25:51] INFO: [VI_1] transitioning to BACKUP state

Node2:

sudo ./go-alived --config config-node2.yaml --debug

测试 2: Master 选举

启动两个节点后,优先级高的 Node1 应该成为 MASTER。

Node1 预期输出:

[2025-12-05 14:25:54] INFO: [VI_1] master down timer expired, becoming master
[2025-12-05 14:25:54] INFO: [VI_1] state changed: BACKUP -> MASTER
[2025-12-05 14:25:54] INFO: [VI_1] transitioning to MASTER state
[2025-12-05 14:25:54] INFO: [VI_1] adding virtual IPs
[2025-12-05 14:25:54] INFO: [VI_1] added VIP 192.168.1.100/32
[2025-12-05 14:25:54] DEBUG: [VI_1] sent advertisement (priority=100)

验证 VIP:

# Node1 上执行
ip addr show eth0 | grep 192.168.1.100
# 应该能看到 VIP 已添加

Node2 保持 BACKUP:

[2025-12-05 14:25:54] DEBUG: [VI_1] received advertisement from 192.168.1.10 (priority=100, state=BACKUP)
# Node2 应该保持 BACKUP 状态

测试 3: 故障切换

在 Node1 上停止 go-alived

# Node1 上按 Ctrl+C 或发送 SIGTERM
sudo pkill -SIGTERM go-alived

Node1 预期输出:

[2025-12-05 14:26:10] INFO: received signal terminated, shutting down...
[2025-12-05 14:26:10] INFO: cleaning up resources...
[2025-12-05 14:26:10] INFO: [VI_1] stopping VRRP instance
[2025-12-05 14:26:10] INFO: [VI_1] removing virtual IPs
[2025-12-05 14:26:10] INFO: [VI_1] removed VIP 192.168.1.100/32

Node2 应该接管 (3秒内):

[2025-12-05 14:26:13] INFO: [VI_1] master down timer expired, becoming master
[2025-12-05 14:26:13] INFO: [VI_1] state changed: BACKUP -> MASTER
[2025-12-05 14:26:13] INFO: [VI_1] transitioning to MASTER state
[2025-12-05 14:26:13] INFO: [VI_1] adding virtual IPs
[2025-12-05 14:26:13] INFO: [VI_1] added VIP 192.168.1.100/32

验证 VIP 迁移:

# Node2 上执行
ip addr show eth0 | grep 192.168.1.100
# 应该能看到 VIP 已添加

# 从第三台机器 ping VIP应该不中断
ping 192.168.1.100

测试 4: 抢占测试

重新启动 Node1优先级更高

# Node1 上执行
sudo ./go-alived --config config-node1.yaml --debug

Node1 预期行为:

[2025-12-05 14:27:00] INFO: [VI_1] state changed: INIT -> BACKUP
[2025-12-05 14:27:03] INFO: [VI_1] master down timer expired, becoming master
[2025-12-05 14:27:03] INFO: [VI_1] state changed: BACKUP -> MASTER

Node2 预期行为 (检测到更高优先级后退位):

[2025-12-05 14:27:03] WARN: [VI_1] received higher priority advertisement, stepping down
[2025-12-05 14:27:03] INFO: [VI_1] state changed: MASTER -> BACKUP
[2025-12-05 14:27:03] INFO: [VI_1] transitioning to BACKUP state
[2025-12-05 14:27:03] INFO: [VI_1] removing virtual IPs
[2025-12-05 14:27:03] INFO: [VI_1] removed VIP 192.168.1.100/32

测试 5: 配置热加载

修改 Node1 配置文件,改变优先级:

priority: 80  # 从 100 改为 80

发送 SIGHUP 信号:

sudo pkill -SIGHUP go-alived

预期输出:

[2025-12-05 14:28:00] INFO: received SIGHUP, reloading configuration...
[2025-12-05 14:28:00] INFO: reloading VRRP configuration...
[2025-12-05 14:28:00] INFO: stopping all VRRP instances
[2025-12-05 14:28:00] INFO: loaded VRRP instance: VI_1
[2025-12-05 14:28:00] INFO: starting VRRP instance (VRID=51, Priority=80, Interface=eth0)
[2025-12-05 14:28:00] INFO: VRRP configuration reloaded successfully

网络抓包验证

使用 tcpdump 抓取 VRRP 报文:

# 抓取 VRRP 协议报文 (协议号 112)
sudo tcpdump -i eth0 -n proto 112

# 或者抓取组播地址
sudo tcpdump -i eth0 -n dst 224.0.0.18

预期输出:

14:25:55.123456 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s
14:25:56.123456 IP 192.168.1.10 > 224.0.0.18: VRRPv2, Advertisement, vrid 51, prio 100, authtype simple, intvl 1s

常见问题排查

1. 权限错误

failed to create raw socket: operation not permitted

解决: 使用 sudo 运行

2. 接口不存在

failed to get interface eth0: no such network interface

解决: 检查并修改配置文件中的 interface 字段为实际网卡名

ip link show  # 查看所有网卡

3. VIP 添加失败

failed to add VIP: file exists

解决: VIP 可能已存在,先删除:

sudo ip addr del 192.168.1.100/24 dev eth0

4. 无法接收 VRRP 报文

检查防火墙:

# Linux
sudo iptables -A INPUT -p 112 -j ACCEPT

# macOS
# 系统偏好设置 -> 安全性与隐私 -> 防火墙 -> 防火墙选项 -> 允许 go-alived

5. macOS 特定问题

macOS 不支持 SO_BINDTODEVICE,代码已自动兼容,但可能需要禁用防火墙:

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off

快速验证脚本

#!/bin/bash
# test-vrrp.sh

echo "=== VRRP 功能测试 ==="

# 1. 检查 VIP 是否添加
echo "1. 检查 VIP..."
ip addr show | grep "192.168.1.100" && echo "✓ VIP 已添加" || echo "✗ VIP 未添加"

# 2. 检查进程
echo "2. 检查进程..."
pgrep -f go-alived && echo "✓ 进程运行中" || echo "✗ 进程未运行"

# 3. 抓包 5 秒
echo "3. 抓取 VRRP 报文 (5秒)..."
timeout 5 sudo tcpdump -i eth0 -n proto 112 -c 5

# 4. Ping VIP
echo "4. Ping VIP..."
ping -c 3 192.168.1.100 && echo "✓ VIP 可达" || echo "✗ VIP 不可达"

echo "=== 测试完成 ==="

预期测试结果

通过标准:

  1. 双节点启动后,高优先级节点成为 MASTER
  2. MASTER 节点成功添加 VIP
  3. 停止 MASTER 后BACKUP 在 3 秒内接管
  4. VIP 无缝迁移ping 不中断
  5. 高优先级节点重启后成功抢占 MASTER
  6. 配置热加载正常工作
  7. tcpdump 能抓到周期性的 VRRP Advertisement 报文