我对此还很陌生,所以请耐心等待。
我的设置基本上是使用 mqtt 的三台设备,通过两个都运行 emqx 的代理进行连接。两个 emqx 代理也应该设置为 haproxy 负载均衡器,并配备 keepalived,以防其中一个发生故障。
代理 1 的 IP 是 192.168.1.201
代理 2 的 IP 地址是 192.168.1.202
keepalived的虚拟IP是192.168.1.200
haproxy.cfg 是
frontend emqx_tcp
bind *:1883
option tcplog
mode tcp
default_backend emqx_tcp_back
backend emqx_tcp_back
balance roundrobin
server emqx_node_1 192.168.1.201:1883 check
server emqx_node_2 192.168.1.202:1883 check
keepalived.conf 是
global_defs {
lvs_id haproxy01
}
vrrp_sync_group SyncGroup01 {
group {
VI_1
}
}
vrrp_script chkhaproxy {
script "/usr/bin/killall -0 haproxy"
script "/usr/sbin/service haproxy start"
interval 9
timeout 3
weight 20
rise 2
fall 4
}
vrrp_instance VI_1 {
interface eth0 # interface to monitor
state MASTER
virtual_router_id 51 # Assign one ID for this route
priority 101 # 101 on MASTER, 100 on BACKUP
advert_int 5
authentication {
auth_type PASS
auth_pass password
}
virtual_ipaddress {
192.168.1.200 # the virtual IP
}
track_script {
chkhaproxy
}
}
问题是,我似乎无法让 haproxy 或 keepalived 按预期工作。当我让代理 1 仅运行 haproxy(keepalived 未运行)并从客户端直接连接到代理 1 的 IP 地址时,它似乎只会将连接转发到代理 2。它似乎无法连接到代理 1(是的,我检查过它们都已启动。如果只有代理 2 启动,客户端就不会连接)。经过一番挖掘,我认为可能是因为 haproxy 和代理使用相同的 IP。所以我尝试使用来自 keepalived 的虚拟 IP。但尝试之后,我发现我甚至无法连接到虚拟 IP。客户端在尝试连接时会给我错误“OSError:[Errno 113] 没有到主机的路由”。
我错过了什么?
编辑:使用 tailf /var/log/syslog 跟踪日志后,结果如下
2 月 7 日 14:56:19 pi01 Keepalived_healthcheckers[10453]: 打开文件‘/etc/keepalived/keepalived.conf’。
2 月 7 日 14:56:19 pi01 Keepalived_healthcheckers[10453]: 未知关键字‘lvs_id’
2 月 7 日 14:56:19 pi01 Keepalived_vrrp[10454]: 默认接口 eth0 不存在且未指定接口。跳过静态地址 192.168.1.200。
2 月 7 日 14:56:19 pi01 Keepalived_vrrp[10454]: 无法加载 ipset 库 - libipset.so.3: 无法打开共享对象文件: 没有此文件或目录
2 月 7 日 14:56:19 pi01 Keepalived_vrrp[10454]: VRRP_Instance(VI_1) 未知接口 ! 2 月 7 日 14:56:19 pi01 Keepalived_healthcheckers[10453]: 使用 LinkWatch 内核 netlink 反射器...
2 月 7 日 14:56:20 pi01 Keepalived_vrrp[10454]: 已停止
2 月 7 日 14:56:20 pi01 Keepalived[10450]: Keepalived_vrrp 因永久错误 CONFIG 退出。正在终止
2月7日 14:56:20 pi01 Keepalived[10450]: 正在停止
2 月 7 日 14:56:20 pi01 Keepalived_healthcheckers[10453]:已停止
2月 7日 14:56:25 pi01 Keepalived[10450]: 已停止 Keepalived v1.3.2 (2016年12月25日)
它似乎在使用“LinkWatch kernel netlink reflector”时始终失败
答案1
第一个问题:HAProxy 配置为监听 emqx 使用的同一端口上的所有接口。这会给您带来麻烦。
如果您希望 keepalived/haproxy 监听器使用相同的端口,请为其设置特定的 NIC,或者让 HAProxy 和 emqx 监听不同的端口。
一旦完成上述操作,就该查看 Keepalived 了。我最好的建议是跟踪日志。确保主路由器和备份路由器之间的路由器 ID 相同,并且备份路由器的优先级低于主路由器。坦率地说,我记不清是否必须允许交换机中的 mac 欺骗或类似功能才能使 VRRP(keepalived 使用的协议)正常工作。