介绍:
我有以下负载平衡配置:10.0.1.31 - lb
10.0.1.32 - node1(tomcat + mysql)10.0.1.33 - node2(tomcat + mysql)
我正在使用 keepalived,它将数据包重定向到活动节点 - 共享 IP 地址是 10.0.1.35
当然 lb 有必需的配置:
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
要正确处理传入的数据包,node1 和 node2 需要在 lo 上有 10.0.1.35
[root@lb-node1 ~]# ip addr list dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 10.0.1.35/32 scope global lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
问题:
由于我们在 lo 上有 10.0.1.35,如果语言环境 tomcat 尝试通过 lb 连接到 mysql - 则会建立与本地实例的连接。
我希望 skipp lo 用于传出数据包
测试
从已禁用 mysql 服务和 lo 接口上的 10.0.1.35 ip 的 node1,我正尝试连接到 node2 上的 mysql
远程登录 10.0.1.35 3306
不幸的是结果是
[root@lb-node1 ~]# telnet 10.0.1.35 3306
Trying 10.0.1.35...
telnet: connect to address 10.0.1.35: Connection refused
当然,如果我从 lo 接口中删除 10.0.1.35 IP,我就可以连接到 node2 上的 mysql 实例
解决方案 ?
我尝试添加具有适当指标的路线,但没有帮助 :/
[root@lb-node1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.1.0 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
10.0.1.0 0.0.0.0 255.255.255.255 UH 100 0 0 lo
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
0.0.0.0 10.0.1.1 0.0.0.0 UG 0 0 0 eth0