RocketMQ 簡單梳理 及 叢集部署筆記

散盡浮華發表於2018-05-09

 

一、RocketMQ 基礎知識介紹
Apache RocketMQ是阿里開源的一款高效能、高吞吐量、佇列模型的訊息中介軟體的分散式訊息中介軟體。

上圖是一個典型的訊息中介軟體收發訊息的模型,RocketMQ也是這樣的設計,簡單說來
RocketMQ具有以下特點:
1)是一個佇列模型的訊息中介軟體,具有高效能、高可靠、高實時、分散式特點。
2)Producer、Consumer、佇列都可以分散式。
3)Producer向一些佇列輪流傳送訊息,佇列集合稱為Topic,Consumer如果做廣播消費,則一個consumer例項消費這個Topic對應的所有佇列,如果做叢集消費,則多個Consumer例項平均消費這個topic對應的佇列集合。
4)支援嚴格的訊息順序;
5)提供豐富的訊息拉取模式
6)高效的訂閱者水平擴充套件能力
7)實時的訊息訂閱機制
8)億級訊息堆積能力
9)較少的依賴
10)支援Topic與Queue兩種模式;
11)同時支援Push與Pull方式消費訊息;

訊息佇列的應用場景
1)非同步處理
將不是必須的業務邏輯,進行非同步處理,比如註冊之後簡訊、郵箱的傳送

2)應用解耦
訂單系統:使用者下單後,訂單系統完成持久化處理,將訊息寫入訊息佇列,返回使用者訂單下單成功。
庫存系統:訂閱下單的訊息,採用拉/推的方式,獲取下單資訊,庫存系統根據下單資訊,進行庫存操作。
假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入訊息佇列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦。

3)流量削鋒,也是訊息佇列中的常用場景,一般在秒殺或團搶活動中使用廣泛。
應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入訊息佇列。
a)可以控制活動的人數;
b)可以緩解短時間內高流量壓垮應用;
c)使用者的請求,伺服器接收後,首先寫入訊息佇列。假如訊息佇列長度超過最大數量,則直接拋棄使用者請求或跳轉到錯誤頁面;
d)秒殺業務根據訊息佇列中的請求資訊,再做後續處理。

4)日誌處理

5)訊息通訊
訊息通訊是指,訊息佇列一般都內建了高效的通訊機制,因此也可以用在純的訊息通訊。比如實現點對點訊息佇列,或者聊天室等。

6)效能
RocketMQ單機也可以支援億級的訊息堆積能力。單機寫入TPS單例項約7萬條/秒,單機部署3個Broker,可以跑到最高12萬條/秒,訊息大小10個位元組

RocketMQ 物理部署結構

如上圖所示, RocketMQ的部署結構有以下特點:
1)Name Server 可叢集部署,節點之間無任何資訊同步。
2)Broker(訊息中轉角色,負責儲存訊息,轉發訊息) 部署相對複雜,Broker 分為Master 與Slave,一個Master 可以對應多個Slave,但是一個Slave 只能對應一個Master,Master 與Slave 的對應關係通過指定相同的BrokerName,不同的BrokerId來定 義,BrokerId為0 表示Master,非0 表示Slave。Master 也可以部署多個。
3)Producer 與Name Server 叢集中的其中一個節點(隨機選擇)建立長連線,定期從Name Server 取Topic 路由資訊,並向提供Topic 服務的Master 建立長連線,且定時向Master 傳送心跳。Producer 完全無狀態,可叢集部署。
4)Consumer 與Name Server 叢集中的其中一個節點(隨機選擇)建立長連線,定期從Name Server 取Topic 路由資訊,並向提供Topic 服務的Master、Slave 建立長連線,且定時向Master、Slave 傳送心跳。Consumer既可以從Master 訂閱訊息,也可以從Slave 訂閱訊息,訂閱規則由Broker 配置決定。

