EMQX集群问题

前情提要:现在是static自动发现,我使用mqttx命令行工具,通过请求前端nginx代理,请求了两个连接至后端两台Server。

这是节点A(10.88.78.184)的两个请求连接中的状态

这是节点B(10.88.78.84)两个请求的连接状态

问题1: netstat结果中这个是什么意思
10.88.78.84:1883 10.88.78.184:40864
10.88.78.84:1883 10.88.78.184:40848

问题2: netstat结果中的后边显示的端口40864和40848为什么和Web页面中客户端页显示的信息完全不同。
问题3: 我现在不知道怎么确定通过前端nginx请求的连接,实际是两台后端Server哪台请求的。因为两个后端Server都有显示同样的连接(实际是谁接收了请求呢),昨天使用netstat查看后还是没明白。
问题4: 当我停止其中一台EMQX服务,使用mqtt客户端请求一个请求后,再次将停止的服务开起来,要问的问题同问题2

你可以通过 netstat -nat 命令来查看命令输出的表头信息,前面的 10.88.78.84:1883 指的是服务端的地址和端口,后面的 10.88.78.184:40864 指的是客户端的地址和端口。

@bintong2689 你是把 Nginx 和 EMQX 部署在一个节点上?那么现在应该是 Nginx 监听 1883 端口,EMQX 监听的是其他的端口?这样的话你用 netstat 看到的就是 MQTT 客户端与 Nginx 的连接,EMQX 这边显示的是客户端的原始 IP,你可以看下监听器里面 proxy_protocol 这个选项有没有打开。

proxy_protocol 的解释可以看下以前的这篇帖子:就没有用nginx转发ws/wss配置proxy_protocol获取真实IP的案例吗 - #2,来自 heeejianbo

不,为了避免冲突,Nginx跑在8885,SSL nginx跑在8884. nginx.conf 8884和8885均代理后端两个节点的1883端口。proxy_protocol均是打开状态。我贴出配置文件
节点A
cluster {
name = emqxctl
discovery_strategy = static
}
listeners.tcp.default {
bind = “0.0.0.0:1883”
proxy_protocol = true
max_connections = 1024000
}

节点B
cluster {
name = emqxcl
discovery_strategy = static
}

listeners.tcp.default {
bind = “0.0.0.0:1883”
proxy_protocol = true
max_connections = 1024000

}

nginx.conf

stream {
log_format main '$remote_addr [$time_local] ’
'$protocol $status $bytes_sent $bytes_received ’
'$session_time “$upstream_addr” ’
‘“$upstream_bytes_sent” “$upstream_bytes_received” “$upstream_connect_time”’;

access_log  /var/log/nginx/tcp-access.log  main;

upstream mqtt_servers {
  least_conn; #连接数最少最被优先请求
    server 10.88.78.184:1883;
    server 10.88.78.84:1883;
}
server {
  listen 8885;
  proxy_pass mqtt_servers;
  proxy_protocol on;
  proxy_connect_timeout 10s;
  proxy_timeout 1800s;
  proxy_buffer_size 3M;
  tcp_nodelay on;
}

server {
listen 8884 ssl;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate /root/tongbb/mqtt_cert/emqx.pem;
    ssl_certificate_key /root/tongbb/mqtt_cert/emqx.key;
    ssl_verify_depth 2;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    proxy_pass mqtt_servers;
    proxy_protocol on; # 启用代理协议,启用此项时,对应后端Server配置文件emqx.conf中相关listenrs监听器选项启用 proxy_protocol = true
    proxy_connect_timeout 10s;
    proxy_timeout 1800s;
    proxy_buffer_size 4K;
    tcp_nodelay on;
}

}

那也对了,其实就是反一下,你 netstat 看到的是 Nginx 和 EMQX 的连接,然后 Dashboard 上显示的是客户端的原始 IP。

集群状态下,怎么才能确定是哪个后端Server处理了这个用户的请求呢

你可以在客户端列表点击客户端 ID 进入客户端详情页,里面会显示当前客户端连接的是哪一个节点的。