一、前言背景
由于公司產(chǎn)品發(fā)展需要,需要一款消息推送的服務(wù),通過網(wǎng)上查詢資料,以及將來在Iot方面的應(yīng)用前景,隧選定使用EMQ服務(wù)。
二、EMQX集群搭建
為了方便,所有的按照搭建都是在docker容器環(huán)境下進行的,使用docker-compose進行的服務(wù)管理
EMQX靜態(tài)模式集群搭建開始
廢話不多說,各種心酸流程略過……docker-compose.yml配置文件如下

三、為增加EMQX集群增加Redis認證
首先在上面的配置文件中,增加redis認證的配置

四、為emqx集群增加haproxy代理
配置詳解:

注意:這里使用的haproxy鏡像是有ssl證書的,官方鏡像上我沒有找到,是自己構(gòu)建的一個鏡像,在構(gòu)建這個鏡像過程中,遇到很多問題,也是由于第一次構(gòu)建鏡像,經(jīng)驗不足,在進行docker build過程中,總是報I/0異常,換了阿里的鏡像源和科大的都還是不行,但是鏡像運行起來后,進入鏡像然后執(zhí)行apk update等是沒有問題,所以我中這種方式構(gòu)建了一個新的ssl鏡像。
haproxy代理配置詳解:



五、查看haproxy監(jiān)控平臺和訪問emqx的dashboard
訪問:http://localhost:8404/haproxy?stats? 用戶名/密碼:admin/password

訪問emqx的控制臺:http://localhost:18083

