Docker Compose部署EMQX性能优化实战指南

1. 性能优化概述

EMQX作为一款高性能的MQTT消息服务器,在实际生产环境中通过Docker Compose部署时需要进行系统的性能优化。性能优化不仅涉及硬件资源配置,还包括网络调优、存储策略、集群配置等多个方面。本文将基于实际生产环境经验,提供一套完整的EMQX性能优化方案。

2. 环境准备与硬件优化

2.1 系统要求与硬件配置

组件最低配置推荐配置高性能配置
CPU2核4核8核及以上
内存4GB8GB16GB及以上
存储50GB HDD100GB SSD200GB NVMe
网络1Gbps10Gbps25Gbps
# 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环境中的性能可以得到显著提升。在实际部署过程中,建议根据具体的业务负载和硬件条件进行适当的参数调整,并通过持续的监控和测试来验证优化效果。


参考来源

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