Broker:訊息中轉角色,負責儲存訊息,轉發訊息
Broker叢集有多種配置方式:
1)單Master
優點:除了配置簡單沒什麼優點
缺點:不可靠,該機器重啟或當機,將導致整個服務不可用
2)多Master
優點:配置簡單,效能最高
缺點:可能會有少量訊息丟失(配置相關),單臺機器重啟或當機期間,該機器下未被消費的訊息在機器恢復前不可訂閱,影響訊息實時性
3)多Master多Slave,每個Master配一個Slave,有多對Master-Slave,叢集採用非同步複製方式,主備有短暫訊息延遲,毫秒級
優點:效能同多Master幾乎一樣,實時性高,主備間切換對應用透明,不需人工干預
缺點:Master當機或磁碟損壞時會有少量訊息丟失
4)多Master多Slave,每個Master配一個Slave,有多對Master-Slave,叢集採用同步雙寫方式,主備都寫成功,嚮應用返回成功
優點:服務可用性與資料可用性非常高
缺點:效能比非同步叢集略低,當前版本主宕備不能自動切換為主

Master和Slave的配置檔案參考conf目錄下的配置檔案
Master與Slave通過指定相同的brokerName引數來配對,Master的BrokerId必須是0,Slave的BrokerId必須是大於0的數。
一個Master下面可以掛載多個Slave,同一Master下的多個Slave通過指定不同的BrokerId來區分。

Rocketmq預設給出了三種建議配置模式: 2m-2s-async(主從非同步); 2m-2s-sync(主從同步); 2m-noslave(僅master)

7)訊息重試

MQ 消費者的消費邏輯失敗時,可以通過設定返回狀態達到訊息重試的結果。
MQ 訊息重試只針對叢集消費方式生效;廣播方式不提供失敗重試特性,即消費失敗後,失敗訊息不再重試,繼續消費新的訊息。

重試次數
MQ 預設允許每條訊息最多重試 16 次,每次重試的間隔時間如下:

如果訊息重試 16 次後仍然失敗,訊息將不再投遞。如果嚴格按照上述重試時間間隔計算,某條訊息在一直消費失敗的前提下,將會在接下來的 4 小時 46 分鐘之內進行 16 次重試,超過這個時間範圍訊息將不再重試投遞。
注意: 一條訊息無論重試多少次,這些重試訊息的 Message ID 不會改變。

配置方式
a)消費失敗後,重試配置方式
叢集消費方式下,訊息消費失敗後期望訊息重試,需要在訊息監聽器介面的實現中明確進行配置(三種方式任選一種):
-  返回 Action.ReconsumeLater (推薦)
-  返回 Null
-  丟擲異常

程式碼示例如下:

public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
//方法3:訊息處理邏輯丟擲異常,訊息將重試
doConsumeMessage(message);
//方式1:返回 Action.ReconsumeLater,訊息將重試
return Action.ReconsumeLater;
//方式2:返回 null,訊息將重試
return null;
//方式3:直接丟擲異常, 訊息將重試
throw new RuntimeException("Consumer Message exceotion");
}
}

b)消費失敗後,不重試配置方式
叢集消費方式下,訊息失敗後期望訊息不重試,需要捕獲消費邏輯中可能丟擲的異常,最終返回 Action.CommitMessage,此後這條訊息將不會再重試。程式碼示例如下:

public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
try {
doConsumeMessage(message);
} catch (Throwable e) {
//捕獲消費邏輯中的所有異常,並返回 Action.CommitMessage;
return Action.CommitMessage;
}
//訊息處理正常,直接返回 Action.CommitMessage;
return Action.CommitMessage;
}
}

自定義訊息最大重試次數
自定義 MQ 客戶端日誌配置,請升級 TCP Java SDK 版本到1.2.2及以上。

MQ 允許 Consumer 啟動的時候設定最大重試次數,重試時間間隔將按照如下策略:
-  最大重試次數小於等於16次,則重試時間間隔同上表描述。
-  最大重試次數大於16次,超過16次的重試時間間隔均為每次2小時。

配置方式如下:

Properties properties = new Properties();
//配置對應 Consumer ID 的最大訊息重試次數為20 次
properties.put(PropertyKeyConst.MaxReconsumeTimes,"20");
Consumer consumer =ONSFactory.createConsumer(properties);

需要注意:
- 訊息最大重試次數的設定對相同 Consumer ID 下的所有 Consumer 例項有效。
- 如果只對相同 Consumer ID 下兩個 Consumer 例項中的其中一個設定了 MaxReconsumeTimes,那麼該配置對兩個 Consumer 例項均生效。
- 配置採用覆蓋的方式生效,即最後啟動的 Consumer 例項會覆蓋之前的啟動例項的配置。

