欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EMQX4.1.0集群搭建带redis认证_docker版

程序员文章站 2022-06-27 20:02:33
一 、 环境说明环境 : docker:18.03.1-ceEMQ X Broker版本 : 4.1.0-alpine集群发现策略 : static(静态节点列表自动集群)认证方式 : redis方式密码加密 : SHA256二、部署架构这种部署模式下 EMQ X 单集群可轻松支持 100 万设备。这里我们使用haproxy作为 LB。EMQ X 默认开启的 MQTT 服务 TCP 端口:端口说明1883MQTT 协议端口8883MQTT/SSL 端口...

一 、 环境说明

环境 : docker:18.03.1-ce

EMQ X Broker版本 : 4.1.0-alpine

集群发现策略 : static(静态节点列表自动集群)

认证方式 : redis方式

密码加密 : SHA256

二、部署架构

EMQX4.1.0集群搭建带redis认证_docker版

这种部署模式下 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集群

  1. 创建自定义网桥

    #创建网桥
    docker network create --subnet=172.30.0.0/24 emqx
    #列出网桥
    docker network list
    #查看指定网桥信息
    docker inspect emqx
    
  2. 在宿主机创建目录

    /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

  3. 在/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" \ 
    
  4. 在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

  5. 将认证账号密码写入redis,

    默认配置下示例数据如下:

    HMSET mqtt_user:emqx password 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    

    示例密码是经过sha256加密过的。启用 Redis 认证后,你可以通过用户名: emqx,密码:123456 连接。

  6. 分别在/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
    
  7. 查看集群状态

    docker exec -it <任意emqx容器id> sh -c "emqx_ctl cluster status"
    
  8. 通过emqx配置文件配置ACL

    分别将emqx容器中的acl.conf文件拷贝到宿主机挂载的/etc目录下

    示例:

    docker cp <容器ID>:/opt/emqx/etc/acl.conf /opt/emqx/node01/etc/
    

    修改宿主机acl.conf文件即可更改ACL规则。

四、Haproxy 负载均衡

  1. 运行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控制台:http://宿主机IP:11083。初始账号:admin 密码:public

    客户端通过连接 <Nginx宿主机 IP:1183> 地址,Nginx将连接负载到 EMQ X 节点.

五、测试

MQTT 5.0 桌面测试客户端:https://mqttx.app/

本文地址:https://blog.csdn.net/ninja_/article/details/108843767

相关标签: 物联网 java