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

### 物联网智能系统中使用Docker的最佳实践 #### 选择适合的操作系统和硬件架构 在物联网环境中,设备可能基于不同的处理器架构(如ARM),因此确保所选的基础镜像支持目标硬件至关重要。通常推荐采用轻量级Linux发行版作为基础操作系统来减少资源占用并提高启动速度[^3]。 #### 创建自定义Docker镜像 针对特定应用场景构建专用的服务容器是提升效率的有效方式之一。对于物联网项目而言,这涉及到安装必要的软件包以及配置服务参数等工作。例如,在创建MQTT代理服务器时可以通过编写`Dockerfile`文件来自动生成所需的Mosquitto镜像: ```dockerfile FROM arm32v7/eclipse-mosquitto:latest COPY mosquitto.conf /etc/mosquitto/conf.d/default.conf VOLUME ["/mosquitto/config", "/mosquitto/data", "/mosquitto/log"] EXPOSE 1883 9001 ``` 此段脚本指定了要使用的官方Eclipse Mosquitto ARM版本,并复制了预设好的配置文件到指定位置;同时开放两个端口用于客户端连接和服务监控接口访问[^4]。 #### 部署与管理多容器应用 当面对较为复杂的业务逻辑需求时,则需借助于诸如Kubernetes这样的高级编排框架来进行集群管理和调度工作。但对于大多数小型IoT场景来说,仅依靠简单的组合式描述符——即`docker-compose.yml`就足以满足日常开发测试乃至生产上线的要求了。下面是一个典型的例子展示了如何利用该工具链快速搭建起一套完整的消息传递基础设施: ```yaml version: '3' services: mqtt-broker: image: eclipse-mosquitto container_name: broker restart: always ports: - "1883:1883" - ./mqtt-log:/mosquitto/log data-collector: build: . depends_on: - mqtt-broker environment: BROKER_HOSTNAME: broker networks: default: aliases: - collector networks: default: driver: bridge ``` 上述清单不仅涵盖了前面提到过的Broker组件实例化过程,还额外引入了一个负责采集传感器数据并向外转发处理结果的应用程序节点。值得注意的是这里采用了相对路径映射持久存储空间以便更好地适应不同主机间的差异性设置。 #### 日常维护与安全保障措施 定期更新底层依赖库有助于及时修复已知漏洞从而保障整个系统的健壮性。另外考虑到物理层面的安全隐患因素,建议启用SELinux/AppArmor等强制访问控制系统进一步增强防护等级。与此同时,合理规划网络流量走向也是不容忽视的一环:比如通过防火墙策略限制外部未经许可的入站请求只允许信任源地址范围内的通信尝试到达内部敏感区域。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值