一、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