RocketMQ搭建及刨坑

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:

mark
啟動broker(單個broker)

在bin目錄下:

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

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

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)。

生產者客戶端日志:

mark

接下來啟動測試用消費者客戶端,同樣進入bin目錄:

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

在日志中可見啟動成功,并可以看見生產者生產的消息:

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成功:

mark

此時target文件夾下會生成rocketmq-console-ng-1.0.0.jar,在target目錄下,執行java -jar rocketmq-console-ng-1.0.0.jar啟動console。

啟動成功! 可以通過右上角修改語言。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容