两个节点集群,用MQTTX连接第一次总是失败,第二次才能连接上

环境

  • EMQX 版本:4.4.11
  • 操作系统版本:Centos7.9 ,虚拟机上 zip 安装方式启动

重现此问题的步骤

  1. 两台虚拟机+Haproxy 部署,配置如下(参考与官方配置,截取部分),集群部署好之后,管理端登录正常
##----------------------------------------------------------------
## global 2021/04/05
##----------------------------------------------------------------
global
    log stdout format raw daemon debug
    # Replace 1024000 with deployment connections
    maxconn 102400
    nbproc 1
    nbthread 2
    cpu-map auto:1/1-2 0-1
    tune.ssl.default-dh-param 2048
    ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP
    # Enable the HAProxy Runtime API
    # e.g. echo "show table emqx_tcp_back" | sudo socat stdio tcp4-connect:172.100.239.4:9999
    stats socket :9999 level admin expose-fd listeners

##----------------------------------------------------------------
## defaults
##----------------------------------------------------------------
defaults
    log global
    mode tcp
    option tcplog
    # Replace 1024000 with deployment connections
    maxconn 102400
    timeout connect 30000
    timeout client 600s
    timeout server 600s

##----------------------------------------------------------------
## API
##----------------------------------------------------------------
frontend emqx_mgmt
   mode tcp
   option tcplog
   bind *:28083
   default_backend emqx_mgmt_back

frontend emqx_dashboard
   mode tcp
   option tcplog
   bind *:28083
   default_backend emqx_dashboard_back

backend emqx_mgmt_back
    mode http
    # balance static-rr
    server emqx1 192.168.181.83:18083
    server emqx2 192.168.181.190:18083

backend emqx_dashboard_back
    mode http
    # balance static-rr
    server emqx1 192.168.181.83:18083
    server emqx2 192.168.181.190:18083

##----------------------------------------------------------------
## public
##----------------------------------------------------------------
frontend emqx_tcp
   mode tcp
   option tcplog
   bind *:2883
   # Reject connections that have an invalid MQTT packet
   # tcp-request content reject unless { req.payload(0,0), mqtt_is_valid }
   default_backend emqx_tcp_back

backend emqx_tcp_back
    mode tcp

    # Create a stick table for session persistence
    stick-table type string len 32 size 100k expire 30m

    # Use ClientID / client_identifier as persistence key
    stick on req.payload(0,0),mqtt_field_value(connect,client_identifier)

    server emqx1 192.168.181.83:1883 check-send-proxy send-proxy-v2
    server emqx2 192.168.181.190:1883 check-send-proxy send-proxy-v2

  1. MQTTX 进行连接测试,第一次连不上,再次点击连接可成功,断开后又连接不上(135连接不上,246可以连接上),能连上的都集中在节点2
  • 节点情况:(无相关连接错误日志)


3. 测试连接半个小时左右,集群出现异常,连接不上,查看后有一个节点变成未启动了,还在的那台查看集群状态变成只有一个了,stop 那边为空,管理端也登不上,返回错误501

image

  • 节点情况:(集群异常无相关日志)

+节点2:

问题
  1. 135 连接失败,246成功这个是否配置哪里写的不对呢?我看emq日志处无相关连接失败的错误
  2. 在一段时间之后,节点1会因为连接不上而导致中断?日志我看了也没有报错,集群异常只能重启两个节点,这个是否和问题1有关系?

节点 1 有 crash 日志吗?

你好,log 文件夹下日志只有上面的那些,你说的crash 日志是要如何看?还是要开启什么?
后续我有再次尝试,就算是没有进行连接请求,一段时间之后也是节点1就掉了,查看集群状态stop 也没有

crash 日志在 log 目录下。节点 1 如果不加入集群仅仅单节点启动也会一段时候后停掉吗?

