EMQX 5.0 企业版部署实战:Docker Compose 3节点集群搭建与千万连接压测 EMQX 5.0 企业版三节点集群实战从Docker Compose部署到千万级连接压测1. 企业级MQTT集群架构设计在物联网爆发式增长的今天单节点MQTT代理已无法满足大规模设备连接需求。EMQX 5.0企业版作为专为物联网设计的分布式MQTT消息服务器其集群架构具有以下核心优势无单点故障采用无主(leaderless)架构所有节点对等线性扩展支持动态增加节点提升处理能力数据分区通过分布式哈希表(DHT)实现主题空间分片会话持久化集群共享会话状态确保设备重连不丢失集群节点间通信采用Mria分布式数据库(基于Raft改进)进行元数据同步消息转发则通过直接路由机制避免中间跳转。这种混合架构在保证一致性的同时将消息延迟控制在毫秒级。2. Docker Compose集群部署2.1 环境准备部署三节点集群需要准备至少4GB内存的Linux服务器Docker 20.10和Docker Compose 2.0开放端口1883(MQTT)、4369(EPMD)、5370(集群RPC)# 验证Docker环境 docker --version docker-compose version # 创建专用网络 docker network create emqx-net2.2 编写docker-compose.ymlversion: 3 services: emqx1: image: emqx/emqx-enterprise:5.0.0 container_name: emqx-node1 environment: - EMQX_NODE_NAMEemqxnode1 - EMQX_CLUSTER__DISCOVERY_STRATEGYstatic - EMQX_CLUSTER__STATIC__SEEDSemqxnode1,emqxnode2,emqxnode3 networks: - emqx-net ports: - 1883:1883 - 8081:8081 - 8083:8083 - 8084:8084 - 8883:8883 - 18083:18083 volumes: - ./node1_data:/opt/emqx/data emqx2: image: emqx/emqx-enterprise:5.0.0 container_name: emqx-node2 environment: - EMQX_NODE_NAMEemqxnode2 - EMQX_CLUSTER__DISCOVERY_STRATEGYstatic - EMQX_CLUSTER__STATIC__SEEDSemqxnode1,emqxnode2,emqxnode3 networks: - emqx-net volumes: - ./node2_data:/opt/emqx/data emqx3: image: emqx/emqx-enterprise:5.0.0 container_name: emqx-node3 environment: - EMQX_NODE_NAMEemqxnode3 - EMQX_CLUSTER__DISCOVERY_STRATEGYstatic - EMQX_CLUSTER__STATIC__SEEDSemqxnode1,emqxnode2,emqxnode3 networks: - emqx-net volumes: - ./node3_data:/opt/emqx/data networks: emqx-net: external: true关键配置说明EMQX_NODE_NAME节点唯一标识格式为emqxhostnameCLUSTER__DISCOVERY_STRATEGY集群发现机制生产环境推荐DNS或K8SCLUSTER__STATIC__SEEDS静态种子节点列表2.3 启动与验证集群# 启动集群 docker-compose up -d # 查看节点状态 docker exec -it emqx-node1 emqx_ctl cluster status # 预期输出 Cluster status: #{running_nodes [emqxnode1,emqxnode2,emqxnode3]}通过Dashboard(http://localhost:18083)可直观查看集群拓扑和节点负载情况。建议配置负载均衡器将MQTT流量均匀分发到各节点。3. 集群调优与生产配置3.1 关键性能参数编辑各节点的/opt/emqx/etc/emqx.conf# 连接层优化 listeners.tcp.default { max_connections 1000000 acceptors 16 } # 会话管理 session { max_awaiting_rel 1000 upgrade_qos true } # 消息吞吐 zone { external { mqueue_priorities none mqueue_default_priority highest } }3.2 持久化与高可用配置PostgreSQL作为共享订阅数据存储-- 创建数据库 CREATE DATABASE emqx_cluster; CREATE USER emqx WITH PASSWORD securepassword; -- 配置EMQX bridges.postgresql.1 { server postgres:5432 database emqx_cluster pool_size 8 }3.3 安全加固# 生成TLS证书 openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365 # 配置MQTTS listeners.ssl.default { bind 0.0.0.0:8883 certfile /opt/emqx/etc/certs/cert.pem keyfile /opt/emqx/etc/certs/key.pem }4. 千万级连接压测实战4.1 压测工具选型工具语言特点适用场景emqtt-benchErlang原生支持EMQX低开销极限压力测试JMeterJava图形化界面丰富插件复杂场景模拟MQTTx CLIGo简单易用快速验证推荐使用emqtt-bench进行大规模连接测试# 启动100万个连接每秒新增5000个 ./emqtt_bench conn -c 1000000 -i 0.2 -h loadbalancer.example.com4.2 压测场景设计场景一纯连接测试目标验证集群最大连接数参数100万客户端QoS 01KB心跳间隔监控指标TCP连接数、内存占用场景二消息吞吐测试目标评估消息处理能力参数50万发布者50万订阅者100字节消息监控指标消息速率、端到端延迟场景三故障转移测试目标验证集群容错性操作随机停止1个节点观察会话恢复4.3 监控与指标收集配置Prometheus监控# prometheus.yml scrape_configs: - job_name: emqx static_configs: - targets: [node1:18083,node2:18083,node3:18083]关键监控指标emqx_connections_count当前连接数emqx_messages_received消息接收速率erlang_vm_memory_total内存使用量erlang_vm_system_counts_process_countErlang进程数4.4 压测结果分析典型性能数据3节点集群16核32GB配置场景连接数消息速率(msg/s)平均延迟CPU负载纯连接1,200,000--65%发布订阅500,000850,00012ms85%故障转移-恢复时间3s--资源消耗对比节点数内存(GB)网络吞吐(Mbps)持久化延迟128950单点风险39/节点2800500ms5. 生产环境最佳实践5.1 集群扩展策略垂直扩展优先提升单节点资源(CPU/内存)水平扩展当连接数50万/节点时考虑增加节点分区部署跨可用区部署提高容灾能力5.2 客户端优化建议# Python示例使用持久会话 client mqtt.Client(client_iddevice001, clean_sessionFalse) client.connect(broker.example.com, keepalive60) # 启用自动重连 client.reconnect_delay_set(min_delay1, max_delay120)5.3 常见问题排查连接不稳定检查Keepalive设置(建议≥60s)验证网络MTU大小(避免分片)监控TCP重传率消息堆积调整mqueue_len参数增加消费者数量检查订阅者QoS等级匹配内存增长限制max_inflight消息数启用offline_message清理监控长时间离线的持久会话