MQTT-EMQX服务部署:Docker搭建高可用MQTT服务器、参数调优
EMQX服务部署Docker搭建高可用MQTT服务器、参数调优工欲善其事必先利其器。智慧农业项目要接入成百上千个传感器第一件事就是把 MQTT Broker 跑起来。本文带你用 Docker 五分钟搭好 EMQX再聊聊生产环境的调优和集群方案。一、EMQX简介EMQX 是一款国产开源的高性能 MQTT Broker基于 Erlang/OTP 平台开发。Erlang 天生就是为高并发和电信级可靠性设计的语言——当年爱立信用它扛住了整个电话交换网络拿来跑物联网消息那是绰绰有余。核心特性百万级连接单节点可支撑百万级 MQTT 连接集群可扩展到千万级全协议支持MQTT 3.1 / 3.1.1 / 5.0同时兼容 MQTT-SN、CoAP、LwM2M规则引擎内置 SQL 风格规则引擎无需写代码即可实现消息过滤、转换和路由数据桥接直接对接 MySQL、MongoDB、InfluxDB、Kafka、Redis 等管理 DashboardWeb 管理界面连接/主题/消息一目了然开源版(CE) vs 企业版(EE)功能开源版 CE企业版 EEMQTT 协议✅✅规则引擎✅ 基础版✅ 增强版Dashboard✅✅集群✅✅数据桥接基础数据源更多数据源 Kafka安全认证内置数据库/HTTP LDAP/Kerberos技术支持社区商业支持对于中小型智慧农业项目开源版 CE 完全够用。以下内容基于开源版展开。二、Docker快速部署EMQX2.1 docker-compose.yml 完整配置version:3.8services:emqx:image:emqx/emqx:5.4.0container_name:emqxrestart:unless-stoppedports:-1883:1883# MQTT 默认端口-8883:8883# MQTT over TLS-8083:8083# WebSocket-8084:8084# WebSocket over TLS-18083:18083# Dashboard 管理界面volumes:-emqx-data:/opt/emqx/data# 数据持久化-emqx-log:/opt/emqx/log# 日志持久化-./emqx.conf:/opt/emqx/etc/emqx.conf# 自定义配置environment:-EMQX_NAMEemqx-EMQX_HOST127.0.0.1-EMQX_DASHBOARD__DEFAULT_USERNAMEadmin-EMQX_DASHBOARD__DEFAULT_PASSWORDpublicnetworks:-emqx-netvolumes:emqx-data:emqx-log:networks:emqx-net:driver:bridge2.2 端口说明端口协议用途1883MQTT标准 MQTT 明文连接设备默认接入8883MQTT over TLS加密连接生产环境必用8083WebSocket浏览器端 MQTT 连接Web 大屏监控8084WebSocket over TLS加密 WebSocket 连接18083HTTPDashboard 管理界面注意生产环境务必关闭 1883 端口的外网访问仅开放 8883TLS加密防止明文传输被窃听。2.3 启动与验证# 启动docker-composeup-d# 查看日志dockerlogs-femqx# 验证 Dashboard# 浏览器访问 http://服务器IP:18083# 默认账号: admin / public首次登录后务必修改默认密码。三、EMQX Dashboard 管理界面Dashboard 是 EMQX 最直观的运维工具功能非常实在。3.1 概览面板首页一眼可见核心指标当前连接数在线设备总数主题数活跃 Topic 数量消息吞吐速率消息收发速率条/秒订阅数活跃订阅关系总数在农业场景中连接数应该约等于你部署的设备总数。如果连接数异常飙升可能是设备在疯狂重连如果骤降可能是网络故障。3.2 客户端管理可以查看所有在线客户端的详细信息Client ID、用户名、IP 地址Keep Alive 值、连接时间订阅的 Topic 列表支持手动踢下线调试时很有用排查设备问题时在这里搜索 Client ID 即可定位到具体设备。3.3 主题监控展示各 Topic 的消息流量统计帮你发现哪些 Topic 消息量最大。比如传感器数据上报 Topic 的消息量通常是最大的而控制指令 Topic 消息量很小但很重要。3.4 内置WebSocket客户端Dashboard 自带一个 WebSocket MQTT 客户端不用安装任何工具就能直接订阅 Topic、发布消息进行调试。在现场调试设备时用手机浏览器就能操作非常方便。四、核心参数调优默认配置能跑起来但要扛住大量设备连接必须调参。4.1 EMQX 应用层参数在emqx.conf中配置# TCP 接收器数量建议等于 CPU 核数 listener.tcp.external.acceptors 8 # 最大并发连接数根据设备规模设定 listener.tcp.external.max_connections 1000000 # 单连接最大订阅数 mqtt.max_subscriptions 0 # 0表示不限制 # 最大报文大小单位KB默认 1MB 够用 mqtt.max_packet_size 1024 # 允许的 QoS 等级 mqtt.max_qos 2 # 会话过期时间离线后保留会话的时长单位ms mqtt.session_expiry_interval 2h4.2 Erlang 虚拟机参数# Erlang 调度线程数建议等于 CPU 核数 node.schedulers 8 # 最大文件描述符数关键每个连接占一个 fd node.max_ports 20000004.3 系统级调优这是最容易被忽略的一步。Linux 默认的文件描述符限制只有 1024一个连接就占一个 fd根本撑不住上千设备。修改/etc/security/limits.conf* soft nofile 1048576 * hard nofile 1048576修改/etc/sysctl.conf网络参数# 增加最大文件描述符 fs.file-max 2097152 # TCP 缓冲区调优 net.core.rmem_max 16777216 net.core.wmem_max 16777216 net.ipv4.tcp_rmem 4096 87380 16777216 net.ipv4.tcp_wmem 4096 65536 16777216 # 加速 TIME_WAIT 状态回收 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 # 增加连接跟踪表大小 net.netfilter.nf_conntrack_max 1048576修改后执行sysctl -p生效并重启 EMQX 容器。五、集群部署单节点扛不住上集群。5.1 集群互发现方式EMQX 支持多种节点发现机制方式适用场景配置复杂度手动 (manual)节点固定、数量少低静态 (static)节点 IP 固定低etcd动态扩缩容中mcast (组播)同一局域网低推荐云上部署用静态方式节点 IP 固定自建机房可以用 etcd。5.2 静态集群配置示例3 节点集群每台机器的emqx.conf加上cluster.discovery static cluster.static.seeds emqx192.168.1.101,emqx192.168.1.102,emqx192.168.1.1035.3 集群下的订阅广播EMQX 集群中任意节点收到消息后会自动广播到其他节点的订阅者。也就是说设备连接到节点 A应用服务器订阅了节点 B消息照样能送达。对上层完全透明。六、智慧农业生产环境配置建议根据设备规模选择架构500个设备 → 单节点一个小型农场500 个传感器/控制器单节点 EMQX4核8G绰绰有余。消息吞吐不过几百条/秒压力很小。5000个设备 → 3节点集群中大型农业基地设备数量上万建议 3 节点集群部署。每个节点分担约三分之一的连接单节点故障时另外两个节点自动接管。数据持久化 → 规则引擎对接数据库生产环境不能让数据只留在内存里。用 EMQX 规则引擎将传感器数据自动写入时序数据库-- 规则引擎 SQL 示例SELECTpayload.temperatureastemp,payload.humidityashum,clientid,timestampFROMagriculture///sensor/然后配置数据桥接将结果写入 InfluxDB时序数据库适合存储传感器时间序列数据或 MySQL关系型数据库适合存储设备信息和告警记录。这样传感器数据上报后EMQX 会自动将其落库后端应用直接查数据库即可不需要额外写数据接收服务。总结EMQX 的部署本身不复杂Docker Compose 一把梭就起来了。但生产环境的关键在于参数调优——文件描述符、网络参数、连接数上限这些不调好设备量一上来就会出问题。记住先测压再上线。