经过验证,是节点1那台服务器的问题,zip 解压安装,直接./emqx start 启动的,正常来说这个是后台运行的进程吧,但是在节点服务器上,当启动完成后,退出终端连接,这个emqx 也跟着退出了,在其他服务器不会。
这个问题算是解决了吧,目前已经把集群组起来了。

但是新问题出现了:
之前单节点jmeter测试的,模拟客户端连接在我这边电脑上能达到4k个(可能我自己笔记本性能的最大值),但是现在集群了之后,模拟3000客户端就有一部分连接不上了,我看日志,只有在节点1出现错误,如下:



这个日志看不太懂,不知道是否是连接不上的相关报错,能帮忙分析下原因吗? 负载均衡haproxy的配置还是和上面的一样,就节点1换了一台。

看起来是 CPU 占用太高了,你可以看下资源占用情况。

你测试场景是什么?仅连接还是连接后订阅?连接频率和订阅的主题内容、主题数量都是多少?这些都会影响性能。

集群环境下订阅性能会弱于单节点,因为订阅信息还需要在集群中同步。

测试的是连接数和发送的消息流入,暂时没有订阅,后续订阅消费的后续再测,现在这个连接数问题一直解决不了,再次测试,发现在服务器性能上cpu都没有超,节点 1 ,2 最高到40%,这个日志错误代表是cpu过高吗?和连接不上是否有关系呢?而且这个错误只出现在节点1,节点2不会,负载均衡部署在节点2的服务器上面。
现在这个问题定位不到是什么造成的,都无从下手,不知道从哪里去修改配置,服务器性能应该是能撑住的。能帮忙分析下吗? :pray:

你是不是配置了规则引擎?目前配置了什么规则呀?

有配置一个,动作的检查


目前把这个规则禁用了,报错不会了,连接数还是部分连不上,我haproxy 那边的配置maxcon 是102400,应该是没有限制连接的,jmeter 那边连接返回的错误的501 没连接上。请教下还有没办法能定位这个连接不上的原因?haproxy 日志都是这种也看不太懂。没有报错

你有根据 系统调优 文档优化过系统参数吗?

按照性能调优调了,还是不能解决连接失败问题,模拟3000个。有差不多500个连接不上,当节点没出现过这个问题,集群出现了,两个节点都按照性能调优调整了,能方便远程看下吗‘?

你这个不至于啊,你发布频率、发布的消息大小都是多少?除了规则引擎以外,还使用了哪些功能?目前日志中有没有其它警告或者报错日志?尽量描述得详细一点。

jmeter 模拟3000线程,也就是3000个连接,消息就一个json 不大,然后有使用了一个主题统计功能,日志没有任何警告以上的错误。
刚刚,为了抓日志,我只连接,不发送,还是有7个连不上,日志没有报错,
jmeter :(已禁用循环控制器)



EMQX:(本次只测试连接)


节点1日志emqx.log.1,
节点2日志:emqx.log.5:
emqx.zip (376.2 KB)

有没有这种可能,负载均衡那边就没弄好?被拦截了?所以返回501?
但是负载均衡那边除了参考官方的配置,其他都没有动,是再说找不到问题。

你把日志等级从 debug 改成 warning 再试试?高频的日志也会比较占用 CPU 的。你连接速率设置是多少?

最开始就是warning 什么都没有打印,连接速率就是 1s 创建3000个并发连接

你把连接速率降下来再试试

@t1ger 1 2 3 4秒都有出现连接不上问题,5s 的不会,那这个能判断出是负载均衡器的问题不?还有什么能排查定位问题的方法呢

你不走 LB 直接连 EMQX 节点试试?

两个集群,不通过LB吗?直接连1883端口?配置那边 proxy=off 关闭(如果不关闭无法通过1883接入),也还是出现连接失败问题。所有客户端都只连接到其中一个节点(没有负载均衡),日志也只有出现这些。

我的意思是不走 LB 然后手动将连接分摊到两个节点上。这样就可以定位问题发生在哪个环节上了。