Rocketmq安装、配置和调试

一、rocketmq简介

         Apache RocketMQ是一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性,万亿级容量和灵活的可扩展性。RocketMQ的前身是MetaQ,是阿里根据kafka的设计理念 ,使用Java语言开发的一个消息队列,所以MetaQ和kafka有许多类似的地方。而rocketMQ在MetaQ的基础上,摒弃了zookeeper的使用,转而开发了namesrv来管理节点,这个变化让rocketmq更加高可用,易扩展,但也限制了rocketmq不能自主选举master,角色配置必需在配置文件中指定。

         对于一个简单的消息队列部署,主要包括以下四个部分:

         1、namesrv:代替zookeeper做节点管理

         2、broker:进行消息接收,存储,同步,发送,是消息队列的核心

         3、producer:生产者,发送消息到broker

         4、consumer:消费者,从broker中接收消息

 

二、rocketmq安装和配置

         首先需要确保本地可以访问Linux服务器,且Linux服务器不能设置nat,其内外网的IP需要一致才行,否则本地无法与namesrv以及broker建立连接。云服务器可能存在内外网IP不一致的问题,所以建议使用本地虚拟机,或者直接参考第六步建立本地调试环境,直接在本地运行。

安装步骤:

         从http://rocketmq.apache.org/release_notes/release-notes-4.3.2下载rocketmq4.3.2版本,也可以直接从git上下载https://github.com/apache/rocketmq/releases。Apache官网上有打包好了的压缩包,也有源代码包,而git上只有源码包。