獲取訊息重試次數
消費者收到訊息後,可按照如下方式獲取訊息的重試次數:

public class MessageListenerImpl implements MessageListener {
@Override
public Action consume(Message message, ConsumeContext context) {
//獲取訊息的重試次數
System.out.println(message.getReconsumeTimes());
return Action.CommitMessage;
}
}

二、RocketMQ叢集部署記錄

部署需求(如果是兩臺機器,可以做一主一從,即broker-a主節點和nameserver在一臺機器,broker-a-s從節點在另一臺機器),本案例是5臺機器:
準備5臺虛擬機器,其中4臺作為rocektmq broker(雙master 雙slave,同步雙寫,非同步刷盤),另1臺用作rocektmq的console(rocketmq監控平臺)和nameserver。
0)基礎資訊

ip地址                  主機名                     角色
192.168.10.202         mq-master01              broker-a
192.168.10.203         mq-master02              broker-b
192.168.10.205         mq-slave01               broker-a-s
192.168.10.206         mq-slave02               broker-b-s
192.168.10.207         mq-console-nameserver    nameserver、console
--------------------------------------------------------------------------
其實也可以不用那麼多機器,2臺機器也可以,broker-a和broker-b-s在一臺機器(也就是說broker-a的主節點與broker-b的從節點部署在一臺伺服器),
broker-a-s和broker-b在一臺機器。nameserver和console部署到2臺中的任一臺上。
--------------------------------------------------------------------------

關閉5臺機器的iptables和selinux(所有節點機器上都要操作)
[root@mq-master01 ~]# /etc/init.d/iptables stop
[root@mq-master01 ~]# vim /etc/sysconfig/selinux
......
SELINUX=disabled
[root@mq-master01 ~]# setenforce 0
[root@mq-master01 ~]# getenforce
Permissive

5臺機器都要安裝統一的java環境(這裡安裝jdk1.8,參考:http://www.cnblogs.com/kevingrace/p/7607442.html)
[root@mq-master01 ~]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
--------------------------------------------------------------------------

5臺機器一定要提前做hosts繫結,否則後續啟動broker的時候,會報錯諸如:
java.net.UnknownHostException: mq-master01: mq-master01: Name or service not known

[root@mq-master01 bin]# cat /etc/hosts
......
192.168.10.202         mq-master01
192.168.10.203         mq-master02
192.168.10.205         mq-slave01
192.168.10.206         mq-slave02
192.168.10.207         mq-console-nameserver

1)rocektmq broker 雙master雙slave部署

1)安裝rocketmq(四臺broker節點機器操作一樣)
下載地址:https://pan.baidu.com/s/16UAXHwzzy0DoGX4u93vK7A
提取密碼:rjib

[root@mq-master01 software]# pwd
/data/software
[root@mq-master01 software]# unzip rocketmq3.2.6.zip
[root@mq-master01 software]# ln -s /data/software/alibaba-rocketmq3.2.6 /data/rocketmq

建立儲存路徑
[root@mq-master01 software]# mkdir -p /data/rocketmq/store
[root@mq-master01 software]# mkdir -p /data/rocketmq/store/commitlog
[root@mq-master01 software]# mkdir -p /data/rocketmq/store/consumequeue
[root@mq-master01 software]# mkdir -p /data/rocketmq/store/index

[root@mq-master01 software]# ls /data/rocketmq/
benchmark  bin  conf  issues  lib  LICENSE.txt  readme.txt  store  test  wiki
[root@mq-master01 software]# ls /data/rocketmq/store/
commitlog  consumequeue  index
---------------------------------------------------------------------------------
2)配置rocektmq broker (四個節點機器都要操作)

