1、初步理解Producer/Consumer Group

在安装RocketMQ之前我们先来理解Group概念,在RocketMQ中Group是很重要的。通过Group机制,让RocketMQ天然的支持消息负载均衡!比如某个Topic有9条消息,其中一个Consumer Group有3个实例(3个进程 OR 3台机器),那么每个实例将均摊3条消息!(注意RocketMQ只有一种模式,即发布订阅模式。)如下图所示:

2、RocketMQ的集群部署模式:

在动手操作之前我们先来了解一下RocketMQ的集群部署模式都有哪些。RocketMQ在众多消息队列产品中高可用性是其亮点之一,其集群部署方式有很多种。比如单Master模式、多Master模式、多Master多Slave模式(异步复制)、多Master多Slave模式(同步双写)等。明确个概念,RocketMQ Slave不可以写,可以读,类似于MySQL的主从机制。

  • 单Master模式:无需多言,一旦单个broker重启或宕机,一切都结束了!很显然,线上不可以使用。
  • 多Master模式:全是Master,没有Slave。当然,一个broker宕机了,应用是无影响的,缺点在于宕机的Master上未被消费的消息在Master没有恢复之前不可以订阅。
  • 多Master多Slave模式(异步复制):多对Master-Slave,高可用!采用异步复制的方式,主备之间短暂延迟,MS级别。Master宕机,消费者可以从Slave上进行消费,不受影响,但是Master的宕机,会导致丢失掉极少量的消息。
  • 多Master多Slave模式(同步双写):和上面的区别点在于采用的是同步方式,也就是在Master/Slave都写成功的前提下,向应用返回成功,可见不论是数据,还是服务都没有单点,都非常可靠!缺点在于同步的性能比异步稍低。

3、RocketMQ 1个Nameserver 2个Master安装部署:

目标:熟悉RocketMQ的各模块搭建流程,部署一个测试集群。1个nameserver,两个master。
环境:两台虚拟机,java环境,mvn
虚拟机1启动一个nameserver + 1个broker。虚拟机2启动一个broker。
主要参考:https://rocketmq.apache.org/docs/quick-start/
主要操作命令上面文档中都有

环境准备

64位操作系统,建议使用Linux / Unix /

  • CentOs 7.3 +
  • 64bit JDK 1.8 +
  • Maven 3.2.x +
  • RocketMQ4.4
  • RocketMQ-console

1.1安装rocketmq

可以在操作系统用wget直接下载,也可以在本机下载完后上传到服务器。
wget http://mirrors.hust.edu.cn/apache/rocketmq/4.5.2/rocketmq-all-4.5.2-bin-release.zip
RocketMQ已归属Apache开源项目,可以去apache官网下载。
解压unzip rocketmq-all-4.5.2-bin-release.zip

1.2 Download & Build from Release

Click here to download the 4.3.0 source release. Also you could download a binary release from here .

Build from source release:

> unzip rocketmq-all-4.5.2-bin-release.zip
> cd rocketmq-all-4.5.2-bin-release/
> mvn -Prelease-all -DskipTests clean install -U
> cd distribution/rocketmq-4.5.2

1.3 Start Name Server

Name Server 默认配置Xmx=4G,调整以适合部署:

vi /bin/runserver.sh

JAVA_OPT="${JAVA_OPT}-server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

调整为

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

启动Name Server

nohup sh bin/mqnamesrv -n "10.200.110.91:9876" > /dev/null 2>&1 &

tail -f ~/logs/rocketmqlogs/namesrv.log

1.4 Start Broker

调整java opt:

vi /bin/runbroker.sh

JAVA_OPT="${JAVA_OPT}-server -Xms8g -Xmx8g -Xmn4g"

调整为:

JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"

启动Broker

虚拟机1启动broker命令:nohup sh bin/mqbroker -n 10.200.110.91:9876 -c ./conf/2m-noslave/broker-a.properties &
虚拟机2启动broker命令:nohup sh bin/mqbroker -n 10.200.110.91:9876 -c ./conf/2m-noslave/broker-b.properties & tail -f ~/logs/rocketmqlogs/broker.log
-n ip:9876,这里的ip是nameserver的
broker-a.properties和broker-b.properties的区别:brokerName不同

1.5 查看进程

[root@node1 apache-rocketmq]# jps
2374 BrokerStartup
2350 NamesrvStartup
[root@node1 apache-rocketmq]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0127.0.0.1:25 0.0.0.0:* LISTEN 1508/master
tcp6 0 0:::9876 :::* LISTEN 2350/java
tcp6 0 0::1:25 :::* LISTEN 1508/master
tcp6 0 0:::10909 :::* LISTEN 2374/java
tcp6 0 0:::10911 :::* LISTEN 2374/java
tcp6 0 0:::10912 :::* LISTEN 2374/java

1.6、控制台的使用rocketmq-console

