二、使用DockerCompose部署RocketMQ
使用DockerCompose进行部署
docker-compose的版本为 Docker Compose version v2.2.3
RocketMQ的部署方式以及各自的特点
-
单master模式
只有一个 master 节点,如果master节点挂掉了,会导致整个服务不可用,线上不宜使用,适合个人学习使用。
-
多master模式
和kafka不一样,RocketMQ中并没有 master 选举功能,在RocketMQ集群中,1台机器只能要么是Master,要么是Slave,这个在初始的机器配置里面,就定死了的。
不会像kafka那样存在master动态选举,所以通过配置多个master节点来保证RocketMQ的高可用。
多个 master 节点组成集群,单个 master 节点宕机或者重启对应用没有影响。
**优点:**高可用,所有模式中性能最高
**缺点:**可能会有少量消息丢失(配置相关),单台机器重启或宕机期间,该机器下未被消费的消息在机器恢复前不可订阅,影响消息实时性
**注意:**使用同步刷盘可以保证消息不丢失,同时 Topic 相对应的 queue 应该分布在集群中各个 master节点,而不是只在某各 master 节点上,否则,该节点宕机会对订阅该 topic 的应用造成影响。
-
多master多slave异步复制模式
在多 master 模式的基础上,每个 master 节点都有至少一个对应的 slave。
master 节点可读可写,但是 slave 只能读不能写,类似于 mysql 的主备模式。
优点: 在 master 宕机时,消费者可以从 slave 读取消息,消息的实时性不会受影响,性能几乎和多 master 一样。
**缺点:**使用异步复制的同步方式有可能会有消息丢失的问题。
-
多master多slave 同步复制模式
同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。
**优点:**同步双写的同步模式能保证数据不丢失。
**缺点:**发送单个消息 RT 会略长,性能相比异步复制低10%左右。
**刷盘策略:**同步刷盘和异步刷盘(指的是节点自身数据是同步还是异步存储)
注意:要保证数据可靠,需采用同步刷盘和同步双写的方式,但性能会较其他方式低。
单Master模式进行部署
部署列表
| 组件 | 端口 | 数量 |
|---|---|---|
| nameserver | 9876 | 1 |
| master | 10911、10912 | 1 |
| rocketmq-console | 9001 | 1 |
配置文件
broker.conf
brokerClusterName = rocketmq-cluster
brokerName = broker-strand
brokerId = 0
#当前 broker 监听的 IP,broker所在宿主机的IP
brokerIP1 = 172.16.15.220
#一天删除一次文件的操作,代表凌晨四点进行删除
deleteWhen = 04
#在磁盘上保存消息的时长 48小时
fileReservedTime = 48
# 当前broker所处的角色
brokerRole = ASYNC_MASTER
# 磁盘的刷新方式
flushDiskType = ASYNC_FLUSH
# namesrvAddr的地址
namesrvAddr = 172.16.15.220:9876
autoCreateTopicEnable = true
#接受客户端连接的监听端⼝,要跟后面docker-compose.yml中的ports配置匹配
listenPort = 10911#haListenPort
#haListenPort是haService中使用
#默认值为:listenPort + 1
DockerCompose部署文件
version: '3.5'
services:nameserver-stand:image: apacherocketmq/rocketmq:4.6.0container_name: nameserver-standports: - 9876:9876environment:TZ: Asia/ShanghaiJAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" volumes:- ./nameserver/logs:/home/rocketmq/logs- ./nameserver/store:/home/rocketmq/storecommand: sh mqnamesrvnetworks:rmq:aliases:- nameserverbroker-stand:image: apacherocketmq/rocketmq:4.6.0container_name: broker-standuser:root:rootports:- 10911:10911- 10912:10912depends_on:- nameserveravolumes:- ./broker/logs:/root/logs- ./broker/store:/root/store- ./broker/conf/broker.conf:/opt/rocketmq-4.6.0/conf/broker.confenvironment:TZ: Asia/ShanghaiNAMESRV_ADDR: "nameserver:9876"JAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" command: sh mqbroker -c /opt/rocketmq-4.6.0/conf/broker.conf autoCreateTopicEnable=true &links:- nameserver:nameservernetworks:rmq:aliases:- rmqbrokerrmqconsole-stand:image: styletang/rocketmq-console-ngcontainer_name: rmqconsole-standports:- 9001:9001environment:TZ: Asia/ShanghaiJAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" environment:JAVA_OPTS: "-Drocketmq.namesrv.addr=172.16.15.220:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Dserver.port=9001" networks:rmq:aliases:- rmqconsole
networks:rmq:name: rmqdriver: bridge
多Master多Slave的Async形式部署
部署列表
| 组件 | 角色 | 端口 | 个数 |
|---|---|---|---|
| nameserver | 注册中心 | 9876、9877 | 2 |
| master-a | 主节点a | 10911、10912 | 1 |
| slave-1-a | 主节点a的从节点 | 10921、10922 | 1 |
| master-b | 主节点b | 10931、10932 | 1 |
| slave-1-b | 主节点b的从节点 | 10941、10942 | 1 |
配置文件
搭建集群模式,需要注意以下配置文件的配置项
brokerName:将各个master进行区分,名称一样的master和slave归属一类
brokerId:master与slave区分,为0代表master,>0代表slave
brokerRole:代表master与slave之间的数据传输方式,以及定位该broker是否为slave
ASYNC_MASTER 异步复制;SYNC_MASTER 同步复制;从节点必须配置为SLAVE
-
master-a.conf
brokerClusterName = rocketmq-cluster brokerName = broker-a brokerId = 0 #当前 broker 监听的 IP,broker所在宿主机的IP brokerIP1 = 172.16.15.220 deleteWhen = 04 fileReservedTime = 48 # 控制master与slave的通信模式,ASYNC_MASTER 异步复制;SYNC_MASTER 同步复制;SLAVE 表示从节点 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH #namesrvAddr的地址 namesrvAddr = 172.16.15.220:9876;172.16.15.220:9877 autoCreateTopicEnable = true #接受客户端连接的监听端⼝,要跟后面docker-compose.yml中的ports配置匹配 listenPort = 10911#haListenPort #haListenPort是haService中使用 #默认值为:listenPort + 1 -
slave-1-a.conf
brokerClusterName = rocketmq-cluster brokerName = broker-a brokerId = 1 #当前 broker 监听的 IP,broker所在宿主机的IP brokerIP1 = 172.16.15.220 deleteWhen = 04 fileReservedTime = 48 brokerRole = SLAVE flushDiskType = ASYNC_FLUSH #namesrvAddr的地址 namesrvAddr = 172.16.15.220:9876;172.16.15.220:9877 autoCreateTopicEnable = true #接受客户端连接的监听端⼝,要跟后面docker-compose.yml中的ports配置匹配 listenPort = 10921#haListenPort #haListenPort是haService中使用 #默认值为:listenPort + 1 -
master-b.conf
brokerClusterName = rocketmq-cluster brokerName = broker-b brokerId = 0 #当前 broker 监听的 IP,broker所在宿主机的IP brokerIP1 = 172.16.15.220 deleteWhen = 04 fileReservedTime = 48 # 控制master与slave的通信模式,ASYNC_MASTER 异步复制;SYNC_MASTER 同步复制;SLAVE 表示从节点 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH #namesrvAddr的地址 namesrvAddr = 172.16.15.220:9876;172.16.15.220:9877 autoCreateTopicEnable = true #接受客户端连接的监听端⼝,要跟后面docker-compose.yml中的ports配置匹配 listenPort = 10931#haListenPort #haListenPort是haService中使用 #默认值为:listenPort + 1 -
slave-1-b.conf
brokerClusterName = rocketmq-cluster brokerName = broker-b brokerId = 1 #当前 broker 监听的 IP,broker所在宿主机的IP brokerIP1 = 172.16.15.220 deleteWhen = 04 fileReservedTime = 48 brokerRole = SLAVE flushDiskType = ASYNC_FLUSH #namesrvAddr的地址 namesrvAddr = 172.16.15.220:9876;172.16.15.220:9877 autoCreateTopicEnable = true #接受客户端连接的监听端⼝,要跟后面docker-compose.yml中的ports配置匹配 listenPort = 10941#haListenPort #haListenPort是haService中使用 #默认值为:listenPort + 1
DockerCompose部署文件参考
version: '3.5'
services:nameserver-a:image: apacherocketmq/rocketmq:4.6.0container_name: nameserver-aports: - 9876:9876environment:TZ: Asia/ShanghaiJAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" volumes:- ./nameserver-a/logs:/home/rocketmq/logs- ./nameserver-a/store:/home/rocketmq/storecommand: sh mqnamesrvnetworks:rmq-cluster:aliases:- nameserver-anameserver-b:image: apacherocketmq/rocketmq:4.6.0container_name: nameserver-bports: - 9877:9876volumes:- ./nameserver-b/logs:/home/rocketmq/logs- ./nameserver-b/store:/home/rocketmq/storecommand: sh mqnamesrvenvironment:TZ: Asia/ShanghaiJAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" networks:rmq-cluster:aliases:- nameserver-abroker-a:image: apacherocketmq/rocketmq:4.6.0container_name: broker-auser:root:rootports:- 10911:10911- 10912:10912volumes:- ./broker-a/logs:/root/logs- ./broker-a/store:/root/store- ./broker-a/conf/broker-a.conf:/opt/rocketmq-4.6.0/conf/broker.confenvironment:TZ: Asia/ShanghaiNAMESRV_ADDR: "nameserver-a:9876;nameserver-b:9876"JAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" command: sh mqbroker -c /opt/rocketmq-4.6.0/conf/broker.conf autoCreateTopicEnable=true &links:- nameserver-a:nameserver-a- nameserver-b:nameserver-bnetworks:rmq-cluster:aliases:- broker-aslave-1-a:image: apacherocketmq/rocketmq:4.6.0container_name: slave-1-auser:root:rootports:- 10921:10921- 10922:10922volumes:- ./slave-1-a/logs:/root/logs- ./slave-1-a/store:/root/store- ./slave-1-a/conf/slave-1-a.conf:/opt/rocketmq-4.6.0/conf/broker.confenvironment:TZ: Asia/ShanghaiNAMESRV_ADDR: "nameserver-a:9876;nameserver-b:9876"JAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" command: sh mqbroker -c /opt/rocketmq-4.6.0/conf/broker.conf autoCreateTopicEnable=true &links:- nameserver-a:nameserver-a- nameserver-b:nameserver-bnetworks:rmq-cluster:aliases:- slave-1-abroker-b:image: apacherocketmq/rocketmq:4.6.0container_name: broker-buser:root:rootports:- 10931:10931- 10932:10932volumes:- ./broker-b/logs:/root/logs- ./broker-b/store:/root/store- ./broker-b/conf/broker-b.conf:/opt/rocketmq-4.6.0/conf/broker.confenvironment:TZ: Asia/ShanghaiNAMESRV_ADDR: "nameserver-a:9876;nameserver-b:9876"JAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms256m -Xmx512m -Xmn128m"command: sh mqbroker -c /opt/rocketmq-4.6.0/conf/broker.conf autoCreateTopicEnable=true &links: - nameserver-a:nameserver-a- nameserver-b:nameserver-bnetworks:rmq-cluster:aliases:- broker-bslave-1-b:image: apacherocketmq/rocketmq:4.6.0container_name: slave-1-buser:root:rootports:- 10941:10941- 10942:10942volumes:- ./slave-1-b/logs:/root/logs- ./slave-1-b/store:/root/store- ./slave-1-b/conf/slave-1-b.conf:/opt/rocketmq-4.6.0/conf/broker.confenvironment:TZ: Asia/ShanghaiNAMESRV_ADDR: "nameserver-a:9876;nameserver-b:9876"JAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms256m -Xmx512m -Xmn128m"command: sh mqbroker -c /opt/rocketmq-4.6.0/conf/broker.conf autoCreateTopicEnable=true &links: - nameserver-a:nameserver-a- nameserver-b:nameserver-bnetworks:rmq-cluster:aliases:- slave-1-brmqconsole:image: styletang/rocketmq-console-ngcontainer_name: rmqconsoleports:- 9001:9001environment:TZ: Asia/ShanghaiJAVA_OPTS: "-Duser.home=/opt"JAVA_OPT_EXT: "-server -Xms128m -Xmx256m" environment:JAVA_OPTS: "-Drocketmq.namesrv.addr=172.16.15.220:9876;172.16.15.220:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Dserver.port=9001" networks:rmq-cluster:aliases:- rmqconsole
networks:rmq-cluster:name: rmq-clusterdriver: bridge
部署问题
使用docker部署broker时,启动失败报:253错误码
解决方案:
- 使用用户标签:user,将用户指向root
- 映射容器存储路径改为:/root/store
相关文章:
二、使用DockerCompose部署RocketMQ
使用DockerCompose进行部署 docker-compose的版本为 Docker Compose version v2.2.3 RocketMQ的部署方式以及各自的特点 单master模式 只有一个 master 节点,如果master节点挂掉了,会导致整个服务不可用,线上不宜使用,适合个人学习…...
论文笔记[156]PARAFAC. tutorial and applications
原文下载:https://www.sciencedirect.com/science/article/abs/pii/S0169743997000324 摘要 本文介绍了PARAFAC的多维分解方法及其在化学计量学中的应用。PARAFAC是PCA对高阶数组的推广,但该方法的一些特性与普通的二维情况截然不同。例如,…...
AKKA.Net 的使用 来自CHATGPT
请用C# 语言实现一个自动化设备 流水线调度模型,流水线各个环节需要并行执行: 下面是一个使用C#语言实现自动化设备流水线调度模型的简单示例。该示例使用并发编程库System.Threading.Tasks来实现流水线各个环节的并行执行。 csharp using System; usi…...
网络安全—小白学习笔记
1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟入…...
OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理
OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台,它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台,用户可以收集和处理来自不同设备的传感器数据,适用于智…...
GO-unioffice实现word编辑
导包 import ("fmt""log""os""time""github.com/unidoc/unioffice/common/license""github.com/unidoc/unioffice/document" ) 创建word文件 func CreateFile(name string) {filename : name ".docx&quo…...
SpringMVC的拦截器(Interceptor)
拦截器简介 SpringMVC的拦截器Interceptor,主要是对Controller资源访问时进行拦截的基本操作的技术,当然拦截后可以进行权限控制,功能增强等都是可以的。拦截器类似于JavaWeb开发中的Filter,他们之间的区别如下图所示 Filter技术…...
【git】gitlab常用命令
gitlab官网 官网:官网 中文官网:中文官网 默认的gitlab安装目录 /opt/gitlab/bin 启动 gitlab-ctl start 查看状态 gitlab-ctl status 停止 gitlab-ctl stop 重启GitLab gitlab-ctl restart 查看gitlab的配置文件 配置的路径是:/…...
解读下SWD协议以及其应用
SWD协议原理 SWD(Serial Wire Debug)协议是一种用于ARM Cortex微控制器的调试接口协议。它定义了主机计算机与目标设备之间通过SWD线进行通信的格式和规范。 SWD协议使用两根线进行通信:SWDIO(Serial Wire Debug I/O)…...
基于单目的光流法测速
目录 1.简介 2.代码实现 1.简介 基于单目的光流法是一种常见的计算机视觉技术,用于估计图像序列中物体的运动速度。它通过分析连续帧之间的像素变化来推断物体在图像中的移动情况。 背景: 光流法是计算机视觉领域中最早的运动估计方法之一,…...
排序-算法
文章目录 一、排序的概念及引用1.1 排序概念1.2 排序运用1.3 常见排序算法 二、常见排序算法的实现2.1 插入排序2.1.1 基本思想2.1.2 直接插入排序2.1.3 希尔排序 2.2 选择排序2.2.1 基本思想2.2.2 直接选择排序2.2.3 堆排序 2.3 交换排序2.3.1 冒泡排序2.3.2 快速排序2.3.3 快…...
【特纳斯电子】基于单片机的火灾监测报警系统-实物设计
视频及资料链接:基于单片机的火灾监测报警系统-实物设计 - 电子校园网 (mcude.com) 编号: T0152203M-SW 设计简介: 本设计是基于单片机的火灾监测报警系统,主要实现以下功能: 1.通过OLED显示温度、烟雾、是否有火…...
网络安全就业形势怎么样?
泻药,以下都是我本人的肺腑之言,是答主深耕职场多年,转战数家公司总结周围朋友的从业经验才总结出来的行业真相,真心希望帮助到还没有步入职场的大家,尤其是24届的应届毕业生,多掌握些就业信息就能少走一些…...
【Golang】Go的并发和并行性解释。谁说Go不是并行语言?
偶然发现百度上有很多"师出同门"的"go是并发语言,而不是并行语言"的说法。让我顿感奇怪,"并行"说白了就是对CPU多核的利用,这年头不能利用多核的编译语言还有的混?而且还混的这么好?并且…...
k8s-16 k8s调度
调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分如果你真的希望或者有这方面…...
【2023研电赛】全国技术竞赛一等奖:基于FPGA的超低时延激光多媒体终端
该作品参与极术社区组织的研电赛作品征集活动,欢迎同学们投稿,获取作品传播推广,并有丰富礼品哦~ 基于FPGA的超低时延激光多媒体终端 参赛单位:华东师范大学 指导老师:刁盛锡 参赛队员:王泽宇 谢祖炜 秦子淇…...
Annoy vs Milvus:哪个向量数据库更适合您的AI应用?知其然知其所以然
1. Annoy vs Milvus简介 Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库,它们可以高效地处理大规模的向量数据。 Annoy(Approximate Nearest Neighbors Oh Yeah): Annoy 是一种近似最近邻搜索算法,它通过构…...
android 13.0 SystemUI导航栏添加虚拟按键功能(一)
1.概述 在13.0的系统产品开发中,在系统SystemUI的原生系统中默认只有三键导航,想添加其他虚拟按键就需要先在构建导航栏的相关布局中分析结构,然后添加相关的图标xml就可以了,然后添加对应的点击事件,就可以了,接下来先分析第一步关于导航栏的相关布局情况 然后实现功能 …...
内存管理-分页、虚拟地址、虚拟内容、页面置换算法
文章目录 一、5W2H角度分析内存管理What是内存管理Why需要内存管理Who使用内存管理Where内存管理应用When需要内存管理How内存管理工作How much内存管理的成本 二、分页什么是分页分页的原理分页的优缺点分页的应用 三、虚拟地址什么是虚拟地址虚拟地址的作用虚拟地址的转换虚拟…...
【C++入门】命名空间详解(从零开始,冲击蓝桥杯)
C入门 命名空间 南喵小鸡汤程序员可以让步,却不可以退缩,可以羞涩,却不可以软弱,总之,程序员必须是勇敢的。一 . 命名空间的介绍二.命名空间的实际应用1.为什么要有命名空间我们在使用变量时,通常会为他定义一个名字,在…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
