搭建 RocketMQ 集群

纯粹是为了记录搭建的过程。忘了就翻来看看。

RocketMQ部署类型

单个Master

单机模式, 即只有一个Broker, 如果Broker宕机了, 会导致RocketMQ服务不可用, 不推荐使用.

多Master模式

组成一个集群, 集群每个节点都是Master节点, 配置简单, 性能也是最高, 某节点宕机重启不会影响RocketMQ服务, 缺点就是如果某个节点宕机了, 会导致该节点未被消费的消息在在节点恢复前不可订阅.

多Master多Slave模式,异步复制

每个Master配置一个Slave, 多对Master-Slave, Master与Slave消息采用异步复制方式, 主从消息一致会有毫秒级的延迟. 优点是弥补了多Master模式下节点宕机后在恢复前不可订阅的问题, 在Master宕机后, 消费者还可以从Slave节点进行消费, 缺点就是如果Master宕机, 磁盘损坏的情况下, 如果没有即使将消息复制到Slave, 会导致有少量消息丢失.

多Master多Slave模式,同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,主备都写成功,向应用返回成功。数据与服务都无单点,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。缺点就是性能比异步复制模式略低,大约低10%左右,发送单个消息的RT会略高。

集群的一些概念

  • Name Server: 是一个几乎无状态节点, 可集群部署, 节点之间间无任何信息同步.
  • Broker: Broker分为Master与Slave, 一个Master可以对应多个Slave, 但是一个Slave只能对应一个Master, Master与Slave的对应关系通过指定相同的BrokerName, 不同的BrokerId来定义, BrokerId为0表示Master, 非0表示Slave. Master也可以部署多个. 每个Broker与Name Server集群中的所有节点建立长连接, 定时注册Topic信息到所有Name Server.
  • Producer: producer与Name Server集群中的其中一个节点(随机选择)建立长连接, 定期从Name Server取Topic路由信息, 并向提供Topic服务的Master建立长连接, 且定时向Master发送心跳. Producer完全无状态, 可集群部署.
  • Comsumer: Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接, 定期从Name Server 取Topic路由信息, 并向提供Topic服务的Master、Slave建立长连接, 且定时向Master、Slave发送心跳. Consumer既可以从Master订阅消息, 也可以从Slave订阅消息, 订阅规则由Broker配置决定.

以上概念来源于RocketMQ开发手册

搭建多 Master多Slave 异步复制模式

  • 下载:
$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.3.2/rocketmq-all-4.3.2-source-release.zip
  • 解压:
$ unzip rocketmq-all-4.3.2-source-release.zip
$ mv rocketmq-all-4.3.2 rocketmq
  • Maven编译:
$ mvn -Prelease-all -DskipTests clean install -U
  • 修改broker配置文件:

Master1

$ vim ${rocketmq_home}/conf/2m-2s-sync/broker-a.properties

brokerClusterName=test_hk_hk3_hd_mq_rocket_1
brokerName=broker-a
# 主服务器必须为0
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
#nameServer地址,分号分割
namesrvAddr=172.17.4.60:9876;172.17.4.61:9876

Slave1

$ vim ${rocketmq_home}/conf/2m-2s-sync/broker-a-s.properties

brokerClusterName=test_hk_hk3_hd_mq_rocket_1
brokerName=broker-a
# 从服务器必须大于0
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
#nameServer地址,分号分割
namesrvAddr=172.17.4.60:9876;172.17.4.61:9876

其余另一对Master-Slave与此类推.

另外再列出具体的配置信息与注释:

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,10911为默认值
listenPort=10911
#表示Master监听Slave请求的端口,默认为服务端口+1
haListenPort=10912
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER  异步复制Master
#- SYNC_MASTER  同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH  异步刷盘
#- SYNC_FLUSH  同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
  • 启动: 进入rocketMQ解压目录下的bin文件夹 启动nameServer:
$ nohup sh bin/mqnamesrv &

启动broker:

$ nohup sh mqbroker -c broker-a.properties >/dev/null 2>&1 &
$ nohup sh mqbroker -c broker-a-s.properties >/dev/null 2>&1 &
$ nohup sh mqbroker -c broker-b.properties >/dev/null 2>&1 &
$ nohup sh mqbroker -c broker-b-s.properties >/dev/null 2>&1 &

如果运行出现如下错误: "The broker[broker-a, 172.17.4.60:10911] boot success. serializeType=JSON and name server is 172.17.4.60:9876" "INFO: os::commit_memory(0x00000006c0000000, 2147483648, 0) failed; error='Cannot allocate memory' (errno=12)"

那么修改一下runserver.sh和runbroker.sh的合适的jvm参数就可以了

  • 搭建控制台 本地下载源码:
$ git clone https://github.com/apache/rocketmq-externals

配置好配置文件后, 打包:

$ mvn clean package

将打好的jar包上传到服务器

服务器运行:

$ nohup java -jar rocketmq-console-ng-1.0.0.jar 2>&1 &
$ tail -f nohup.out

本文分享自微信公众号 - 后端进阶(objcoding)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Seebug漏洞平台

CVE-2019-14287(Linux sudo 漏洞)分析

近日 sudo 被爆光一个漏洞,非授权的特权用户可以绕过限制获得特权。官方的修复公告请见:https://www.sudo.ws/alerts/minus_1_...

12810
来自专栏CU技术社区

简单几步搭建一个基于 Docker 的 Tomcat 运行环境!

Docker 旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器 (轻量级虚拟机) 并部署和运行应用程序,并通过配置文件可以轻松实...

7330
来自专栏大内老A

AOP框架Dora.Interception 3.0 [4]: 基于特性的拦截器注册

按照单一职责的原则,拦截器只负责需要的拦截操作的执行,至于它采用何种方式应用到目标方法上,以及它在整个拦截器管道中的位置则属于“拦截器注册”的范畴。Dora.I...

5110
来自专栏CU技术社区

掌握运维必备技能--问题故障定位

a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。

6620
来自专栏浊酒清味

用Python爬取英雄联盟英雄皮肤壁纸

http://lol.qq.com/web201310/info-heros.shtml

14320
来自专栏安装python3.6 详细教程

ubuntu1~16.04.9 下安装python3.6 详细教程(在腾讯云服务器上安装实例)

1.输入 sudo add-apt-repository ppa:jonathonf/python-3.6

8100
来自专栏机器人课程与技术

Ubuntu18.04 ROS1Melodic ROS2Dashing 机器人工具集学习镜像的制作说明 Pinguy

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

12910
来自专栏码神路漫漫

如何实现 Go Module 依赖关系的可视化

最近,我开发了一个非常简单的小工具,总的代码量 200 行不到。今天,简单介绍下它。这是个什么工具呢?它是一个用于可视化展示 Go Module 依赖关系的工具...

13410
来自专栏数据分析1480

R&Python Data Science 系列:数据处理(1)

数据科学主要以统计学、机器学习、数据可视化等,使用工具将原始数据转换为认识和知识(可视化或者模型),主要研究内容包括数据导入、数据转换、可视化、构建模型等。...

10310
来自专栏CU技术社区

五分钟搞定Bash功能与使用技巧

一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无法与硬件或内核打交道的,用户通...

4510

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励