Rocket-console做为rocketmq社区维护的产品需要从GitHub上下载,下载地址:https://github.com/apache/rocketmq-externals。下载下来后我们会发现有好多应用工程,这些全是rocketmq的外围支持系统,感兴趣的可以查看。我们需要的工程名是rocketmq-console。

打开src/main/resources/application.properties文件,修改配置:

rocketmq.config.namesrvAddr=10.200.110.91:9876 (rocketmq安装namesrv地址和端口)

进入rocketmq-console根目录,打开README.md文件,按照提示操作。Rocketmq-console的安装方式分为基于docker的安装和非docker安装。在测试环境中采用了非docker安装方式。

系统默认安装maven3以上版本,执行命令:mvn clean package -Dmaven.test.skip=true

进入target,将rocketmq-console-ng-1.0.0.jar上传到服务器执行:java -jar rocketmq-console-ng-1.0.0.jar&

在目录下生成out.log日志文件,查看启动成功。在浏览器中输入访问地址:http://10.200.110.91:8080

1.7、Send & Receive Messages

> export NAMESRV_ADDR=localhost:9876
> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ... > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...

1.8、Shutdown Servers

> sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK > sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK

问题

1、RemotingTooMuchRequestException: sendDefaultImpl call timeout

异常说明

  • 在客户端的 Producer 运行起来准备发送消息时抛异常如下
  • 因为使用的是虚拟机,设置内存也只有1G,所以从 Windows 上开发连接 虚拟机中的 nameServer 时要经过 Linux 系统的防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会关闭这个 TCP 的会话,关闭后再读写,就有可能导致这个异常。

解决办法

  1. 因为现在主要是熟练 RocketMQ 的 API,所以直接关闭了 Linux 的防火墙,实际中如果买的是如 阿里云的云主机,应该会好一些(关闭防火墙:systemctl stop firewalld,查看:systemctl status firewalld)
  2. 启动nameserver和broker时,指定IP,不指定时,console显示是这样的

      

    1)nameserver启动时指定ip:[root@localhost rocketmq-all-4.4.0-bin-release]# sh bin/mqnamesrv -n "10.200.110.91:9876"

    2)broker启动时指定broker的ip及nameserver的ip:

      A、broker的ip在配置文件中指定:[root@localhost ~]# vi /distribut/rocketmq-all-4.4.0-bin-release/conf/2m-noslave/broker-a.properties

        加一行ip:brokerIP1=10.200.110.91

      B、nameserver的ip指定,在broker的启动命令中指定:[root@localhost rocketmq-all-4.4.0-bin-release]# sh bin/mqbroker -n 10.200.110.91:9876 -c ./conf/2m-noslave/broker-a.properties

    重新启动nameserver、broker后console的显示为:

    

这是我的springboot的客户端producter可以正常发送消息了。

附上常用的命令行:

2 常用命令

cd  /ROCKETMQ/bin

创建topic:

sh mqadmin updateTopic -c DefaultCluster -n localhost:9876 -t testtopic

查看topic列表:

sh mqadmin topicList -n 11.4.74.48:9876

查看指定topic路由信息:

sh mqadmin topicRoute -n 11.4.74.48:9876 -t testtopic1

查看指定topic状态:

sh mqadmin topicStatus -n 11.4.74.48:9876 -t testtopic1

查看指定topic的消息:

sh mqadmin queryMsgByOffset -b broker-b -i 1  -o 0 -t NewUpt_PsgEventTopic -n localhost:9876

创建消费者组:

sh mqadmin updateSubGroup -n localhost:9876 -c DefaultCluster -g push-consumer-group1

查看消费者组:

sh mqadmin consumerProgress -n localhost:9876

查看集群信息:

sh mqadmin clusterList -n 11.4.74.48:9876

查看broker状态

sh mqadmin brokerStatus -b 11.4.74.44:10911 -n 11.4.74.48:9876

创建生产者组:

创建订阅组:

sh mqadmin updateSubGroup -c DefaultCluster -g subgroup1 -n 11.4.74.48:9876果是对集群扩容,则可以通过指定新的broker地址在扩容的机器上创建一份新的订阅组信息

根据key查消息:

sh mqadmin queryMsgByKey -k test100 -t testtopic1  -n 11.4.74.48:9876

根据unique key查:(非msgid )

sh mqadmin queryMsgByUniqueKey  -i  0B0D308C16C418B4AAC236B77FFB03E3  -n 11.4.74.48:9876 -t testtopic1

附上我的broker的配置

[root@localhost conf]# cat 2m-noslave/broker-demo.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-c
#0表示Master,>0表示Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=10.200.110.46:9876;10.200.110.101:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/root/store/store
#commitLog 存储路径
storePathCommitLog=/root/store/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/root/store/store/consumequeue
#消息索引存储路径
storePathIndex=/root/store/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/store/store/checkpoint
#abort 文件存储路径
abortFile=/root/store/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
#这里设置IP后,在web控制台显示ip了,同时java客户端可以连上
brokerIP1=10.200.110.48