mq-master01節點配置/data/rocketmq/conf/2m-2s-sync/broker-a.properties
[root@mq-master01 ~]# vim /data/rocketmq/conf/2m-2s-sync/broker-a.properties
#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣  例如:在a.properties 檔案中寫 broker-a  在b.properties 檔案中寫 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,這裡nameserver是單臺,如果nameserver是多臺叢集的話,就用分號分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.10.207:9876;
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數。由於是4個broker節點,所以設定為4
defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠
listenPort=10911
#刪除檔案時間點,預設凌晨 4點
deleteWhen=04
#檔案保留時間,預設 48 小時
fileReservedTime=120
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理檔案磁碟空間
diskMaxUsedSpaceRatio=88
#儲存路徑
storePathRootDir=/data/rocketmq/store
#commitLog 儲存路徑
storePathCommitLog=/data/rocketmq/store/commitlog
#消費佇列儲存路徑儲存路徑
storePathConsumeQueue=/data/rocketmq/store/consumequeue
#訊息索引儲存路徑
storePathIndex=/data/rocketmq/store/index
#checkpoint 檔案儲存路徑
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 檔案儲存路徑
abortFile=/data/rocketmq/store/abort
#限制的訊息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 非同步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=MASTER                       #要配置為MASTER或SLAVE的角色
#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
#checkTransactionMessageEnable=false
#發訊息執行緒池數量
#sendMessageThreadPoolNums=128
#拉訊息執行緒池數量
#pullMessageThreadPoolNums=128

mq-master02節點配置的是/data/rocketmq/conf/2m-2s-sync/broker-b.properties      #就下面三行配置不一樣,其他配置行都一樣!
[root@mq-master02 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-b.properties      
......
brokerName=broker-b            
brokerId=0
brokerRole=MASTER   

mq-slave01節點配置的是/data/rocketmq/conf/2m-2s-sync/broker-a-s.properties
[root@mq-slave01 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-a-s.properties
......
brokerName=broker-a          #注意這一行的名稱要和master保持一致
brokerId=1                   #這個ID要跟master的不一致!
brokerRole=SLAVE             #要配置為從

mq-slave02節點配置的是/data/rocketmq/conf/2m-2s-sync/broker-b-s.properties
[root@mq-slave02 software]# vim /data/rocketmq/conf/2m-2s-sync/broker-b-s.properties
......
brokerName=broker-b         #注意這一行的名稱要和master的保持一致
brokerId=1                  #這個ID要跟master的不一致
brokerRole=SLAVE            #要配置為從
---------------------------------------------------------------------------------
3)修改日誌檔案(四個節點機器都要操作)
[root@mq-master01 ~]# mkdir -p /data/rocketmq/logs
[root@mq-master01 ~]# cd /data/rocketmq/conf
[root@mq-master01 conf]# sed -i 's#${user.home}#/data/rocketmq#g' *.xml
---------------------------------------------------------------------------------

2)nameserver 部署(192.168.10.207節點機上操作)

下載地址:https://pan.baidu.com/s/1vPI0eB5f2dQLTai02wA2_w
提取密碼:ytv6
 
[root@mq-console-nameserver ~]# cd /data/software/
[root@mq-console-nameserver ~]# ls
rocketmq_namesrv.zip
[root@mq-console-nameserver software]# unzip rocketmq_namesrv.zip
[root@mq-console-nameserver software]# ln -s /data/software/rocketmq_namesrv /data/rocketmq_namesrv
[root@mq-console-nameserver software]# vim /data/rocketmq_namesrv/conf/namesrv.properties             #該檔案只有下面一行內容
stenPort=9876

3)啟動NameServer和BrokerServer

溫馨提示:
啟動順序:先啟動NameServer,再啟動BrokerServer(啟動BrokerServer之前先關閉防火牆)
停止順序:先停止BrokerServer,再停止NameServer
 
首先在5個節點機器上設定下rocketmq啟動的java路徑,否則會報錯:
ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! !!
(可以使用find / -name java找出java的安裝路徑,取出JAVA_HOME路徑)
[root@mq-master01 bin]# vim /data/rocketmq/bin/runbroker.sh
.....
JAVA_HOME=/usr/java/jdk1.8.0_131          #加入這一行

1)首先在192.168.10.207節點機器上啟動NameServer
NameServer預設有一個啟動指令碼startNameServer.sh,修改如下:
[root@mq-console-nameserver ~]# cat /data/rocketmq_namesrv/startNameServer.sh 
export JAVA_HOME=/usr/java/jdk1.8.0_131
nohup sh /data/rocketmq_namesrv/alibaba-rocketmq/bin/mqnamesrv -c /data/rocketmq_namesrv/conf/namesrv.properties  > ./nohup.out 2>&1 &

