Rocket搭建及刨坑

RocketMQ安装

安装条件

Linux服务器

maven

JAVA环境配置

git(使用git安装的情况下)

1、使用git进行安装

通过git命令从仓库中下载RocketMQ的源码:

git clone https://github.com/apache/incubator-rocketmq.git

建议通过指定release版本的方式进行clone,否则可能会发生一些问题(亲身体会)

git clone -b release-4.1.0-incubating https://github.com/apache/incubator-rocketmq.git

可以从RocketMQ的github中选择一个想要安装的版本。Apache RocketMQ为Alibaba donate,目前来看Apache的版本维护的人较多,更新较频繁。

2、从RocketMQ的github上下载release版本

第二种方式,直接从github上下载release版本的tar包,再放入linux服务器中。(这种方式比较安全,出现的问题较少,亲身体会:))

将tar包放入指定的路径下并解压,因tar包文件夹名称较长,建议修改为较短较容易记住的名称,这里我将文件夹名称修改为incubating-rocketmq-4.1.0

构建

因为从github下载下来的为源码,因此我们需要将源码进行编译,此时我们需要在目标服务器安装maven并配置环境变量。

maven安装
RocketMQ构建

进入RocketMQ路径下进行构建。此时需要注意文件的权限问题

cd /home/liang/git/incubating-rocketmq-4.1.0
mvn -Prelease-all -DskipTests clean install -U

编译成功后会提示Success.

设置环境变量
vim /etc/profile
...
export rocketmq=/home/liang/git/incubating-rocketmq-4.1.0/distribution/target/apache-rocketmq
...
...
...
#在PATH最后追加$rocketmq/bin
export PATH=$PATH:$rocketmq/bin
...
...
:q
...
#使环境变量生效
source /etc/profile
#确认环境变量生效
env | grep rocketmq
设置RocketMQ日志路径

由实践得知,RocketMQ的日志实在是有些大,而且日志路径默认在user的home目录下,如果使用RocketMQ时用的是root账号,那么日志会存在/root目录下,此时如果根目录磁盘剩余空间不是很大,可能会造成磁盘沾满的情况(亲身实践)。因此:1、尽量不要用root账号操作RocketMQ;2、可以通过配置文件修改RocketMQ的日志路径。

cd /home/liang/git/incubating-rocketmq-4.1.0/distribution/target/apache-rocketmq/conf

该目录下有几个logback*.xml文件,将文件中的${user.home}/logs/rocketmqlogs/broker_default.log修改为目标日志路径即可。

设置启动脚本中的JVM参数
/home/liang/git/incubating-rocketmq-4.1.0/distribution/target/apache-rocketmq/bin

修改runserver.sh及runbroker.sh中的JVM参数,可根据服务器实际情况进行配置。

当前使用的服务器资源较紧张,以下为我的namesrv配置及broker配置:

runserver.sh:

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:PermSize=32m -XX:MaxPermSize=64m"

runbroker.sh:

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"

RocketMQ启动及测试

启动nameserver

首先,为了省事儿,先在环境变量中指定nameserver的端口。

.bashrc中添加export NAMESRV_ADDR=10.10.30.63:9876并使之生效,这样启动nameserver时的默认端口就是9876(也可自定义为其他端口)。

在bin目录下:

nohup sh mqnamesrv &

查看nohup:

Rocket搭建及刨坑_第1张图片
mark
启动broker(单个broker)

在bin目录下:

nohup sh mqbroker -n 10.10.30.63:9876 autoCreateTopicEnable=true &

在指定的log路径下查看broker.log

Rocket搭建及刨坑_第2张图片
mark

关于autoCreateTopicEnable参数: 如没有特殊需要,启动broker时建议将该参数设置为true。

测试一下

RocketMQ的包中自带了可用于测试的生产者和消费者客户端(阿里还是蛮贴心)。

进入RocketMQ的bin目录,启动生产者:

sh tools.sh org.apache.rocketmq.example.quickstart.Producer

可见启动成功并生产消息,topic为TopicTest:

这里就涉及到启动broker时的autoCreateTopicEnable参数,如果未设置为true,则需要手动添加TopicTest这个topic,如果未手动添加这个topic,启动测试生产者时会报错(MQClientException: No route info of this topic)。

生产者客户端日志:

Rocket搭建及刨坑_第3张图片
mark

接下来启动测试用消费者客户端,同样进入bin目录:

sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

