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

302 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# VRRP 功能测试指南
## 测试环境准备
### 1. 单机测试(使用虚拟网卡)
```bash
# 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)
```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)
```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:**
```bash
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:**
```bash
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:**
```bash
# 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
```bash
# 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 迁移:**
```bash
# Node2 上执行
ip addr show eth0 | grep 192.168.1.100
# 应该能看到 VIP 已添加
# 从第三台机器 ping VIP应该不中断
ping 192.168.1.100
```
### 测试 4: 抢占测试
重新启动 Node1优先级更高
```bash
# 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 配置文件,改变优先级:
```yaml
priority: 80 # 从 100 改为 80
```
发送 SIGHUP 信号:
```bash
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 报文:
```bash
# 抓取 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` 字段为实际网卡名
```bash
ip link show # 查看所有网卡
```
### 3. VIP 添加失败
```
failed to add VIP: file exists
```
**解决:** VIP 可能已存在,先删除:
```bash
sudo ip addr del 192.168.1.100/24 dev eth0
```
### 4. 无法接收 VRRP 报文
**检查防火墙:**
```bash
# Linux
sudo iptables -A INPUT -p 112 -j ACCEPT
# macOS
# 系统偏好设置 -> 安全性与隐私 -> 防火墙 -> 防火墙选项 -> 允许 go-alived
```
### 5. macOS 特定问题
macOS 不支持 `SO_BINDTODEVICE`,代码已自动兼容,但可能需要禁用防火墙:
```bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off
```
## 快速验证脚本
```bash
#!/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 报文