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