docker-compose 部署 mosquitto 集群

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配置项复制:

  1. 启动一个默认实例
    docker run --name nginx -p 11080:80 -d nginx
  2. 把文件拷出来
    docker cp nginx:/etc/nginx/ .
  3. 删除默认实例
    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 高可用部署:

  1. How to run high availability Mosquitto on Kubernetes
  2. 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

参考连接:steves-internet-guide

主题名和主题过滤器:

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值