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:
启动broker(单个broker)
在bin目录下:
nohup sh mqbroker -n 10.10.30.63:9876 autoCreateTopicEnable=true &
在指定的log路径下查看broker.log
关于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)。
生产者客户端日志:
接下来启动测试用消费者客户端,同样进入bin目录:
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
在日志中可见启动成功,并可以看见生产者生产的消息:
到这里,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成功:
此时target文件夹下会生成rocketmq-console-ng-1.0.0.jar,在target目录下,执行java -jar rocketmq-console-ng-1.0.0.jar
启动console。
启动成功! 可以通过右上角修改语言。
坑
坑之一
启动时后,生产者客户端连接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