六、完整配置文件如下:
version: '3'
services:
? emqx1:
? ? image: emqx/emqx:v4.0.0
? ? environment:
? ? - "EMQX_NAME=emqx"
? ? - "EMQX_HOST=node1.emqx.io"
? ? - "EMQX_CLUSTER__DISCOVERY=static"
? ? - "EMQX_CLUSTER__STATIC__SEEDS=emqx@node1.emqx.io,emqx@node2.emqx.io"
? ? - "EMQX_LOADED_PLUGINS=emqx_auth_redis,emqx_recon,emqx_rule_engine,emqx_retainer,emqx_management,emqx_dashboard"
? ? - "EMQX_ALLOW_ANONYMOUS=false"
? ? - "EMQX_AUTH__REDIS__SERVER=emqx_redis:6379"
? ? - "EMQX_AUTH__REDIS__DATABASE=0"
? ? - "EMQX_AUTH__REDIS__PASSWORD=123456"
? ? - "EMQX_AUTH__REDIS__PASSWORD_HASH=salt,sha256"
? ? - "EMQX_AUTH__REDIS__AUTH_CMD=HMGET mqtt_user:%u password salt"
? ? - "EMQX_ZONE__EXTERNAL__RETRY_INTERVAL=2s"
? ? - "EMQX_MQTT__MAX_TOPIC_ALIAS=10"
? ? - "EMQX_MQTT__MAX_PACKET_SIZE=1MB"
? ? security_opt:
? ? ? ? - apparmor=unconfined
? ? healthcheck:
? ? ? test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
? ? ? interval: 5s
? ? ? timeout: 25s
? ? ? retries: 5
? ? depends_on:
? ? - emqx_redis
? ? networks:
? ? ? emqx-bridge:
? ? ? ? aliases:
? ? ? ? - node1.emqx.io
? emqx2:
? ? image: emqx/emqx:v4.0.0
? ? environment:
? ? - "EMQX_NAME=emqx"
? ? - "EMQX_HOST=node2.emqx.io"
? ? - "EMQX_CLUSTER__DISCOVERY=static"
? ? - "EMQX_CLUSTER__STATIC__SEEDS=emqx@node1.emqx.io,emqx@node2.emqx.io"
? ? - "EMQX_LOADED_PLUGINS=emqx_auth_redis,emqx_recon,emqx_rule_engine,emqx_retainer,emqx_management,emqx_dashboard"
? ? - "EMQX_ALLOW_ANONYMOUS=false"
? ? - "EMQX_AUTH__REDIS__SERVER=emqx_redis:6379"
? ? - "EMQX_AUTH__REDIS__DATABASE=0"
? ? - "EMQX_AUTH__REDIS__PASSWORD=123456"
? ? - "EMQX_AUTH__REDIS__PASSWORD_HASH=salt,sha256"
? ? - "EMQX_AUTH__REDIS__AUTH_CMD=HMGET mqtt_user:%u password salt"
? ? - "EMQX_ZONE__EXTERNAL__RETRY_INTERVAL=2s"
? ? - "EMQX_MQTT__MAX_TOPIC_ALIAS=10"
? ? - "EMQX_MQTT__MAX_PACKET_SIZE=1MB"
? ? security_opt:
? ? ? ? - apparmor=unconfined
? ? healthcheck:
? ? ? test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
? ? ? interval: 5s
? ? ? timeout: 25s
? ? ? retries: 5
? ? depends_on:
? ? - emqx_redis
? ? networks:
? ? ? emqx-bridge:
? ? ? ? aliases:
? ? ? ? - node2.emqx.io
? emqx_redis:
? ? image: redis:latest
? ? ports:
? ? - 6379:6379
? ? security_opt:
? ? ? ? - apparmor=unconfined
? ? volumes:
? ? ? - /media/liuzk/本地磁盤2/docker-container/redis/emqx_redis/data:/data:rw
? ? command: redis-server --appendonly yes --requirepass "123456"
? ? networks:
? ? ? - emqx-bridge
? emqx_haproxy:
? ? image: ssl-haproxy-2.3:latest
? ? security_opt:
? ? ? - apparmor=unconfined
? ? ports:
? ? ? - 1883:1883
? ? ? - 8404:8404
? ? ? - 8883:8883
? ? ? - 18083:18083
? ? volumes:
? ? ? - ./haproxy:/usr/local/etc/haproxy:ro
? ? depends_on:
? ? - emqx1
? ? - emqx2
? ? networks:
? ? ? - emqx-bridge
networks:
? emqx-bridge:
? ? driver: bridge
haproxy配置文件如下:
global
? log 127.0.0.1? local0
? log 127.0.0.1? local1 notice
? user root
? group root
? daemon
listen admin_stats
? stats enable
? bind *:8404
? mode http
? option httplog
? log global
? maxconn 10
? timeout client 5000
? stats hide-version
? stats refresh 30s
? stats show-node
? stats realm haproxy
? stats auth admin:password
? stats uri /haproxy?stats
frontend emqx_tcp
? bind *:1883
? mode tcp
? maxconn 500000
? timeout client 3h
? option tcplog
? log-format %T\ %t\ Some\ Text
? default_backend emqx_tcp_cluster
frontend emqx_tcp_ssl
? bind *:8883 ssl crt /etc/ssl/xip.io/xip.io.pem no-sslv3
? mode tcp
? maxconn 500000
? timeout client 3h
? option tcplog
? log-format %T\ %t\ Some\ Text
? default_backend emqx_tcp_cluster
frontend emqx_dashboard
? bind *:18083
? mode http
? maxconn 50
? timeout client 5000
? default_backend emqx_dashboard_server
backend emqx_tcp_cluster
? mode tcp
? option clitcpka
? balance leastconn
? timeout connect 5000
? timeout server 3h
? timeout check 5000
? server emqx1 emqx1:1883 check inter 2000 fall 2 rise 5 weight 1
? server emqx2 emqx2:1883 check inter 2000 fall 2 rise 5 weight 1
backend emqx_dashboard_server
? mode http
? option http-keep-alive
? balance source
? timeout connect 50000
? timeout server 50000
? timeout check 5000
? server emqx1 emqx1:18083 check inter 2000 fall 2 rise 5 weight 1
? server emqx2 emqx2:18083 check inter 2000 fall 2 rise 5 weight 1