[root@mq-console-nameserver ~]# chmod 755 /data/rocketmq_namesrv/alibaba-rocketmq/bin/*
[root@mq-console-nameserver ~]# sh /data/rocketmq_namesrv/startNameServer.sh
[root@mq-console-nameserver ~]# lsof -i:9876
COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    32336 root   49u  IPv6 24559963      0t0  TCP *:sd (LISTEN)

2)接著在四個broker節點機器上啟動BrokerServer
[root@mq-master01 ~]# cd /data/rocketmq/bin
[root@mq-master01 bin]# nohup sh mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-a.properties >/dev/null 2>&1 &
[root@mq-master01 bin]# ps -ef|grep rocketmq
root      9978  9167  0 17:51 pts/0    00:00:00 sh mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-a.properties
root      9982  9978  0 17:51 pts/0    00:00:00 sh /data/rocketmq/bin/runbroker.sh com.alibaba.rocketmq.broker.BrokerStartup -c /data/rocketmq/conf/2m-2s-sync/broker-a.properties
root      9985  9982  4 17:51 pts/0    00:00:03 /usr/java/jdk1.8.0_131/bin/java -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -verbose:gc -Xloggc:/root/rmq_bk_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:-OmitStackTraceInFastThrow -Djava.ext.dirs=/data/rocketmq/bin/../lib -cp .:/data/rocketmq/bin/../conf:.:/lib/dt.jar:/lib/tools.jar com.alibaba.rocketmq.broker.BrokerStartup -c /data/rocketmq/conf/2m-2s-sync/broker-a.properties
root     10039  9167  0 17:52 pts/0    00:00:00 grep rocketmq

[root@mq-master01 bin]# lsof -i:10911          #注意只有master節點的10911埠才能起來,slave節點的10911埠不會起來。
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    9985 root   68u  IPv6 7969295      0t0  TCP *:10911 (LISTEN)
[root@mq-master01 bin]# jps
9985 BrokerStartup
10044 Jps
[root@mq-master01 bin]# tail -f -n 500 /data/rocketmq/logs/rocketmqlogs/broker.log
2018-05-09 17:59:57 INFO main - rocketmqHome=/data/rocketmq
2018-05-09 17:59:57 INFO main - namesrvAddr=192.168.10.207:9876;
2018-05-09 17:59:57 INFO main - brokerIP1=192.168.10.202
2018-05-09 17:59:57 INFO main - brokerIP2=192.168.10.202
2018-05-09 17:59:57 INFO main - brokerName=broker-a
........
2018-05-09 19:06:04 INFO main - flushDelayOffsetInterval=10000
2018-05-09 19:06:04 INFO main - cleanFileForciblyEnable=true
2018-05-09 19:06:04 INFO main - user specfied name server address: 192.168.10.207:9876;
2018-05-09 19:06:05 INFO main - load /data/software/rocketmq/store/config/consumerOffset.json OK
2018-05-09 19:06:05 INFO main - load /data/software/rocketmq/store/config/delayOffset.json OK
2018-05-09 19:06:05 INFO PullRequestHoldService - PullRequestHoldService service started
2018-05-09 19:06:05 INFO main - register broker to name server 192.168.10.207:9876 OK
2018-05-09 19:06:05 INFO main - The broker[broker-a, 192.168.10.202:10911] boot success. and name server is 192.168.10.207:9876;
2018-05-09 19:06:15 INFO BrokerControllerScheduledThread1 - slave fall behind master, how much, 0 bytes
2018-05-09 19:06:15 INFO BrokerControllerScheduledThread1 - register broker to name server 192.168.10.207:9876 OK
2018-05-09 19:06:45 INFO BrokerControllerScheduledThread1 - register broker to name server 192.168.10.207:9876 OK
 
其他三個節點啟動的時候,指定的配置檔案分別是broker-b.properties、broker-a-s.properties、broker-b-s.properties。
[root@mq-master02 bin]# nohup sh mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-b.properties >/dev/null 2>&1 &
[root@mq-slave01 bin]# nohup sh mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-a-s.properties >/dev/null 2>&1 &
[root@mq-slave02 bin]# nohup sh mqbroker -c /data/rocketmq/conf/2m-2s-sync/broker-b-s.properties >/dev/null 2>&1 &

