我有两台运行 BusyBox 的虚拟机(在 ESX 下)。这些机器仅用作负载平衡器。
我使用 pen 在每台机器上进行负载平衡,运行良好。但是当我启动 vrrpd 时,ping 可以工作,但其他操作都不起作用。
每个负载均衡器有 3 个接口。管理 IP 位于 eth0 上,eth1 用于第二个负载均衡器设置。
LBCO102A
10.3.16.96 - (eth0) Management IP
10.3.16.84 - (eth2) IP that pen uses
LBCO102B
10.3.16.94 - (eth0) Management IP
10.3.16.85 - (eth2) IP that pen uses
vrrpd 使用 10.3.16.58
在 LBCO102A 上,我使用以下命令启动 vrrpd:
vrrpd -i eth2 -v 58 -p 100 10.3.16.58
在 LBCO102B 上,我使用以下命令启动 vrrpd:
vrrpd -i eth2 -v 58 -p 50 10.3.16.58
我可以在端口 80 上毫无问题地连接到 IP 10.3.16.84 和 10.3.16.85。我可以毫无问题地连接到管理 IP 10.3.16.94 和 10.3.16.96。当我连接到 10.3.16.58 时,它超时了。/var/run/messages 文件中没有显示任何内容,除了一个是主服务器,另一个不是。
有人知道为什么 vrrpd 不推送除 ping 之外的流量吗?我有三个这样的设置。一个在 pop3 上,一个在 smtp 上,一个在 http 上。除了 ping 之外,它们都不起作用。
这是来自 LBCO102A 的 netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 10.3.16.107:110 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN
tcp 0 0 10.3.16.84:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8889 0.0.0.0:* LISTEN
tcp 0 0 10.3.16.107:110 10.3.17.30:53960 TIME_WAIT
tcp 0 0 10.3.16.96:22 10.3.30.154:1224 ESTABLISHED
tcp 0 0 10.3.16.107:110 10.3.17.30:54000 TIME_WAIT
tcp 0 0 10.3.16.107:110 10.3.17.30:54102 TIME_WAIT
tcp 0 0 10.3.16.107:110 10.3.17.30:54038 TIME_WAIT
tcp 0 0 10.3.16.107:110 10.3.17.30:53959 TIME_WAIT
tcp 0 0 10.3.16.107:110 10.3.17.30:54001 TIME_WAIT
tcp 0 0 10.3.16.107:110 10.3.17.30:54101 TIME_WAIT
tcp 0 0 10.3.16.96:22 10.3.30.154:1097 ESTABLISHED
tcp 0 0 10.3.16.107:110 10.3.17.30:54037 TIME_WAIT
raw 0 0 0.0.0.0:112 0.0.0.0:* 0
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 7 [ ] DGRAM 983 /tmp/log
unix 2 [ ] DGRAM 1156708
unix 2 [ ] DGRAM 1156657
unix 2 [ ] DGRAM 1156524
unix 2 [ ] DGRAM 192729
unix 2 [ ] DGRAM 994
这是来自 LBCO102B 的 netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN
tcp 0 0 10.3.16.85:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
tcp 0 0 10.3.16.94:22 10.3.30.154:1118 ESTABLISHED
raw 0 0 0.0.0.0:112 0.0.0.0:* 0
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 6 [ ] DGRAM 981 /tmp/log
unix 2 [ ] DGRAM 188253
unix 2 [ ] DGRAM 179316
unix 2 [ ] DGRAM 179306
unix 2 [ ] DGRAM 988
以下是我的启动脚本中的内容。(脚本中还有更多内容用于检查启动/停止/重启)LBCO103A
echo -n "Starting eth2: "
ifconfig eth2 10.3.16.84 netmask 255.255.255.0 up
echo "OK"
echo -n "Starting vrrp-ascossrs101: "
vrrpd -i eth2 -v 58 -p 100 10.3.16.58
echo "OK"
echo -n "Starting pen-ascossrs101: "
/bin/pen -C 8888 -X -l /var/log/ascossrs101.log -p /var/log/ascossrs101.pid 10.3.16.84:80 10.3.16.56:80 10.3.16.57:80
echo "OK"
LBCO102B
echo -n "Starting eth2: "
ifconfig eth2 10.3.16.85 netmask 255.255.255.0 up
echo "OK"
echo -n "Starting vrrp-ascossrs101: "
vrrpd -i eth2 -v 58 -p 100 10.3.16.58
echo "OK"
echo -n "Starting pen-ascossrs101: "
/bin/pen -C 8888 -X -l /var/log/ascossrs101.log -p /var/log/ascossrs101.pid 10.3.16.85:80 10.3.16.56:80 10.3.16.57:80
echo "OK"
答案1
我没有用过笔,所以我不太清楚它是如何工作的,但也许能帮上忙。
您能运行 netstat -an 并提供输出吗?我猜 pen 绑定到了 eth2 IP,而不是盒子上的所有地址。它应该配置为 0.0.0.0,这样它就可以获取盒子拥有的任何地址,或者应该运行 vrrpd masterscript 以使 pen 绑定到您的 VIP。可能发生的情况是 masterscript 必须启动 pen 本身,并且已经配置为期望 vip 绑定到您的 eth2 接口。
现在使用 netstat 输出进行编辑:好的,问题是这样的:LBCO102A tcp 0 0 10.3.16.84:80 0.0.0.0:* LISTEN
10.3.16.84:80 意味着您仅绑定到 10.3.16.84 的 80 端口,因此即使服务器有 VIP,它也不会监听 10.3.16.58 的 80 端口。
再次重申,我对 pen 并不是很熟悉,但假设传递的第一个 IP 地址是绑定:/bin/pen -C 8888 -X -l /var/log/ascossrs101.log -p /var/log/ascossrs101.pid 10.3.16.84:80 10.3.16.56:80 10.3.16.57:80 可能是 /bin/pen -C 8888 -X -l /var/log/ascossrs101.log -p /var/log/ascossrs101.pid 0.0.0.0:80 10.3.16.56:80 10.3.16.57:80
0.0.0.0:80 意味着绑定到盒子上的所有地址和所有接口。
另一种选择可能是使用:/bin/pen -C 8888 -X -l /var/log/ascossrs101.log -p /var/log/ascossrs101.pid 10.3.16.58:80 10.3.16.56:80 10.3.16.57:80
但是,我怀疑这是否会按原样工作,因为当程序启动时,VM 将没有该 IP 地址,因此 pen 将无法明确绑定到它。我尝试查看 vrrpd 的文档,我不确定它是否可以做到这一点,但 freevrrp 有一个 masterscript 选项,它基本上会在接管 VIP 时运行脚本。因此,您只需添加启动 pen 的命令作为 masterscript 的一部分,这样当盒子接管 VIP 时,它将启动 pen 并将其绑定到 VIP IP 地址。
答案2
好的,我认为现在一切都正常了。这是我从@Kevin 那里得到的东西和我在网上找到的东西的组合(网上关于 vrrpd 的信息很少)。
看来 vrrpd 触发会告诉服务器监听 IP,因此您不想使用 IP 启动接口。接口确实需要有 IP,但不是 vrrp 将使用的 IP。
我的下一个问题是,我让 pen 运行在与 vrrpd 运行的 IP 不同的 IP 上。我最终让 pen 在所有 IP 上的端口 80 上列出所有连接。如果您不这样做,那么如果 pen 启动并且机器不是主负载平衡器,pen 就会死机,因为它要查找的 IP 不存在。
我已将其设置为 pen 监听另一个 IP 地址,并假设 vrrpd 是其前面的另一个负载均衡器。结果发现 vrrpd 只是启动 IP 然后关闭它。
因此,总结一下我最终的结果。
LBCO102A
10.3.16.96 - eth0 (Management IP)
10.3.16.148 - eth1
LBCO102B
10.3.16.94 - eth0 (Management IP)
10.3.16.149 - eth1
那么两台机器上的vrrpd都配置10.3.16.58这个地址,两台机器上的pen都配置0.0.0.0。
还有更多测试要做,但我一直在调试模式下运行 pen,并密切关注 /var/run/messages 文件,如果我在主动节点上重新启动 vrrpd,它就会变为被动节点,而新的主动节点会开始显示流量。时间会证明一切,但看起来很有希望。
答案3
这只是猜测。您可能将其与同一子网上有两个接口混淆了。您可以尝试为管理网络创建一个单独的子网。