Docker Compose部署EMQX性能优化实战
·
Docker Compose部署EMQX性能优化实战指南
1. 性能优化概述
EMQX作为一款高性能的MQTT消息服务器,在实际生产环境中通过Docker Compose部署时需要进行系统的性能优化。性能优化不仅涉及硬件资源配置,还包括网络调优、存储策略、集群配置等多个方面。本文将基于实际生产环境经验,提供一套完整的EMQX性能优化方案。
2. 环境准备与硬件优化
2.1 系统要求与硬件配置
| 组件 | 最低配置 | 推荐配置 | 高性能配置 |
|---|---|---|---|
| CPU | 2核 | 4核 | 8核及以上 |
| 内存 | 4GB | 8GB | 16GB及以上 |
| 存储 | 50GB HDD | 100GB SSD | 200GB NVMe |
| 网络 | 1Gbps | 10Gbps | 25Gbps |
# docker-compose.yml - 资源限制配置示例
services:
emqx:
image: emqx/emqx:5.6.1
container_name: emqx_optimized
deploy:
resources:
limits:
cpus: '4'
memory: 8G
reservations:
cpus: '2'
memory: 4G
environment:
- EMQX_NODE_NAME=emqx@172.28.0.10
- EMQX_NODE__COOKIE=emqx_cluster_cookie_2026
2.2 内核参数优化
针对Ubuntu系统,需要进行内核参数调优以支持高并发连接:
# 编辑系统参数配置文件
sudo tee -a /etc/sysctl.conf << EOF
# 增加文件描述符限制
fs.file-max = 1000000
# 网络连接优化
net.core.somaxconn = 10240
net.ipv4.tcp_max_syn_backlog = 10240
net.core.netdev_max_backlog = 10240
# TCP连接优化
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_fin_timeout = 30
# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 2
EOF
# 应用配置
sudo sysctl -p
3. Docker Compose配置优化
3.1 网络配置优化
services:
emqx:
image: emqx/emqx:5.6.1
container_name: emqx_optimized
networks:
emqx_net:
ipv4_address: 172.28.0.10
# 使用host网络模式以获得最佳网络性能(可选)
# network_mode: "host"
networks:
emqx_net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
3.2 存储性能优化
services:
emqx:
image: emqx/emqx:5.6.1
volumes:
# 使用SSD存储挂载数据和日志
- /opt/emqx-cluster/data:/opt/emqx/data:rw
- /opt/emqx-cluster/log:/opt/emqx/log:rw
# 挂载自定义配置文件
- ./emqx.conf:/opt/emqx/etc/emqx.conf:ro
# 禁用不需要的插件以减少资源消耗
- ./disabled_plugins:/opt/emqx/data/disabled_plugins:ro
4. EMQX核心参数优化
4.1 连接与会话优化
environment:
# 连接相关优化
- EMQX_LISTENER__TCP__DEFAULT__MAX_CONNECTIONS=1000000
- EMQX_LISTENER__SSL__DEFAULT__MAX_CONNECTIONS=500000
- EMQX_LISTENER__WS__DEFAULT__MAX_CONNECTIONS=100000
# 会话与消息优化
- EMQX_SESSION__MAX_SUBSCRIBIONS=1000
- EMQX_SESSION__UPGRADE_QOS=off
- EMQX_SESSION__MAX_INFLIGHT=100
- EMQX_SESSION__RETRY_INTERVAL=30s
- EMQX_SESSION__MAX_AWAITING_REL=100
- EMQX_SESSION__AWAIT_REL_TIMEOUT=300s
# 消息持久化优化
- EMQX_PERSISTENT_MESSAGE_STORAGE=on
- EMQX_PERSISTENT_MESSAGE_BUFFER_SIZE=1024MB
- EMQX_PERSISTENT_MESSAGE_INDEX_BUFFER_SIZE=128MB
4.2 内存与GC优化
environment:
# Erlang VM内存优化
- EMQX_VM__PROCESS_LIMIT=2097152
- EMQX_VM__MAX_PORTS=1048576
- EMQX_VM__IO_THREAD_POOL_SIZE=64
# GC参数优化
- EMQX_VM__GC_AFTER_BYTES=128MB
- EMQX_VM__GC_INTERVAL=15000
- EMQX_VM__GC_FULLSWEEP_AFTER=1000
5. 集群配置优化
5.1 集群发现与通信优化
environment:
# 集群发现策略优化
- EMQX_CLUSTER__DISCOVERY_STRATEGY=static
- EMQX_CLUSTER__STATIC__SEEDS=[emqx@172.28.0.10,emqx@172.28.0.11,emqx@172.28.0.12]
# 集群RPC优化
- EMQX_RPC__MODE=async
- EMQX_RPC__ASYNC_BATCH_SIZE=1000
- EMQX_RPC__PORT_DISCOVERY=manual
- EMQX_RPC__TCP_CLIENT_PORT=5369
- EMQX_RPC__TCP_SERVER_PORT=5369
# 分布式通信优化
- EMQX_NODE__DIST_BUFFER_SIZE=32MB
- EMQX_NODE__DIST_LISTEN_MIN=5369
- EMQX_NODE__DIST_LISTEN_MAX=5369
5.2 集群负载均衡配置
# 负载均衡器配置示例(Nginx)
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "1883:1883"
- "8083:8083"
- "18083:18083"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- emqx1
- emqx2
- emqx3
emqx1:
# ... 节点1配置
emqx2:
# ... 节点2配置
emqx3:
# ... 节点3配置
6. 监控与日志优化
6.1 性能监控配置
environment:
# 开启Prometheus监控
- EMQX_PROMETHEUS__ENABLE=true
- EMQX_PROMETHEUS__IP=0.0.0.0
- EMQX_PROMETHEUS__PORT=18084
# 日志级别优化
- EMQX_LOG__LEVEL=warning
- EMQX_LOG__HANDLERS__DEFAULT__LEVEL=warning
- EMQX_LOG__HANDLERS__FILE__ENABLE=true
- EMQX_LOG__HANDLERS__FILE__LEVEL=warning
# 系统监控
- EMQX_SYSTEM_MONITOR__ENABLE=true
- EMQX_SYSTEM_MONITOR__VM_CHECK_INTERVAL=30s
- EMQX_SYSTEM_MONITOR__PROCESS_CHECK_INTERVAL=30s
6.2 日志轮转配置
# 创建日志管理脚本
cat > /opt/emqx-cluster/logrotate.sh << 'EOF'
#!/bin/bash
# 日志轮转配置
find /opt/emqx-cluster/log -name "*.log" -mtime +7 -exec rm {} \;
find /opt/emqx-cluster/log -name "*.log.*" -mtime +30 -exec rm {} \;
EOF
chmod +x /opt/emqx-cluster/logrotate.sh
7. 安全与访问控制优化
7.1 TLS/SSL性能优化
environment:
# TLS性能优化
- EMQX_LISTENER__SSL__DEFAULT__ENABLE=false
- EMQX_LISTENER__WSS__DEFAULT__ENABLE=false
- EMQX_LISTENER__TCP__DEFAULT__PROXY_PROTOCOL=false
# 如果启用TLS,使用以下优化配置
- EMQX_LISTENER__SSL__DEFAULT__CIPHERS=ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384
- EMQX_LISTENER__SSL__DEFAULT__HANDSHAKE_TIMEOUT=15s
- EMQX_LISTENER__SSL__DEFAULT__DEPTH=10
7.2 访问控制列表优化
# 创建优化的ACL配置文件
cat > /opt/emqx-cluster/acl.conf << 'EOF'
# 性能优化的ACL规则
{allow, {user, "admin"}, all, ["$SYS/#", "#"]}.
# 限制客户端订阅频率
{allow, all, subscribe, ["${clientid}/#", "sensor/+/data"]}.
# 拒绝大规模主题订阅
{deny, all, subscribe, ["#"]}.
# 允许控制消息
{allow, all, publish, ["$SYS/brokers/+/clients/+/connected"]}.
{allow, all, publish, ["$SYS/brokers/+/clients/+/disconnected"]}.
EOF
8. 实际性能测试与调优
8.1 压力测试配置
# 压力测试服务配置
services:
emqx-bench:
image: emqx/emqx-bench:latest
depends_on:
- emqx1
- emqx2
environment:
- EMQX_BENCH_HOST=emqx1,emqx2
- EMQX_BENCH_PORT=1883
- EMQX_BENCH_CLIENTS=10000
- EMQX_BENCH_COUNT=1000000
- EMQX_BENCH_QOS=1
- EMQX_BENCH_SIZE=256
command: >
sh -c "
emqx_bench pub -h emqx1 -p 1883 -c 1000 -I 10 -t bench/test -s 256 &
emqx_bench sub -h emqx2 -p 1883 -c 1000 -t bench/test &
wait"
8.2 性能监控脚本
#!/bin/bash
# 实时性能监控脚本
monitor_emqx() {
while true; do
echo "=== EMQX 性能监控 $(date) ==="
# 连接数监控
CONNECTIONS=$(docker exec emqx1 emqx_ctl stats | grep connections.count | awk '{print $2}')
echo "当前连接数: $CONNECTIONS"
# 内存使用监控
MEMORY_USAGE=$(docker stats emqx1 --no-stream --format "{{.MemUsage}}" | awk '{print $1}')
echo "内存使用: $MEMORY_USAGE"
# CPU使用监控
CPU_USAGE=$(docker stats emqx1 --no-stream --format "{{.CPUPerc}}")
echo "CPU使用: $CPU_USAGE"
# 消息吞吐量
MSG_RATE=$(docker exec emqx1 emqx_ctl stats | grep messages.rate | awk '{print $2}')
echo "消息速率: $MSG_RATE msg/s"
sleep 5
done
}
monitor_emqx
9. 生产环境部署建议
9.1 高可用架构
# 多节点高可用配置
services:
emqx1:
image: emqx/emqx:5.6.1
container_name: emqx_node1
environment:
- EMQX_NODE_NAME=emqx@node1
- EMQX_CLUSTER__DISCOVERY_STRATEGY=dns
- EMQX_CLUSTER__DNS__NAME=emqx-cluster
- EMQX_CLUSTER__DNS__APP=emqx
deploy:
replicas: 1
placement:
constraints:
- node.labels.emqx==node1
emqx2:
image: emqx/emqx:5.6.1
container_name: emqx_node2
environment:
- EMQX_NODE_NAME=emqx@node2
- EMQX_CLUSTER__DISCOVERY_STRATEGY=dns
- EMQX_CLUSTER__DNS__NAME=emqx-cluster
- EMQX_CLUSTER__DNS__APP=emqx
deploy:
replicas: 1
placement:
constraints:
- node.labels.emqx==node2
9.2 备份与恢复策略
#!/bin/bash
# EMQX数据备份脚本
backup_emqx() {
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/emqx-backup/$TIMESTAMP"
mkdir -p $BACKUP_DIR
# 备份配置文件
docker cp emqx1:/opt/emqx/etc $BACKUP_DIR/
# 备份数据文件
docker cp emqx1:/opt/emqx/data $BACKUP_DIR/
# 备份插件配置
docker cp emqx1:/opt/emqx/plugins $BACKUP_DIR/
echo "备份完成: $BACKUP_DIR"
}
# 定期备份
0 2 * * * /opt/scripts/backup_emqx.sh
通过以上系统化的性能优化配置,EMQX在Docker Compose环境中的性能可以得到显著提升。在实际部署过程中,建议根据具体的业务负载和硬件条件进行适当的参数调整,并通过持续的监控和测试来验证优化效果。
参考来源
更多推荐
所有评论(0)