wip v1.0.0
This commit is contained in:
301
TESTING.md
Normal file
301
TESTING.md
Normal file
@@ -0,0 +1,301 @@
|
||||
# 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 报文
|
||||
Reference in New Issue
Block a user