RocketMQ之三:RocketMQ集群环境搭建的更多相关文章

  1. Hadoop+Spark:集群环境搭建

    环境准备: 在虚拟机下,大家三台Linux ubuntu 14.04 server x64 系统(下载地址:http://releases.ubuntu.com/14.04.2/ubuntu-14.0 ...

  2. 项目进阶 之 集群环境搭建(三)多管理节点MySQL集群

    上次的博文项目进阶 之 集群环境搭建(二)MySQL集群中,我们搭建了一个基础的MySQL集群,这篇博客咱们继续讲解MySQL集群的相关内容,同时针对上一篇遗留的问题提出一个解决方案. 1.单管理节点 ...

  3. Spark 1.6.1分布式集群环境搭建

    一.软件准备 scala-2.11.8.tgz spark-1.6.1-bin-hadoop2.6.tgz 二.Scala 安装 1.master 机器 (1)下载 scala-2.11.8.tgz, ...

  4. hadoop集群环境搭建之zookeeper集群的安装部署

    关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...

  5. hadoop集群环境搭建之安装配置hadoop集群

    在安装hadoop集群之前,需要先进行zookeeper的安装,请参照hadoop集群环境搭建之zookeeper集群的安装部署 1 将hadoop安装包解压到 /itcast/  (如果没有这个目录 ...

  6. hadoop集群环境搭建准备工作

    一定要注意hadoop和linux系统的位数一定要相同,就是说如果hadoop是32位的,linux系统也一定要安装32位的. 准备工作: 1 首先在VMware中建立6台虚拟机(配置默认即可).这是 ...

  7. Ningx集群环境搭建

    Ningx集群环境搭建 Nginx是什么? Nginx ("engine x") 是⼀个⾼性能的 HTTP 和 反向代理 服务器,也是⼀个 IMAP/ POP3/SMTP 代理服务 ...

  8. hadoop2集群环境搭建

    在查询了很多资料以后,发现国内外没有一篇关于hadoop2集群环境搭建的详细步骤的文章. 所以,我想把我知道的分享给大家,方便大家交流. 以下是本文的大纲: 1. 在windows7 下面安装虚拟机2 ...

  9. [转]ZooKeeper 集群环境搭建 (本机3个节点)

    ZooKeeper 集群环境搭建 (本机3个节点) 是一个简单的分布式同步数据库(或者是小文件系统) ------------------------------------------------- ...

  10. redis哨兵集群环境搭建

    一.哨兵的介绍 哨兵(sentinal)是redis集群架构中非常重要的一个组件,主要功能如下: 集群监控,负责监控redis master和slave进程是否正常工作 消息通知,如果某个redis实 ...

随机推荐

  1. P2822 组合数问题——巧用前缀和

    P2822 组合数问题 求的是C(i,j)有多少个是k的倍数: 首先,求组合数是有技巧的, 用杨辉三角求组合数,爽的一批: 但是,这样只能得90分,两个点T了: 因为k是不变的,我们可以用前缀和的思想 ...

  2. java 封装返回结果实体类 返回结果以及错误信息

    public class ResponseMessage { private final static String STATUS_OK = "0"; private final ...

  3. 不用中间变量交换a和b的值?

    a = b = a = a+b b = a-b a = a-b print(a,b) a = b = a = a^b b = b^a a = a^b print(a,b) a = b = a,b = ...

  4. CF1174C Ehab and a Special Coloring Problem(数论)

    做法 与\(x\)互质的数填不同的数,把有向关系表示出来,发现边数是不能承受的 反过来想,成倍数关系填相同的数,把这些数想象成一条链,而这条链开始的数一定是质数,\(\sum\limits_{prim ...

  5. CF2B The least round way(贪心+动规)

    题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...

  6. C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>

    本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的 ...

  7. Go开发环境安装与环境变量配置

    1.Go安装包下载 https://studygolang.com/dl 2.安装 Windows平台下,直接下一步即可完成安装. 3.配置环境变量 系统变量 安装完成后,在系统变量的Path一栏,会 ...

  8. mysql 导入导出表结构和表数据

    mysqldump -u用户名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据mysqldump -h localhost -uroot -p123456 databas ...

  9. chrome-添加JSON-handler插件

    1.访问http://jsonhandle.sinaapp.com/下载 2.谷歌访问   chrome://extensions/ 然后找到你下载的JSON-handle_0.5.2.crx文件,直 ...

  10. 搭建JavaWeb应用开发环境——Tomcat服务器

    学习web开发,需要先安装一台web服务器,然后再在web服务器中开发相应的web资源,供用户使用浏览器访问. 搭建JavaWeb应用开发环境——Tomcat服务器 1.疑问:学习web开发,为什么必 ...