-----------------------------------------------------------------
停止服務
先停止BrokerServer,再停止NameServer
[root@mq-master01 ~]# cd /data/rocketmq/bin
[root@mq-master01 bin]# sh mqshutdown broker
The mqbroker(10495) is running...
Send shutdown request to mqbroker(10495) OK
[root@mq-master01 bin]# lsof -i:10911
[root@mq-master01 bin]#
 
[root@mq-console-nameserver ~]# cd /data/rocketmq_namesrv/alibaba-rocketmq/bin/
[root@mq-console-nameserver bin]# sh mqshutdown namesrv
The mqnamesrv(32336) is running...
Send shutdown request to mqnamesrv(32336) OK
[root@mq-console-nameserver bin]# lsof -i:9876
[root@mq-console-nameserver bin]#

4)rocketMq監控平臺rocketmq-console部署(192.168.10.207上操作)

rocketmq有一個管理介面叫incubator-rocketmq-externals
百度網盤下載地址:https://pan.baidu.com/s/19PROiNivWBiOIV5NkOBBqA
提取密碼:r1cf
  
也可以直接git線上下載
[root@mq-console-nameserver ~]# cd /opt
[root@mq-console-nameserver opt]# git clone https://github.com/apache/rocketmq-externals.git
  
做軟連結
[root@mq-console-nameserver opt]# ln -s /opt/rocketmq-externals /data/
[root@mq-console-nameserver opt]# ll /data/rocketmq-externals
lrwxrwxrwx. 1 root root 23 May  9 14:10 /data/rocketmq-externals -> /opt/rocketmq-externals
  
修改配置檔案
[root@mq-console-nameserver ~]# vim /data/rocketmq-externals/rocketmq-console/src/main/resources/application.properties
server.contextPath=
server.port=8080                              #預設訪問埠是8080
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#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.config.namesrvAddr=192.168.10.207:9876               #如果nameserver是多臺叢集機器,則後面就配置多個ip+port,即"rocketmq.config.namesrvAddr=ip1:port;ip2:port"
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=false                            #注意這個引數,是否設定為false或true取決於rocketmq的版本號
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
 
------------------------------------------------------------------------------------------
溫馨提示:
由於我這裡使用的rocketmq是3.2.6版本,低於3.5.8版本,所以上面的rocketmq.config.isVIPChannel應設定為false,預設為true!
Rocket如果開啟了VIP通道,VIP通道埠為10911-2=10909。若Rocket伺服器未啟動埠10909,則報connect to <:10909> failed。
------------------------------------------------------------------------------------------
  
安裝Maven的安裝
[root@mq-console-nameserver ~]# cd /data/software/
[root@mq-console-nameserver software]# wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
[root@mq-console-nameserver software]# tar -zvxf apache-maven-3.3.9-bin.tar.gz
[root@mq-console-nameserver software]# mv apache-maven-3.3.9 /usr/local/maven
[root@mq-console-nameserver software]# vim /etc/profile
........
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
[root@mq-console-nameserver software]# source /etc/profile
[root@mq-console-nameserver software]# mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_131, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_131/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-696.el6.x86_64", arch: "amd64", family: "unix"
  
接著對rocketmq-console進行編譯打包執行(mvn的編輯過程需要等待一段時間)
[root@mq-console-nameserver ~]# cd /data/rocketmq-externals/rocketmq-console/
[root@mq-console-nameserver rocketmq-console]# mvn clean package -Dmaven.test.skip=true
  
編譯成功後在target下找到檔案:rocketmq-console-ng-1.0.0.jar
[root@mq-console-nameserver rocketmq-console]# ls
doc  LICENSE  NOTICE  pom.xml  README.md  src  style  target
[root@mq-console-nameserver rocketmq-console]# ls target/
checkstyle-cachefile    classes            maven-status                            rocketmq-console-ng-1.0.0-sources.jar
checkstyle-checker.xml  generated-sources  rocketmq-console-ng-1.0.0.jar
checkstyle-result.xml   maven-archiver     rocketmq-console-ng-1.0.0.jar.original
  
啟動rocketmq-console,執行命令:
[root@mq-console-nameserver rocketmq-console]# nohup java -jar target/rocketmq-console-ng-1.0.0.jar >/dev/null 2>&1 &
----------------------------------------------------------------------------------------------------
也可以直接跟NameServer的ip和埠進行啟動
# java -jar rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr=192.168.10.207:9876
  
