如何让 haproxy 和 keepalived 在与 emqx 代理相同的设备上工作

如何让 haproxy 和 keepalived 在与 emqx 代理相同的设备上工作

我对此还很陌生,所以请耐心等待。

我的设置基本上是使用 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 使用的协议)正常工作。

相关内容