mosquitto 高可用通过桥接(bridge)模式实现。(这次只是实现简单版本,没有配置用户认证等复杂场景,只实现客户端无论连接哪个broker,都可以消费到消息)
环境:vmware 虚拟机系统centos7,Docker Compose version v2.7.0, mosquitto 1.6.9
docker-compose.yaml
version: '3'
services:
mosquitto-nginx:
container_name: mosquitto-nginx
restart: unless-stopped
volumes:
- ./nginx:/etc/nginx/
- ./nginx/log:/var/log/nginx/
- /etc/localtime:/etc/localtime:ro
image: nginx
ports:
- 11080:11080
depends_on:
- mosquitto1
mosquitto1:
image: eclipse-mosquitto:1.6.9
container_name: mosquitto1
ports:
- 8883:8883
- 9001:9001
environment:
TZ: Asia/Shanghai
volumes:
- ./mosquitto1/config:/mosquitto/config
- ./mosquitto1/data:/mosquitto/data
- ./mosquitto1/log:/mosquitto/log
restart: unless-stopped
depends_on:
- mosquitto2
- mosquitto3
mosquitto2:
image: eclipse-mosquitto:1.6.9
container_name: mosquitto2
ports:
- 8884:8884
- 9002:9002
environment:
TZ: Asia/Shanghai
volumes:
- ./mosquitto2/config:/mosquitto/config
- ./mosquitto2/data:/mosquitto/data
- ./mosquitto2/log:/mosquitto/log
restart: unless-stopped
mosquitto3:
image: eclipse-mosquitto:1.6.9
container_name: mosquitto3
ports:
- 8885:8885
- 9003:9003
environment:
TZ: Asia/Shanghai
volumes:
- ./mosquitto3/config:/mosquitto/config
- ./mosquitto3/data:/mosquitto/data
- ./mosquitto3/log:/mosquitto/log
restart: unless-stopped
ps:volumes 目录权限调大chmod 777, 不然写文件失败
nginx配置项复制:
- 启动一个默认实例
docker run --name nginx -p 11080:80 -d nginx - 把文件拷出来
docker cp nginx:/etc/nginx/ . - 删除默认实例
docker stop nginx && docker rm nginx
mosquitto-nginx (用于tcp负载均衡mosquitto2 和 mosquitto 3),配置文件:
#nginx tcp loadbalance config, 在http的上面增加代码如下
stream {
upstream MosquittoServer{
server 192.168.229.140:8884;
server 192.168.229.140:8885;
}
server {
proxy_connect_timeout 1s;
listen 11080;
proxy_pass MosquittoServer;
tcp_nodelay on;
}
}
mosquitto1(Bridge 节点)配置文件,路径./mosquitto1/config/mosquitto.conf
port 8883
listener 9001
connection mosquitto2
address 192.168.229.140:8884
topic # both 1
connection mosquitto3
address 192.168.229.140:8885
topic # both 1
bridge_protocol_version mqttv311
notifications true
cleansession true
try_private true
start_type automatic
connection_messages true
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_timestamp true
log_timestamp_format %Y-%m-%d %H:%M:%S
persistence true
persistence_file /mosquitto/data/mosquitto.db
mosquitto2(Broker节点)配置文件,路径./mosquitto2/config/mosquitto.conf
port 8884
listener 9002
connection_messages true
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_timestamp true
log_timestamp_format %Y-%m-%d %H:%M:%S
persistence true
persistence_file /mosquitto/data/mosquitto.db
mosquitto3(Broker 节点)配置文件,路径./mosquitto3/config/mosquitto.conf
port 8885
listener 9003
connection_messages true
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
log_timestamp true
log_timestamp_format %Y-%m-%d %H:%M:%S
persistence true
persistence_file /mosquitto/data/mosquitto.db
docker-compose up -d 启动部署
docker-compose logs 查看部署日志
mosquitto配置原理讲解: mosquitto-bridge-configuration
mosquitto 配置文件详解:https://blog.51cto.com/u_10624715/3235140
k8s 高可用部署:
- How to run high availability Mosquitto on Kubernetes
- https://github.com/roobytwo/mosquitto-HA
moquitto bridge 配置SSL认证: Configure a Mosquitto Bridge With SSL Encryption
MQTT Broker监控 : monitoring-mqtt-brokers
MQTT Broker 压测:mqtt-benchmark
还有其他压测工具:
https://github.com/inovex/mqtt-stresser
https://github.com/daoshenzzg/mqtt-mock
https://github.com/takanorig/mqtt-bench
https://testerhome.com/topics/27632
https://blog.csdn.net/qq_39214101/article/details/107997414
主题名和主题过滤器:
Topic Names and Topic Filters
主题通配符 Topic wildcards
主题层级(topic level)分隔符用于将结构化引入主题名。如果存在分隔符,它将主题名分割为多个主题层级 topic level。
订阅的主题过滤器可以包含特殊的通配符,允许一次订阅多个主题,主题过滤器中可以使用通配符,但是主题名不能使用通配符。
- 主题层级分隔符 :斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构
- 多层通配符:数字标志(‘#’ U+0023)是用于匹配主题中任意层级的通配符
- 单层通配符:加号 (‘+’ U+002B) 是只能用于单个主题层级匹配的通配符
- 以$开头的主题:服务端不能将 $ 字符开头的主题名匹配通配符 (#或+)开头的主题过滤器
mqttv5 共享主题:
在共享的MQTT订阅中,订阅相同共享主题的所有客户端将会轮流收到消息,这种机制有时称为客户机负载平衡,因为单个主题的消息负载分布在所有订阅者之间。
http://www.steves-internet-guide.com/mqttv5-shared-subscriptions/
ps:压测工具大全:https://www.iamle.com/archives/2173.html