如果NameServer有多臺叢集機器的話,後面就多加
# java -jar rocketmq-console-ng-1.0.0.jar --server.port=8080 --rocketmq.config.namesrvAddr=192.168.10.207:9876;192.168.10.208:9876

這裡需要注意兩個引數:
--server.port=8080   指定console訪問埠,預設的就是8080,也可以指定為其他埠
--rocketmq.config.namesrvAddr   指定nameserver的地址
----------------------------------------------------------------------------------------------------
  
rocketmq-console的預設埠是8080
[root@mq-console-nameserver rocketmq-console]# lsof -i:8080
COMMAND  PID       USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    5574 confluence   81u  IPv6 24674767      0t0  TCP mq-console-nameserver:44888->mq-console-nameserver:webcache (CLOSE_WAIT)
java    5649       jira  157u  IPv6   879851      0t0  TCP *:webcache (LISTEN)
java    5649       jira  249u  IPv6  4166247      0t0  TCP mq-console-nameserver:46886->mq-console-nameserver:webcache (CLOSE_WAIT)
java    5649       jira  262u  IPv6 24669705      0t0  TCP mq-console-nameserver:43464->mq-console-nameserver:webcache (CLOSE_WAIT)
  
最後再瀏覽器裡輸入:http://192.168.10.207:8080,即可訪問rockermq的web管理介面了

5)RocketMQ常用命令

需要切換到bin目錄下,即:
[root@mq-master01 ~]# cd /data/rocketmq/bin
[root@mq-master01 bin]# 

獲取所有可用命令:
[root@mq-master01 bin]# sh mqadmin

檢視幫助:
# sh mqadmin <command> -h
查詢Producer的網路連線情況:
# sh mqadmin producerConnection -n localhost:9876 -g <producer-group> -t <producer-topic>
查詢Consumer的網路連線情況:
# sh mqadmin consumerConnection -n localhost:9876 -g <consumer-group>
查詢Consumer的消費狀態:
# sh mqadmin consumerProgress -n localhost:9876 -g <consumer-group>

查詢訊息是否傳送成功
獲取指定Topic:
# sh mqadmin topicList -n localhost:9876 | grep <topicName>
檢視Topic狀態:
# sh mqadmin topicStatus -n localhost:9876 -t <topicName>
根據offset獲取訊息:
# sh sh mqadmin queryMsgByOffset -n localhost:9876 -b <broker-name> -i <queueId> -o <offset> -t <topicName>
根據offsetMsgId查詢訊息:
# sh sh mqadmin queryMsgById -n localhost:9876 -i <offsetMsgId>

查詢訊息是否被消費成功
查詢訊息詳情:
# sh mqadmin queryMsgById -i {MsgId} -n {NameServerAddr}
檢視Consumer Group訂閱了哪些TOPIC:
# sh mqadmin consumerProgress -g <ConsumerGroup> -n <NameServerAddr>

查詢TOPIC被哪些Consumer Group訂閱了
沒有查詢特定TOPIC訂閱情況,只能查詢所有後再過濾:
# sh mqadmin statsAll -n <NameServerAddr> | grep <TOPIC> 
返回結果:#Topic #Consumer Group #InTPS #OutTPS #InMsg24Hour #OutMsg24Hour

關閉nameserver和所有的broker:
# sh mqshutdown namesrv
# sh mqshutdown broker

檢視所有消費組group:
# sh mqadmin consumerProgress -n 192.168.23.159:9876
檢視指定消費組(kevinGroupConsumer)下的所有topic資料堆積情況:
# sh mqadmin consumerProgress -n 192.168.23.159:9876 -g kevinGroupConsumer
檢視所有topic :
# sh mqadmin topicList -n 192.168.23.159:9876
檢視topic資訊列表詳情統計
# sh mqadmin topicstatus -n 192.168.23.159:9876 -t myTopicTest1
新增topic
# sh mqadmin updateTopic –n 10.45.47.168 –c DefaultCluster –t ZTEExample
刪除topic
# sh mqadmin deleteTopic –n 10.45.47.168:9876 –c DefaultCluster –t ZTEExample

相關文章