一、 环境规划
- 部署模式:单机多节点 Docker 集群
- 节点数量:3(node1、node2、node3)
- 集群发现策略:静态节点列表(static)
- 负载均衡器:Nginx(Stream 模块代理 TCP 流量)
二、 EMQX 集群部署
1. 目录准备与授权
1 2 3 4 5 6 7 8
| mkdir -p node1/data node1/logs mkdir -p node2/data node2/logs mkdir -p node3/data node3/logs
chown 1000 node1/ node2/ node3/ chown 1000 node1/data/ node1/logs/ chown 1000 node2/data/ node2/logs/ chown 1000 node3/data/ node3/logs/
|
2. Docker Compose 配置
创建 docker-compose.yml,保留原配置值,仅修正缩进与语法高亮:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| version: '3' services: emqx1: image: emqx:5.3.1 container_name: emqx1 environment: - "EMQX_NODE_NAME=emqx@node1.emqx.io" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node1.emqx.io ports: - 1883:1883 - 8083:8083 - 8084:8084 - 8883:8883 - 18083:18083 volumes: - /etc/localtime:/etc/localtime:ro - ./node1/logs:/opt/emqx/log - ./node1/data:/opt/emqx/data
emqx2: image: emqx:5.3.1 container_name: emqx2 environment: - "EMQX_NODE_NAME=emqx@node2.emqx.io" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node2.emqx.io ports: - 1873:1883 - 8073:8083 - 8074:8084 - 8873:8883 - 18073:18083 volumes: - /etc/localtime:/etc/localtime:ro - ./node2/logs:/opt/emqx/log - ./node2/data:/opt/emqx/data
emqx3: image: emqx:5.3.1 container_name: emqx3 environment: - "EMQX_NODE_NAME=emqx@node3.emqx.io" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node3.emqx.io ports: - 1863:1883 - 8063:8083 - 8064:8084 - 8863:8883 - 18063:18083 volumes: - /etc/localtime:/etc/localtime:ro - ./node3/logs:/opt/emqx/log - ./node3/data:/opt/emqx/data
networks: emqx-bridge: driver: bridge
|
3. 启动集群
三、 Nginx 负载均衡配置
1. 基础 TCP 代理策略
编辑 nginx.conf,使用 stream 模块代理 MQTT 流量:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
events { worker_connections 1024; }
stream { upstream emqx_tcp_cluster { server 10.10.1.100:1883 weight=1 max_fails=3 fail_timeout=30s; server 10.10.1.110:1873 weight=1 max_fails=3 fail_timeout=30s; server 10.10.1.120:1863 weight=1 max_fails=3 fail_timeout=30s; }
server { listen 1893; proxy_pass emqx_tcp_cluster; proxy_buffer_size 8k; tcp_nodelay on; } }
|
2. 扩展调度策略
根据业务需求替换 upstream 块配置:
- 随机轮询
1 2 3 4 5 6
| upstream emqx_tcp_cluster { random; server 10.10.1.100:1883; server 10.10.1.110:1873; server 10.10.1.120:1863; }
|
- 带权轮询
1 2 3 4 5
| upstream emqx_tcp_cluster { server 10.10.1.100:1883 weight=1; server 10.10.1.110:1873 weight=2; server 10.10.1.120:1863 weight=3; }
|
- 最小连接数
1 2 3 4 5 6
| upstream emqx_tcp_cluster { least_conn; server 10.10.1.100:1883; server 10.10.1.110:1873; server 10.10.1.120:1863; }
|
- IP Hash(会话保持)
1 2 3 4 5 6
| upstream emqx_tcp_cluster { ip_hash; server 10.10.1.100:1883; server 10.10.1.110:1873; server 10.10.1.120:1863; }
|
四、 验证与访问
- Dashboard 访问:
http://${ip}:18083
- 默认凭证:
admin / public(首次登录强制修改)
- 集群状态验证:进入任意容器执行
/opt/emqx/bin/emqx ctl cluster status,确认三节点状态为 running。
- 负载均衡验证:客户端连接
10.10.1.x:1893,查看 Nginx 访问日志或 EMQX Dashboard 连接分布。
五、 关键注意事项
- 节点间通过 Docker 自定义网络
emqx-bridge 通信,需确保 EMQX_CLUSTER__STATIC__SEEDS 中的域名解析正确。
- Nginx
stream 模块需编译时启用(官方默认包通常已包含)。
- 生产环境建议将
10.10.1.x 替换为实际宿主机 IP 或 Docker 网关 IP。
- 端口映射已做偏移处理(1883/1873/1863),避免宿主机端口冲突。