一 、 环境说明
环境 : docker:18.03.1-ce
EMQ X Broker版本 : 4.1.0-alpine
集群发现策略 : static(静态节点列表自动集群)
认证方式 : redis方式
密码加密 : SHA256
二、部署架构
这种部署模式下 EMQ X 单集群可轻松支持 100 万设备。
这里我们使用haproxy作为 LB。
EMQ X 默认开启的 MQTT 服务 TCP 端口:
端口 | 说明 |
---|---|
1883 | MQTT 协议端口 |
8883 | MQTT/SSL 端口 |
8083 | MQTT/WebSocket 端口 |
8084 | MQTT/WebSocket/SSL 端口 |
8081 | 管理 API 端口 |
18083 | Dashboard 端口 |
防火墙根据使用的 MQTT 接入方式,开启上述端口的访问权限。
EMQ X 节点集群使用的 TCP 端口:
端口 | 说明 |
---|---|
4369 | 集群节点发现端口 (EPMD) |
4370 | 集群节点发现端口 |
5369 | 集群节点 PRC 通道 |
6369 | 集群节点控制通道 |
集群节点间如有防护墙,需开启上述 TCP 端口互访权限。
三、部署emqx集群
-
创建自定义网桥
#创建网桥 docker network create --subnet=172.30.0.0/24 emqx #列出网桥 docker network list #查看指定网桥信息 docker inspect emqx
-
在宿主机创建目录
/opt
├── data
│ └── appendonly.aof
├── emqx
│ ├── node01
│ │ ├── data
│ │ ├── etc
│ │ │ └── acl.conf
│ │ └── log
│ ├── node02
│ │ ├── data
│ │ ├── etc
│ │ │ └── acl.conf
│ │ └── log
│ └── node03
│ ├── data
│ ├── etc
│ │ └── acl.conf
│ └── log
└── haproxy
└── haproxy.cfg -
在/opt目录下启动redis容器
docker run -d -p 6379:6379 -v $PWD/data:/data --name emqx_redis --network emqx --ip 172.30.0.104 redis:6.0.8-alpine redis-server --appendonly yes --requirepass "123456"
-
在redis中进行acl配置
## 格式 HSET mqtt_acl:[username clientid] [topic] [access] ## 结构 redis> hgetall mqtt_acl:emqx topic1 1
默认配置下示例数据:
HSET mqtt_acl:<username> topic1 1 HSET mqtt_acl:<username> topic2 2 HSET mqtt_acl:<username> topic3 3
NOTE: 1: subscribe, 2: publish, 3: pubsub
-
将认证账号密码写入redis,
默认配置下示例数据如下:
HMSET mqtt_user:emqx password 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
示例密码是经过sha256加密过的。启用 Redis 认证后,你可以通过用户名: emqx,密码:123456 连接。
-
分别在/opt/emqx/node01、/opt/emqx/node02、/opt/emqx/node03目录下启动emqx容器
docker run -d --name emqx_node01 -p 18083:18083 -p 1883:1883 -p 4369:4369 -p 8084:8084 -p 7083:8083 -e EMQX_NAME="emqx_node01" -e EMQX_HOST=172.30.0.101 -e EMQX_JOIN__CLUSTER="emqx_node01@172.30.0.101" -e EMQX_CLUSTER__DISCOVERY="static" -e EMQX_LISTENER__TCP__EXTERNAL=1883 -e EMQX_LOADED_PLUGINS="emqx_auth_redis,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" -e EMQX_AUTH__REDIS__SERVER="172.30.0.104:6379" -e EMQX_AUTH__REDIS__PASSWORD="123456" -e EMQX_AUTH__REDIS__PASSWORD_HASH=sha256 -e EMQX_ALLOW_ANONYMOUS=false -e EMQX_CLUSTER__STATIC__SEEDS="emqx_node01@172.30.0.101,emqx_node02@172.30.0.102,emqx_node03@172.30.0.103" -e PLATFORM_ETC_DIR=/home/emqx/etc -e PLATFORM_LOG_DIR=/home/emqx/log -e PLATFORM_DATA_DIR=/home/emqx/data --mount type=bind,source="$(pwd)"/etc,target=/home/emqx/etc --mount type=bind,source="$(pwd)"/data,target=/home/emqx/data --mount type=bind,source="$(pwd)"/log,target=/home/emqx/log --network emqx --ip 172.30.0.101 emqx/emqx:v4.1.0-alpine-amd64
emqx_node02
docker run -d --name emqx_node02 -p 18084:18083 -p 1884:1883 -p 4370:4369 -p 8085:8084 -p 7084:8083 -e EMQX_NAME="emqx_node02" -e EMQX_HOST=172.30.0.102 -e EMQX_JOIN__CLUSTER="emqx_node02@172.30.0.102" -e EMQX_CLUSTER__DISCOVERY="static" -e EMQX_LISTENER__TCP__EXTERNAL=1883 -e EMQX_LOADED_PLUGINS="emqx_auth_redis,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" -e EMQX_AUTH__REDIS__SERVER="172.30.0.104:6379" -e EMQX_AUTH__REDIS__PASSWORD="123456" -e EMQX_AUTH__REDIS__PASSWORD_HASH=sha256 -e EMQX_ALLOW_ANONYMOUS=false -e EMQX_CLUSTER__STATIC__SEEDS="emqx_node01@172.30.0.101,emqx_node02@172.30.0.102,emqx_node03@172.30.0.103" -e PLATFORM_ETC_DIR=/home/emqx/etc -e PLATFORM_LOG_DIR=/home/emqx/log -e PLATFORM_DATA_DIR=/home/emqx/data --mount type=bind,source="$(pwd)"/etc,target=/home/emqx/etc --mount type=bind,source="$(pwd)"/data,target=/home/emqx/data --mount type=bind,source="$(pwd)"/log,target=/home/emqx/log --network emqx --ip 172.30.0.102 emqx/emqx:v4.1.0-alpine-amd64
emqx_node03
docker run -d --name emqx_node03 -p 18085:18083 -p 1885:1883 -p 4371:4369 -p 8086:8084 -p 7085:8083 -e EMQX_NAME="emqx_node03" -e EMQX_HOST=172.30.0.103 -e EMQX_JOIN__CLUSTER="emqx_node02@172.30.0.103" -e EMQX_CLUSTER__DISCOVERY="static" -e EMQX_LISTENER__TCP__EXTERNAL=1883 -e EMQX_LOADED_PLUGINS="emqx_auth_redis,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" -e EMQX_AUTH__REDIS__SERVER="172.30.0.104:6379" -e EMQX_AUTH__REDIS__PASSWORD="123456" -e EMQX_AUTH__REDIS__PASSWORD_HASH=sha256 -e EMQX_ALLOW_ANONYMOUS=false -e EMQX_CLUSTER__STATIC__SEEDS="emqx_node01@172.30.0.101,emqx_node02@172.30.0.102,emqx_node03@172.30.0.103" -e PLATFORM_ETC_DIR=/home/emqx/etc -e PLATFORM_LOG_DIR=/home/emqx/log -e PLATFORM_DATA_DIR=/home/emqx/data --mount type=bind,source="$(pwd)"/etc,target=/home/emqx/etc --mount type=bind,source="$(pwd)"/data,target=/home/emqx/data --mount type=bind,source="$(pwd)"/log,target=/home/emqx/log --network emqx --ip 172.30.0.103 emqx/emqx:v4.1.0-alpine-amd64
-
查看集群状态
docker exec -it <任意emqx容器id> sh -c "emqx_ctl cluster status"
-
通过emqx配置文件配置ACL
分别将emqx容器中的acl.conf文件拷贝到宿主机挂载的/etc目录下
示例:
docker cp <容器ID>:/opt/emqx/etc/acl.conf /opt/emqx/node01/etc/
修改宿主机acl.conf文件即可更改ACL规则。
四、Haproxy 负载均衡
-
运行Haproxy
docker run -d -p 1183:1183 -p 11083:11083 --name emqx_haproxy --network emqx --ip 172.30.0.105 haproxy:2.1-alpine
因为Haproxy镜像中没有haproxy.cfg配置文件,第一次会启动失败。
将宿主机haproxy.cfg文件拷贝到容器中。
docker cp haproxy.cfg <容器ID>:/usr/local/etc/haproxy/
将以下配置放入haproxy.cfg中
backend emqx_tcp_back balance roundrobin server emqx_node_1 192.168.56.104:1883 check server emqx_node_2 192.168.56.104:1884 check server emqx_node_3 192.168.56.104:1885 check backend emqx_dashboard_back balance roundrobin server emqx_node_1 192.168.56.104:18083 check server emqx_node_2 192.168.56.104:18084 check server emqx_node_3 192.168.56.104:18085 check frontend emqx_tcp bind *:1183 option tcplog mode tcp default_backend emqx_tcp_back frontend emqx_dashboard bind *:11083 option tcplog mode tcp default_backend emqx_dashboard_back
Dashboard控制台:https://宿主机IP:11083。初始账号:admin 密码:public
客户端通过连接 <Nginx宿主机 IP:1183> 地址,Nginx将连接负载到 EMQ X 节点.
五、测试
MQTT 5.0 桌面测试客户端:https://mqttx.app/
c/c++开发分享EMQX4.1.0集群搭建带redis认证_docker版地址:https://blog.csdn.net/ninja_/article/details/108843767
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/597466.html