在日志中可见启动成功,并可以看见生产者生产的消息:

Rocket搭建及刨坑_第4张图片
mark

到这里,RocketMQ的搭建基本完成,最后,如何关闭RocketMQ呢?

关闭RocketMQ服务

shutdown

RocketMQ的shutdown命令很简单,进入bin目录,运行mqshutdown即可:

#shutdown nameserver
sh mqshutdown namesrv
#shutdown broker
sh mqshutdown broker

RocketMQ Console搭建

首先需要配置console的启动端口及nameserver地址

配置文件路径:

/home/liang/git/rocketmq-externals-master/rocketmq-externals-master/rocketmq-console/src/main/resources/application.properties

编辑application.properties文件:

  1 server.contextPath=
  
  #console启动端口
  2 server.port=28080
  3 #spring.application.index=true
  4 spring.application.name=rocketmq-console
  5 spring.http.encoding.charset=UTF-8
  6 spring.http.encoding.enabled=true
  7 spring.http.encoding.force=true
  8 logging.config=classpath:logback.xml
  9 #if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops     page.default localhost:9876
  
  #配置rocketmq nameserver的ip及端口,如有多个则用逗号间隔。
 10 rocketmq.config.namesrvAddr=10.10.30.63:9876
 11 #if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
 12 rocketmq.config.isVIPChannel=
 13 #rocketmq-console's data path:dashboard/monitor
 
 #console数据存放地址
 14 rocketmq.config.dataPath=/home/liang/data/rocketmq
 15 #set it false if you don't want use dashboard.default true
 16 rocketmq.config.enableDashBoardCollect=true

回到console文件夹,进行编译:

cd /home/liang/git/rocketmq-externals-master/rocketmq-externals-master/rocketmq-console
mvn clean package -Dmaven.test.skip=true

Build成功:

Rocket搭建及刨坑_第5张图片
mark

此时target文件夹下会生成rocketmq-console-ng-1.0.0.jar,在target目录下,执行java -jar rocketmq-console-ng-1.0.0.jar启动console。

启动成功! 可以通过右上角修改语言。

Rocket搭建及刨坑_第6张图片
mark

坑之一

启动时后,生产者客户端连接RocketMQ时报错:

org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <172.17.0.1:10909> failed
    at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:357)
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:343)
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:327)
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:290)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:688)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendSelectImpl(DefaultMQProducerImpl.java:901)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:878)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:873)
    at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:369)
    at com.emrubik.uc.mdm.sync.utils.MdmInit.sendMessage(MdmInit.java:62)
    at com.emrubik.uc.mdm.sync.utils.MdmInit.main(MdmInit.java:2149)
原因

RocketMQ部署在虚拟机上,内网ip为10.10.30.63,该虚拟机一个docker0网卡,ip为172.17.0.1。RocketMQ broker启动时默认使用了docker0网卡,生产者客户端无法连接172.17.0.1,造成以上问题。

解决方法

1、干掉docker0网卡(______(:з)∠)__)

2、停掉broker,修改broker配置文件,重启broker。

broker配置文件路径:

/home/liang/git/incubating-rocketmq-4.1.0/distribution/target/apache-rocketmq/conf

增加以下两行来指定broker启动的ip

namesrvAddr = 10.10.30.63:9876
brokerIP1 = 10.10.30.63

也可以通过配置listenPort = 10911*来指定broker端口

坑之二

RocketMQ console报错

[2017-12-07 17:18:02.598]  WARN examineConsumerConnectionInfo exception, FILTERSRV_CONSUMER
org.apache.rocketmq.client.exception.MQClientException: CODE: 17  DESC: No topic route info in name server for the topic: %RETRY%FILTERSRV_CONSUMER
See http://rocketmq.apache.org/docs/faq/ for further details.
    at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:1212)
    at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.examineTopicRouteInfo(DefaultMQAdminExtImpl.java:274)
    at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.examineConsumerConnectionInfo(DefaultMQAdminExtImpl.java:293)
    at org.apache.rocketmq.tools.admin.DefaultMQAdminExt.examineConsumerConnectionInfo(DefaultMQAdminExt.java:223)
    at org.apache.rocketmq.console.service.client.MQAdminExtImpl.examineConsumerConnectionInfo(MQAdminExtImpl.java:188)

目前未找到问题根源,继续探索中...

TBC

你可能感兴趣的:(Rocket搭建及刨坑)