这里主要介绍下载源码包,自己编译的流程。

         先下载到本地后,再上传到Linux服务器上(或者直接使用wget命令下载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命令解压。然后进到解压出来的目录下,执行mvn -Prelease-all -DskipTests clean install -U,执行这一步需要提前安装好Java环境和maven环境,这里对jdk和maven环境安装作简单说明。

         下载1.8版本以上的jdk,3.2版本以上的maven,解压并配置环境变量,vim /etc/profile,在文件最后添加,这里的具体路径根据情况做修改。

export JAVA_HOME=/local/jdk1.8.0_191

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export MAVEN_HOME=/local/apache-maven-3.2.5

export PATH=$MAVEN_HOME/bin:$PATH

添加完成后执行source /etc/profile,之后执行java -version和mvn -version检查环境是否安装成功。

安装完成后继续执行打包命令,看到如下的结果说明打包成功。

         在打包完成后,进到distribution/target/apache-rocketmq/bin/目录下,使用vim修改启动脚本,执行vim runserver.sh,主要修改如下配置:

         主要是因为默认的内存申请过大,担心启动时因内存不够而无法启动。修改成如下:

         同样修改vim runbroker.sh文件,修改为如下配置。

 

         在当前目录下执行命令:

         touch ~/logs/rocketmqlogs/namesrv.log创建日志文件

         nohup ./mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log启动namesrv。

         这时因为需要打印日志,无法再输入命令,可以新开一个窗口,来启动broker。在新窗口执行命令:

         touch ~/logs/rocketmqlogs/broker.log

         nohup ./mqbroker -n localhost:9876 & tail -f ~/logs/rocketmqlogs/broker.log来启动broker。

 

         关闭namesrv和broker命令分别为

         ./mqshutdown namesrv

         ./mqshutdown broker

三、示例代码

         这时候的rocketmq已经可以使用了,可以通过Apache提供的示例程序,来使用rocketmq。

创建一个maven项目,引入如下依赖:

    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>4.3.2</version>
    </dependency>

同步发送示例代码

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;

/**
 * 同步发送
 */
public class SyncProducer {
    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new
                DefaultMQProducer("ProducerGroup1");
        //设置namesrv
        producer.setNamesrvAddr("localhost:9876");
        //启动producer服务
        producer.start();
        try {
            for (int i = 0; i < 1000; i++) {
                //指定topic,指定tag,之后可以通过tag来筛选消息
                Message msg = new Message("TopicTest" /* Topic */,
                        "TagA" /* Tag */,
                        ("Hello RocketMQ" +
                                i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
                );
                //发送消息
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
                Thread.sleep(2000);
            }
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        producer.shutdown();
    }
}

 

消费示例代码

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import java.io.IOException;
import java.util.List;

public class Consumer {

    public static void main(String[] args) throws InterruptedException, MQClientException, IOException {
        //使用push监听的方式来接收消息
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup1");
        //设置namesrv
        consumer.setNamesrvAddr("localhost:9876");
        //设置订阅的topic
        consumer.subscribe("TopicTest", "*");
        //设置监听器
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
                                                            ConsumeConcurrentlyContext context) {
                for(MessageExt msg : msgs){
                    System.out.println(new String(msg.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.printf("Consumer Started.%n");
    }
}

发送端在控制台打印:

消费端在控制台打印:

四、添加broker配置

         虽然上述安装后rocketmq已经可以使用,但为了个性化定制或者为了主从配置,我们需要额外添加broker的配置文件。

         broker配置文件在任意目录下创建,我在/usr/local/rocketmq/conf中创建了配置文件broker-master.properties(将其中的ip换成你自己的Linux服务器ip):

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,master和slave的brokerName必须一致
brokerName=broker-master
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割。(配置slave后,需要在这添加slave的ip)
namesrvAddr=ip1:9876;ip2:9876
#指定master地址
#haMasterAddress=ip:10912
# 在发送消息时,自动创建服务器不存在的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= /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
#让broker只有在topic发生变化时才想namesrv注册
#forceRegister=false
#启动并设置filterServer数量
#filterServerNums=1
#启用broker的SQL92过滤
#enablePropertyFilter=true

         之后broker启动时使用-c,来指定具体的配置文件,nohup ./mqbroker -c /usr/local/rocketmq/conf/broker-master.properties & tail -f ~/logs/rocketmqlogs/broker.log

五、主从同步配置

         构造一个最简单的主从同步结构,单master单slave的情况。

         在完成前四步后,我们其实已经有一个角色为master的broker,之后需要在一个新的Linux服务器上启动一个slave节点。主要是broker的配置不同。

#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,master和slave的brokerName必须一致
brokerName=broker-master
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割,ip1是master的ip,ip2是slave的ip。
namesrvAddr=ip1:9876;ip2:9876
#指定master地址
#haMasterAddress=ip:10912
# 在发送消息时,自动创建服务器不存在的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= /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=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
pullMessageThreadPoolNums=128
#让broker只有在topic发生变化时才想namesrv注册
#forceRegister=false
#启动并设置filterServer数量
#filterServerNums=1
#启用broker的SQL92过滤
#enablePropertyFilter=true

         启动顺序:先启动master的namesrv,再启动slave的namesrv,然后启动master的broker,再启动slave的broker。这个启动顺序不是必须的,即使由于顺序不对导致broker向namesrv注册失败,在新的心跳后broker仍可以向master注册。

 

六、构建调试环境   

Windows系统下的调试

         这里基于idea编辑器,进行rocketmq调试。

         从git上下载代码到本地,也可以直接clone到idea中。

         打开rocketmq项目,等待依赖下载完成。

         先添加一个环境变量ROCKETMQ_HOME,值是项目目录,例如E:\rocketmq-all-4.3.2-source-release\rocketmq-all-4.3.2。

         之后在idea中选择Run->EditConfiguration,选择新窗口左上角的+号,添加Application。

         添加broker的配置如下:

其中VM options为:

-server

-Xms1g

-Xmx1g

-Xmn512m

-XX:+UseG1GC

-XX:G1HeapRegionSize=16m

-XX:G1ReservePercent=25

-XX:InitiatingHeapOccupancyPercent=30

-XX:SoftRefLRUPolicyMSPerMB=0

-XX:SurvivorRatio=8

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-XX:+PrintGCApplicationStoppedTime

-XX:+PrintAdaptiveSizePolicy

-XX:+UseGCLogFileRotation

-XX:NumberOfGCLogFiles=5

-XX:GCLogFileSize=30m

-XX:-OmitStackTraceInFastThrow

-XX:+AlwaysPreTouch

-XX:MaxDirectMemorySize=15g

-XX:-UseLargePages

-XX:-UseBiasedLocking

-verbose:gc

-Xloggc:D:\mq_gc1.log

Program arguments的配置是broker配置文件路径。

 

之后再添加namesrv的配置如下:

其中VM options为:

-server
-Xms1g
-Xmx1g
-Xmn512m
-XX:+UseG1GC
-XX:G1HeapRegionSize=16m
-XX:G1ReservePercent=25
-XX:InitiatingHeapOccupancyPercent=30
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:SurvivorRatio=8
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintAdaptiveSizePolicy
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=30m
-XX:-OmitStackTraceInFastThrow
-XX:+AlwaysPreTouch
-XX:MaxDirectMemorySize=15g
-XX:-UseLargePages
-XX:-UseBiasedLocking
-verbose:gc
-Xloggc:D:\mq_gc2.log

之后就可以在idea运行namesrv和broker。

 

如果需要调试mqadmin命令,则添加mqadmin。配置如下:

其中VM options为:

-server
-Xms512m
-Xmx512m
-Xmn128m
-XX:PermSize=128m
-XX:MaxPermSize=128m

另外Program arguments中的就是你需要调试的mqadmin命令。

Linux系统下的调试

rocketmq也可以在Linux下调试,但个人觉得不是很方便。

在Linux系统下,编辑distribution/target/apache-rocketmq/bin/目录下的runbroker.sh和runserver.sh,将这行的注释去掉。

之后就可以使用jdb来调试namesrv和broker。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章