1. 为什么选择EMQX作为MQTT服务器第一次接触物联网项目时我被各种MQTT服务器搞得眼花缭乱。试过Mosquitto、VerneMQ等方案后最终选择了EMQX原因很简单——它就像物联网领域的瑞士军刀。EMQX用Erlang语言开发天生具备高并发处理能力单机就能轻松支撑50万的设备连接这在物联网场景中特别实用。记得去年给一个智能农业项目部署时客户需要在1秒内处理上千个温湿度传感器的数据。当时用Mosquitto测试CPU直接飙到90%换成EMQX后资源占用稳定在30%左右。这得益于它的集群架构设计节点间通过分布式Erlang通信延迟可以控制在毫秒级。安装过程也比想象中简单。官方提供了各种包管理器的支持在Ubuntu上一条apt-get命令就能搞定。不过我最推荐还是下载ZIP包手动安装这样能灵活控制版本和安装路径。下面这个命令我用了不下20次wget https://www.emqx.com/zh/downloads/broker/latest/emqx-5.0.3-el8-amd64.zip2. 从零开始安装EMQX2.1 环境准备在CentOS 8上部署时我踩过最大的坑就是依赖问题。EMQX需要Erlang运行时但系统自带的版本经常不兼容。现在我的标准操作流程是这样的# 先装基础编译工具 sudo yum install -y make gcc gcc-c perl # 关键是要装对openssl版本 sudo yum install -y openssl11 openssl11-devel有一次客户服务器在内网没法直接yum安装。我就把依赖包都下载好打成离线包用下面的方法手动安装# 离线安装openssl1.1 tar xzf openssl-1.1.1g.tar.gz cd openssl-1.1.1g ./config --prefix/usr/local/openssl --openssldir/usr/local/openssl make make install2.2 实际安装步骤解压后别急着启动先检查下文件权限。有次遇到emqx console报错就是因为解压时用了sudo导致运行时权限冲突。正确的姿势是unzip emqx-5.0.3-el8-amd64.zip chmod -R 755 emqx cd emqx ./bin/emqx start启动后立即检查状态是个好习惯./bin/emqx_ctl status如果看到Node is running就说明成功了。不过我更习惯用这个命令查看详细状态./bin/emqx_ctl cluster status3. 必须掌握的配置技巧3.1 性能调优三件套在etc/emqx.conf里这三个参数我每次必改zone.external.max_connections 1000000 zone.external.max_packet_size 10MB listener.tcp.external.backlog 1024第一个参数控制最大连接数默认值5万对物联网场景根本不够用。第二个是单条消息大小处理图片或视频数据时要调大。第三个是TCP连接队列高并发场景下不调这个会丢连接。3.2 安全配置清单生产环境一定要改这些配置# 禁用匿名访问 allow_anonymous false # 启用ACL acl_nomatch deny # 开启SSL listener.ssl.external 8883 listener.ssl.external.keyfile etc/certs/key.pem listener.ssl.external.certfile etc/certs/cert.pem有次客户服务器被挖矿排查发现就是因为没关匿名访问。后来我写了个自动配置脚本现在部署时都会跑一遍sed -i s/allow_anonymous true/allow_anonymous false/ etc/emqx.conf4. 监控与问题排查4.1 必备监控指标通过Dashboard默认端口18083要重点看这些指标连接数增长率消息吞吐量最活跃的TOPIC系统负载我习惯用PrometheusGrafana做监控EMQX自带Prometheus插件在etc/plugins/emqx_prometheus.conf启用就行prometheus.export.interval 15 prometheus.push_gateway_server http://localhost:90914.2 常见问题处理遇到客户端频繁断开时先用这个命令查连接状态./bin/emqx_ctl clients list如果发现大量CONNECT但没PUBLISH的连接很可能是客户端没正确处理心跳。这时要检查listener.tcp.external.keepalive 300内存泄漏是另一个常见问题。Erlang虚拟机内存管理很特别用这个命令看真实内存占用./bin/emqx_ctl vm_memory5. 高级集群配置5.1 跨机房部署方案在三个地域部署集群时我推荐这种节点命名方式# 华东节点 ./bin/emqx start --name emqxsh1 # 华北节点 ./bin/emqx start --name emqxbj1 # 华南节点 ./bin/emqx start --name emqxsz1然后用手动组网方式建立集群./bin/emqx_ctl cluster join emqxsh15.2 网络分区处理遇到过最头疼的问题是网络分区。现在我的解决方案是cluster.autoclean 5m cluster.autoheal on同时配合心跳检测cluster.discovery static cluster.static.seeds emqxsh1,emqxbj1,emqxsz16. 实战经验分享去年给物流公司做车载物联网平台时遇到消息积压问题。最后发现是默认的QoS设置不合理大量消息在服务端重传。解决方案是在etc/emqx.conf调整zone.external.max_inflight 100 zone.external.retry_interval 10s还有个坑是主题通配符滥用。有客户用#订阅所有主题导致服务器压力暴增。后来我们制定了主题规范设备级主题device/{clientid}/data分组主题group/{groupid}/command系统级主题$SYS/brokers/status最后说个性能优化技巧。在32核服务器上通过调整Erlang调度器可以获得20%性能提升export EMQX_SCHEDULERS_FORCE_WAKEUP_INTERVAL100 ./bin/emqx start