一、RocketMQ安裝(單機)
1、RocketMQ下載 :Apache 官方下載網址:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.0/rocketmq-all-4.3.0-source-release.zip
或者GitHub 官方下載網址:https://github.com/apache/rocketmq
2、將下載RocketMQ上傳至linux
rz
3、將上傳的RocketMQ解壓
unzip rocketmq-all-4.3.0-source-release.zip
4、編譯部署
①在解壓后生成的RocketMQ文件夾下:cd rocketmq-all-4.3.0/,
②使用 Maven 來編譯整個項目 mvn -Prelease-all -DskipTests clean install -U
大約5分鍾后出現如下內容表示部署成功
[INFO] Reactor Summary:
[INFO]
[INFO] Apache RocketMQ 4.3.0 4.3.0 ........................ SUCCESS [02:48 min]
[INFO] rocketmq-logging 4.3.0 ............................. SUCCESS [ 17.417 s]
[INFO] rocketmq-remoting 4.3.0 ............................ SUCCESS [ 11.507 s]
[INFO] rocketmq-common 4.3.0 .............................. SUCCESS [ 8.931 s]
[INFO] rocketmq-client 4.3.0 .............................. SUCCESS [ 14.016 s]
[INFO] rocketmq-store 4.3.0 ............................... SUCCESS [ 8.584 s]
[INFO] rocketmq-srvutil 4.3.0 ............................. SUCCESS [ 2.288 s]
[INFO] rocketmq-filter 4.3.0 .............................. SUCCESS [ 2.438 s]
[INFO] rocketmq-broker 4.3.0 .............................. SUCCESS [ 7.253 s]
[INFO] rocketmq-tools 4.3.0 ............................... SUCCESS [ 3.480 s]
[INFO] rocketmq-namesrv 4.3.0 ............................. SUCCESS [ 1.642 s]
[INFO] rocketmq-logappender 4.3.0 ......................... SUCCESS [ 2.533 s]
[INFO] rocketmq-openmessaging 4.3.0 ....................... SUCCESS [ 3.220 s]
[INFO] rocketmq-example 4.3.0 ............................. SUCCESS [ 1.757 s]
[INFO] rocketmq-test 4.3.0 ................................ SUCCESS [ 5.503 s]
[INFO] rocketmq-distribution 4.3.0 4.3.0 .................. SUCCESS [ 51.228 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:13 min
[INFO] Finished at: 2018-08-10T01:14:58+08:00
[INFO] ------------------------------------------------------------------------
[root@localhost rocketmq-all-4.3.0]#
5、啟動nameserver
①進入目錄: /usr/rocketmq/rocketmq-all-4.3.0/distribution/target/apache-rocketmq
②執行 nohup sh bin/mqnamesrv &
③執行 tail -f ~/logs/rocketmqlogs/namesrv.log,出現以下內容表示nameserver啟動成功
[root@localhost apache-rocketmq]# pwd
/usr/local/rocketmq-all-4.3.0/distribution/target/apache-rocketmq
[root@localhost apache-rocketmq]# nohup sh bin/mqnamesrv &
[1] 5865
[root@localhost apache-rocketmq]# nohup: 忽略輸入並把輸出追加到"nohup.out"
tail -f ~/logs/rocketmqlogs/namesrv.log
2018-08-10 01:29:12 INFO main - tls.client.keyPath = null
2018-08-10 01:29:12 INFO main - tls.client.keyPassword = null
2018-08-10 01:29:12 INFO main - tls.client.certPath = null
2018-08-10 01:29:12 INFO main - tls.client.authServer = false
2018-08-10 01:29:12 INFO main - tls.client.trustCertPath = null
2018-08-10 01:29:13 INFO main - Using OpenSSL provider
2018-08-10 01:29:14 INFO main - SSLContext created for server
2018-08-10 01:29:14 INFO NettyEventExecutor - NettyEventExecutor service started
2018-08-10 01:29:14 INFO main - The Name Server boot success. serializeType=JSON
2018-08-10 01:29:14 INFO FileWatchService - FileWatchService service started
6、啟動broker
①同樣進入 RocketMQ 安裝目錄下的 /usr/rocketmq/rocketmq-all-4.3.0/distribution/target/apache-rocketmq 目錄
②執行nohup sh bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true &
③執行tail -f ~/logs/rocketmqlogs/broker.log
如果看到 "The broker[%s, xxx.xx.xx.xx:10911] boot success..." ,則表示啟動成功
如果看到Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/rocketmq-all-4.3.0/distribution/target/apache-rocketmq/hs_err_pid7209.log
說明內存不足,解決辦法:
①打開目錄rocketmq-all-4.3.0/distribution/target/apache-rocketmq/bin找到nameserver和broker的 runbroker.sh 和 runserver.sh
②runserver.sh 文件中 修改 JVM 配置下的第一行,將原來 4g 調小一點
#===========================================================================================
# JVM Configuration
#===========================================================================================
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -
。。。。
$JAVA ${JAVA_OPT} $@
③runbroker.sh 文件中 修改 JVM 配置下的第一行,將原來 8g 調小一點
#===========================================================================================
# JVM Configuration
#===========================================================================================
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 - XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
。。。。。
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
④然后再次啟動 broker 時就成功了,broker 注冊到了 nameserver 上了(localhost:9876
注意,如果出現出現connect to 172.17.42.1:10911 failed異常處理方案:
1、目錄rocketmq-all-4.3.0/distribution/conf/broker.conf中添加nameserver=127.0.0.1:9876(該地址固定的)
添加brokerip1=192.168.80.4(rocketmq安裝服務器地址)
2、啟動broker:nohup sh mqbroker -n localhost:9876 -c ../conf/broker.conf &
7、關閉broker和nameserver
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
8、rocketmq查看指令
目錄:cd distribution/target/apache-rocketmq/bin
首先進入 RocketMQ 工程,進入/RocketMQ/bin 在該目錄下有個 mqadmin 腳本 .
查看幫助: 在 mqadmin 下可以查看有哪些命令
a: 查看具體命令的使用 : sh mqadmin
b: sh mqadmin help 命令名稱
例如,查看 updateTopic 的使用
sh mqadmin help updateTopic
2. 關閉nameserver和所有的broker:
進入到bin下:
sh mqshutdown namesrv
sh mqshutdown broker
3. 查看所有消費組group:
sh mqadmin consumerProgress -n 192.168.1.23:9876
4. 查看指定消費組下的所有topic數據堆積情況:
sh mqadmin consumerProgress -n 192.168.1.23:9876 -g warning-group
5. 查看所有topic :
sh mqadmin topicList -n 192.168.1.23:9876
6. 查看topic信息列表詳情統計
sh mqadmin topicstatus -n 192.168.1.23:9876 -t topicWarning
7. 新增topic
sh mqadmin updateTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning
8. 刪除topic
sh mqadmin deleteTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning
9、查詢集群消息
sh mqadmin clusterList -n 192.168.1.23:9876
二、RocketMQ可視化界面安裝
1、下載文件 https://github.com/apache/rocketmq-externals ,上傳到linxu
2、解壓 unzip rocketmq-externals-master.zip 解壓文件
3、修改配置文件;(usr/local/rocketmq-externals-master/目錄下)
find -name application.properties 可以查看到兩個文件都在rocketmq-console文件目錄下
vim application.properties
rocketmq.config.namesrvAddr=linux服務器ip:9876(ip1:port;ip2:port)
server.port=8081 --(這里端口號為訪問這個可視化界面的端口號)
4、編譯 usr/local/rocketmq-externals-master/rocketmq-console/目錄下
執行mvn clean package -Dmaven.test.skip=true
編譯成功后,在rocketmq-console目錄下會生成一個目錄:target目錄,該目錄下有啟動rocketmq界面的jar文件
6、本地瀏覽器執行 http://192.168.80.4:8081/#/topic 便可以了
二、基於docker安裝rocketmq
1、 拉取rocketmq鏡像
docker pull rocketmqinc/rocketmq
2、 拉取rocketmq-console鏡像
docker pull styletang/rocketmq-console-ng
3、 啟動nameserver
docker run -d -p 9876:9876 -v `pwd`/data/namesrv/logs:/root/logs -v `pwd`/data/namesrv/store:/root/store --name rmqnamesrv rocketmqinc/rocketmq sh mqnamesrv
4、 啟動broker
docker run -d -p 10911:10911 -p 10909:10909 -v `pwd`/data/broker/logs:/root/logs -v `pwd`/data/broker/store:/root/store --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" rocketmqinc/rocketmq sh mqbroker -c ../conf/broker.conf
由於啟動broker時rocketmq默認指定為內網地址,會導致外網無法連接到broker,報出如下錯誤信息: connect to xxx.xx.xx.xx:10911 failed
解決方案:
①docker exec -it xxxxx bash --xxx是指broker對應的containerid(通過docker ps查看對應containerid)
②cd ../conf
③vi broker.conf
④增加brokerIP1 = xxx.xxx.xxx.xxx --這里的ip地址指定為外網地址(即服務器地址)
⑤重啟broker容器
5、 啟動rocketmq-console
docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=xxx.xxx.xxx.xxx:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8080:8080 -t styletang/rocketmq-console-ng
--- xxx.xxx.xxx.xxx 為服務器地址
三、模塊

1.OPS

這里很容易看清楚,雙擊標簽可以修改NameSer
的IP+Port
。這里我測試過修改端口,發現重新發送一樣的消息,還是能消費。
其實也能理解,因為NameSer
改變了,也只是使得Broker
不能從本地獲取最新的路由信息。但是本地還是緩存了路由信息,所以一樣的Topic
還是能獲取到路由信息,可以獲取到路由信息還是能發送到Brokder
。
所以這里我的測試是一次失敗的對照測試,但是這個模塊平時需求不大,就過了。
2.Dashboard

此圖表較簡單,其實是指所有Brokder
處理消息的數量。比如從上圖可以看出來,我只有一個Brokder
,並且此Brokder
處理了6條消息。

此圖標可以篩選出某個Topic
下5分鍾的消息數量。但是可以切換時間,所以就相當於可以查看某個Topic
下的消息數量趨勢。
這條趨勢曲線有時候貌似不准確,測試過幾次有一次在那個時間點並沒有變化。
3.Cluster

這里有點坑,Cluster
翻譯過來叫集群。這里並不是指消費模式中的集群消費,而是指Brokder
的集群部署
但是我這里並沒有使用Broker
的集群部署,所以只有一條數據。如果有多個broker
那這里應該有多行數據。
每一行中各項代表的意思如下
- Broker ---
Broker
的名字 - Address --- 地址
- Today Produce Count --- 今天發送的消息數量
- Today Consume Count ---- 今天消費的消息數量
4.Topic
Topic
算是重點之一。

這里的ADD/UPDATE
是有作用的,可以在這里添加一個Topic
,經過測試,感覺在這里意義不大。這里涉及到**消息的發送消費與Topic
、Broker
**的關系,下篇文章分析。
每一行的Topic
分成如下幾個操作按鈕

點擊第一個[status]按鈕。顯示如下界面。可以從中獲取的信息比較多。該消息隊列的Topic
、BrokerName
、queueId
。
這里涉及到發送消息的原理。簡單來說
通過一個Topic可以獲取到對應的路由信息,路由信息里面維護了消息隊列集合,而我們發送消息其實就是通過消息隊列發送
消息隊列集合是個集合,所以也是有集合的屬性。其中每一項就是消息隊列,就是如下圖的每一行,每一行在集合中的位置就是queueId

點擊第二項是保存在NameSer
的路由信息。

這里可能要注意下。保存在NameServer
的路由信息和本地緩存的不一樣,本地緩存的屬性內容更豐富更多。看看源碼吧!
保存在NameSer
的路由對象
public class TopicRouteData extends RemotingSerializable { private String orderTopicConf; private List<QueueData> queueDatas; private List<BrokerData> brokerDatas; private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable; } 復制代碼
發現沒,其中包含的屬性和如上圖片類似。
queueDatas
和brokerDatas
,其中queueDatas
包含消息隊列的基本情況,讀/寫的最大數目,brokerDatas
包含Broker
的位置信息。
再看看本地的真正路由信息,如上對象是它的屬性。
public class TopicPublishInfo { private boolean orderTopic = false; private boolean haveTopicRouterInfo = false; private List<MessageQueue> messageQueueList = new ArrayList<MessageQueue>(); private volatile ThreadLocalIndex sendWhichQueue = new ThreadLocalIndex(); private TopicRouteData topicRouteData; } 復制代碼
這下很明白了。
第三項[Consumer Manage],看名字也知道啥意思,該Topic
的消費管理。
第四項[Topic Config],修改Topic
的屬性,沒啥作用,本來代碼也可以控制。
第五項[Send Message],向該Topic
發送消息。可以測試玩玩,將Consumer
配置好,然后運行,不通過代碼發送,在這里發送消息,Consumer
也能接受到。


5.Consumer

沒太看懂這每一行代表啥意思。估計是一個Consumer
對象。后面幾個按鈕點擊后,可以看看該Consumer
的具體配置信息,好像沒啥東西。
6.Message
該模塊很重要,信息量也很多。

比較容易理解,根據如上三項對Message
分組查詢。一般第一項根據Topic
查詢比較多。因為據說根據key
去查詢有坑。建議id
和Topic
,id
因為唯一最簡單。

這是該Topic
下的所有消息,不管是否消費都在內。
Message ID 、Tag 、Key都是消息比較重要的屬性。點擊右方的按鈕,可以看到該消息更加具體的情況。

注意點都用箭頭標出來了,其他可能比較容易理解,無非就那幾個屬性。最后的TrackType
很重要,對於排查問題。該屬性的值有好幾個,現在看到的幾個總結如下
- CONSUMED 代表該消息已經被消費
- NOT_CONSUME_YET 還沒被消費
- UNKNOW_EXCEPTION 報錯了,可以看日志,一般報錯內容會緊跟其后,具體很容易排查出來
- NOT_ONLINE 代表該
Consumer
並沒有運行