首页 / 资讯中心 / 文章详情

Docker部署EMQX企业版:MQTT物联网消息中间件实践

Docker部署EMQX企业版:MQTT物联网消息中间件实践 ★ FEATURED ARTICLE
1. 项目概述MQTT与EMQX的核心价值MQTTMessage Queuing Telemetry Transport作为轻量级的物联网通信协议已经成为设备互联的事实标准。其发布/订阅模式、低带宽消耗和QoS分级等特性特别适合物联网场景下的设备通信。而EMQX作为开源企业级MQTT消息中间件凭借其高并发连接处理能力单节点支持500万连接和毫秒级消息转发延迟在车联网、工业物联网等领域广泛应用。本次搭建将基于Docker环境部署EMQX 6.2.2企业版相比社区版企业版提供了更完善的数据集成、规则引擎和集群管理功能。选择Docker部署方式主要基于三点考虑环境隔离性避免与宿主机环境产生依赖冲突部署便捷性官方镜像已包含所有运行时依赖可移植性方便后续迁移到Kubernetes等编排系统2. 环境准备与基础部署2.1 Docker环境配置建议在开始前建议对Docker环境进行以下优化配置以Ubuntu 22.04为例# 调整Docker日志驱动和存储限制 sudo tee /etc/docker/daemon.json EOF { log-driver: json-file, log-opts: {max-size: 10m, max-file: 3}, storage-driver: overlay2, storage-opts: [size50GB] } EOF # 应用配置并重启服务 sudo systemctl restart docker注意生产环境建议单独挂载数据盘到/var/lib/docker目录避免系统盘空间耗尽2.2 单节点部署实操通过以下命令获取并运行EMQX镜像# 拉取指定版本镜像国内用户可添加--registry-mirror参数加速 docker pull emqx/emqx-enterprise:6.2.2 # 运行容器建议使用host网络模式提升性能 docker run -d \ --name emqx \ --hostname emqx-node1 \ --network host \ -e EMQX_NODE_NAMEemqxnode1.emqx.com \ -v /data/emqx/data:/opt/emqx/data \ -v /data/emqx/log:/opt/emqx/log \ emqx/emqx-enterprise:6.2.2关键参数说明--network host使用主机网络模式避免NAT带来的性能损耗挂载卷包含/opt/emqx/data持久化Mnesia数据库存储订阅关系等/opt/emqx/log日志文件存储环境变量EMQX_NODE_NAME节点命名格式必须为emqxhostname验证服务状态docker exec -it emqx emqx_ctl status正常应返回Node emqxnode1.emqx.com is started3. 集群化部署方案3.1 静态集群配置对于生产环境建议使用3-5节点组成集群保证高可用。以下是docker-compose.yml示例version: 3 services: emqx1: image: emqx/emqx-enterprise:6.2.2 hostname: node1.emqx.com environment: EMQX_NODE_NAME: emqxnode1.emqx.com EMQX_CLUSTER__DISCOVERY_STRATEGY: static EMQX_CLUSTER__STATIC__SEEDS: emqxnode1.emqx.com,emqxnode2.emqx.com networks: emqx-net: ipv4_address: 172.22.1.10 volumes: - ./node1_data:/opt/emqx/data emqx2: image: emqx/emqx-enterprise:6.2.2 hostname: node2.emqx.com environment: EMQX_NODE_NAME: emqxnode2.emqx.com EMQX_CLUSTER__DISCOVERY_STRATEGY: static EMQX_CLUSTER__STATIC__SEEDS: emqxnode1.emqx.com,emqxnode2.emqx.com networks: emqx-net: ipv4_address: 172.22.1.11 volumes: - ./node2_data:/opt/emqx/data networks: emqx-net: driver: bridge ipam: config: - subnet: 172.22.1.0/24启动集群docker-compose up -d docker exec -it emqx1 emqx_ctl cluster status3.2 网络调优建议对于跨主机的集群通信需要调整内核参数# 调整TCP缓冲区大小 echo net.core.rmem_default262144 /etc/sysctl.conf echo net.core.wmem_default262144 /etc/sysctl.conf echo net.ipv4.tcp_keepalive_time600 /etc/sysctl.conf # EMQX特定优化 echo net.ipv4.tcp_max_syn_backlog10240 /etc/sysctl.conf echo fs.file-max 2097152 /etc/sysctl.conf sysctl -p4. 安全配置实践4.1 基础认证配置修改etc/plugins/emqx_auth_mnesia.conf# 密码加密方式 auth.mnesia.password_hash sha256 # 默认用户启动后应立即修改 auth.user.1.username admin auth.user.1.password public auth.user.1.is_superuser true通过REST API创建新用户curl -X POST -u admin:public \ -H Content-Type: application/json \ -d {username:iot_user, password:Str0ngPss, is_superuser:false} \ http://127.0.0.1:18083/api/v5/authentication/password_based:built_in_database/users4.2 TLS加密配置生成自签名证书openssl req -x509 -newkey rsa:4096 \ -keyout key.pem -out cert.pem \ -days 365 -nodes -subj /CNemqx.example.com配置etc/emqx.conflisteners.ssl.default { bind 0.0.0.0:8883 max_connections 102400 ssl_options { keyfile /etc/emqx/certs/key.pem certfile /etc/emqx/certs/cert.pem cacertfile /etc/emqx/certs/cacert.pem } }5. 客户端连接测试5.1 使用MQTTX工具测试安装MQTTX客户端wget https://github.com/emqx/MQTTX/releases/download/v1.9.3/mqttx-1.9.3.AppImage chmod x mqttx-1.9.3.AppImage连接参数示例地址emqx.example.com端口1883非加密/8883SSL用户名/密码iot_user/Str0ngPss5.2 压力测试方法使用emqtt-bench工具docker run -it --rm emqx/emqtt-bench \ conn -h emqx.example.com -p 1883 -u iot_user -P Str0ngPss -c 5000 -i 10参数说明-c 5000模拟5000个并发连接-i 10每隔10秒建立一个新连接6. 运维监控方案6.1 Prometheus监控配置启用Prometheus插件docker exec -it emqx emqx_ctl plugins load emqx_prometheus配置etc/plugins/emqx_prometheus.confprometheus.export.interval 15 prometheus.push_gateway.server http://prometheus:90916.2 关键监控指标指标名称说明告警阈值emqx_connections_count当前连接数 80%最大连接数emqx_messages_received每分钟接收消息数突增300%emqx_deliver_duration消息投递延迟(ms)P99 500msemqx_system_memory_used内存使用率 85%7. 常见问题排查7.1 连接失败排查流程检查防火墙规则iptables -L -n | grep 1883验证端口监听状态docker exec -it emqx netstat -tulnp | grep 1883查看客户端错误日志docker logs --since 5m emqx | grep -i auth7.2 性能问题优化典型性能瓶颈及解决方案CPU高负载调整etc/emqx.conf中的listener.tcp.external.acceptors增加vm.args中的S参数如S 4:4表示4个调度器内存增长过快# 限制容器内存 docker update --memory 2G --memory-swap 4G emqx消息堆积调整persistent_session_store的max_retain_seconds启用delayed插件处理延迟消息8. 生产环境建议经过多年实践总结出以下经验要点存储规划使用SSD存储Mnesia数据预留5倍消息量的磁盘空间定期清理data/mnesia/*中的旧数据集群部署奇数节点数量3/5/7跨可用区部署使用专有网络避免公网通信版本升级# 蓝绿升级步骤 docker-compose -f docker-compose-new.yml up -d docker-compose -f docker-compose-old.yml stop备份策略# 每日定时备份配置和数据 tar czvf emqx-bak-$(date %F).tar.gz \ /data/emqx/data /data/emqx/etc实际部署中曾遇到过一个典型案例某客户在高峰期出现连接抖动最终发现是默认的TCP缓冲区大小不足导致。通过调整net.ipv4.tcp_mem和net.core.rmem_max参数后连接稳定性得到显著改善。这提醒我们MQTT服务的稳定运行不仅取决于软件配置更需要系统级的调优配合。
阅读完成 · 觉得有帮助?
咨询建站