当前位置: 移动技术网 > IT编程>开发语言>C/C++ > EMQX4.1.0集群搭建带redis认证_docker版

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

2020年09月28日  | 移动技术网IT编程  | 我要评论
一 、 环境说明环境 : 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

二、部署架构

image

这种部署模式下 EMQ X 单集群可轻松支持 100 万设备。

这里我们使用haproxy作为 LB。

EMQ X 默认开启的 MQTT 服务 TCP 端口:

端口说明
1883MQTT 协议端口
8883MQTT/SSL 端口
8083MQTT/WebSocket 端口
8084MQTT/WebSocket/SSL 端口
8081管理 API 端口
18083Dashboard 端口

防火墙根据使用的 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网