wip v1.0.0

This commit is contained in:
loveuer
2025-12-08 22:23:45 +08:00
commit bece440c47
35 changed files with 4893 additions and 0 deletions

301
TESTING.md Normal file
View 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 报文