手把手 rocketmq 集羣搭建

單機節點

準備

官網下載http://rocketmq.apache.org/docs/quick-start
rocketmq-all-4.7.0-bin-release.zip上傳服務器
解壓 unzip rocketmq-all-4.7.0-bin-release.zip
rocketmq-all-4.7.0-bin-release

配置

如果您的主機是服務器請忽略,虛擬機需要 vi /bin/runbroker.sh 調整參數(不然啓動會內存不足)

#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4m"
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn521m"

vi runserver.sh

#AVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
AVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

啓動

啓動nameserver

nohup sh mqnamesrv &

查看mqnamesrv 啓動日誌

tail -f ~/logs/rocketmqlogs/namesrv.log】

啓動rocketmq

nohup sh mqbroker -n 10.0.61.49:9876 &
查看rocketmq啓動日誌
tail -f ~/logs/rocketmqlogs/broker.log

集羣搭建

總的來說rocket 的集羣就是在啓動的時候通過不同的配置文件,實現集羣節點的定義
conf目錄下

drwxr-xr-x. 2 root root   118 Mar  4 01:59 2m-2s-async //多Master多Slave模式-異步複製
drwxr-xr-x. 2 root root   118 Mar  4 01:59 2m-2s-sync 多Master多Slave模式-同步雙寫
drwxr-xr-x. 2 root root    91 Mar  4 01:59 2m-noslave //多Master模式
-rw-r--r--. 1 root root   949 May 22 10:25 broker.conf
drwxr-xr-x. 2 root root    72 Mar  4 01:59 dledger
-rw-r--r--. 1 root root 14978 Mar  4 01:59 logback_broker.xml
-rw-r--r--. 1 root root  3836 Mar  4 01:59 logback_namesrv.xml
-rw-r--r--. 1 root root  3761 Mar  4 01:59 logback_tools.xml
-rw-r--r--. 1 root root  1305 Mar  4 01:59 plain_acl.yml
-rw-r--r--. 1 root root   834 Mar  4 01:59 tools.yml

默認執行的是broker.conf

準備

先配置兩臺主機,一主一從 2m-2s-async 多Master多Slave模式-異步複製
Ip brokerName 用途 角色
10.10.61.34 Broker1 NameServer ,Broker Master
10.10.61.49 Broker1 NameServer ,Broker Slave

修改配置

10.10.61.34 Master
vi broker-a.properties

namesrvAddr=10.10.61.34:9876;10.10.61.49:9876
brokerIP1=10.10.61.34
brokerName=Broker1
brokerClusterName=Cluster
brokerId=0
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
rejectTransactionMessage=false
fetchNamesrvAddrByAddressServer=false
storePathRootDir=/root/store
storePathCommitLog=/root/store/commitlog
flushIntervalCommitLog=1000
flushCommitLogTimed=false
deleteWhen=04
fileReservedTime=72
maxTransferBytesOnMessageInMemory=262144
maxTransferCountOnMessageInMemory=32
maxTransferBytesOnMessageInDisk=65536
maxTransferCountOnMessageInDisk=8
accessMessageInMemoryMaxRatio=40
messageIndexEnable=true
messageIndexSafe=false
haMasterAddress=
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
cleanFileForciblyEnable=true

10.10.61.49 Slave
vi broker-a-s.properties

namesrvAddr=10.10.61.34:9876;10.10.61.49:9876
brokerIP1=10.10.61.49
brokerName=Broker1
brokerClusterName=Cluster
brokerId=1
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
rejectTransactionMessage=false
fetchNamesrvAddrByAddressServer=false
storePathRootDir=/root/store
storePathCommitLog=/root/store/commitlog
flushIntervalCommitLog=1000
flushCommitLogTimed=false
deleteWhen=04
fileReservedTime=72
maxTransferBytesOnMessageInMemory=262144
maxTransferCountOnMessageInMemory=32
maxTransferBytesOnMessageInDisk=65536
maxTransferCountOnMessageInDisk=8
accessMessageInMemoryMaxRatio=40
messageIndexEnable=true
messageIndexSafe=false
haMasterAddress=
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
cleanFileForciblyEnable=true

另外兩臺一主一從
並加入到namesrvAddr,就可以變成四臺主機

啓動

cd 到 bin目錄
sh play.sh 或者 nohup sh mqnameserv &
通過運行jps查看服務啓動情況

23409 NamesrvStartup
15868 Jps

沒有broker信息
10.10.61.34 Master啓動

nohup sh mqbroker -c ../conf/2m-2s-async/broker-a.properties &

tail -f nohup.out

The broker[Broker1, 10.0.61.49:10911] boot success. serializeType=JSON and name server is 10.0.61.34:9876;10.0.61.49:9876

10.10.61.49 Slave 啓動

nohup sh mqbroker -c ../conf/2m-2s-async/broker-a-s.properties &

jps 查看

[root@rabbit2 bin]# jps
17986 Jps
16613 NamesrvStartup
17926 BrokerStartup

查看集羣

# bin/mqadmin help ClusterList
usage: mqadmin clusterList [-h] [-i <arg>] [-m] [-n <arg>]
 -h,--help                Print help
 -i,--interval <arg>      specify intervals numbers, it is in seconds
 -m,--moreStats           Print more stats
 -n,--namesrvAddr <arg>   Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876

sh mqadmin clusterList -n 10.10.61.34:9876;10.10.61.49:9876
一般會有報錯信息

RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
org.apache.rocketmq.tools.command.SubCommandException: ClusterListSubCommand command failed
       at org.apache.rocketmq.tools.command.cluster.ClusterListSubCommand.execute(ClusterListSubCommand.java:93)
       at org.apache.rocketmq.tools.command.MQAdminStartup.main0(MQAdminStartup.java:139)
       at org.apache.rocketmq.tools.command.MQAdminStartup.main(MQAdminStartup.java:90)
Caused by: org.apache.rocketmq.acl.common.AclException: [10015:signature-failed] unable to calculate a request signature. error=[10015:signature-failed] unable to calculate a request signature. error=Algorithm HmacSHA1 not available
       at org.apache.rocketmq.acl.common.AclSigner.signAndBase64Encode(AclSigner.java:84)
       at org.apache.rocketmq.acl.common.AclSigner.calSignature(AclSigner.java:73)
       at org.apache.rocketmq.acl.common.AclSigner.calSignature(AclSigner.java:68)
       at org.apache.rocketmq.acl.common.AclUtils.calSignature(AclUtils.java:69)
       at org.apache.rocketmq.acl.common.AclClientRPCHook.doBeforeRequest(AclClientRPCHook.java:44)
       at org.apache.rocketmq.remoting.netty.NettyRemotingAbstract.doBeforeRpcHooks(NettyRemotingAbstract.java:172)
       at org.apache.rocketmq.remoting.netty.NettyRemotingClient.invokeSync(NettyRemotingClient.java:368)
       at org.apache.rocketmq.client.impl.MQClientAPIImpl.getBrokerClusterInfo(MQClientAPIImpl.java:1339)
       at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.examineBrokerClusterInfo(DefaultMQAdminExtImpl.java:306)
       at org.apache.rocketmq.tools.admin.DefaultMQAdminExt.examineBrokerClusterInfo(DefaultMQAdminExt.java:251)
       at org.apache.rocketmq.tools.command.cluster.ClusterListSubCommand.printClusterBaseInfo(ClusterListSubCommand.java:172)
       at org.apache.rocketmq.tools.command.cluster.ClusterListSubCommand.execute(ClusterListSubCommand.java:88)
       ... 2 more
Caused by: org.apache.rocketmq.acl.common.AclException: [10015:signature-failed] unable to calculate a request signature. error=Algorithm HmacSHA1 not available
       at org.apache.rocketmq.acl.common.AclSigner.sign(AclSigner.java:63)
       at org.apache.rocketmq.acl.common.AclSigner.signAndBase64Encode(AclSigner.java:79)
       ... 13 more
Caused by: java.security.NoSuchAlgorithmException: Algorithm HmacSHA1 not available
       at javax.crypto.Mac.getInstance(Mac.java:181)
       at org.apache.rocketmq.acl.common.AclSigner.sign(AclSigner.java:57)
       ... 14 more

查看mqadmin,發現其 調用tools.sh,啓動配置JAVA環境。該報錯是因爲缺少ext目錄,在tools.sh內添加
find / -name ‘ext’ |grep jdk
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/ext
將其添加到原先配置上


JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib:${JAVA_HOME}/jre/lib/ext:${JAVA_HOME}/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre/lib/ext"

重新執行mqadmin
sh mqadmin clusterList -n 10.10.61.34:9876

[root@rabbit1 bin]# sh mqadmin clusterList -n 10.0.61.34:9876;10.0.61.49:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
AresCluster       AresBroker1             0     10.0.61.34:10911       V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 441723.93 0.1184
AresCluster       AresBroker1             1     10.0.61.49:10911       V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 441723.93 0.1176
-bash: 10.0.61.49:9876: command not found

java 層面測試集羣

消費端 連接 10.10.61.34:9876節點 消費消息

public class Customer {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        DefaultMQPushConsumer customer= new DefaultMQPushConsumer("gc_rocket_cum_test");
        // customer.setNamesrvAddr("10.10.61.34:9876;10.10.61.49:9876");
        customer.setNamesrvAddr("10.10.61.34:9876");
        customer.subscribe("test","*");
        customer.registerMessageListener(new MessageListenerConcurrently() {
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs);
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
          customer.start();
        System.out.println("消費者已啓動");
    }
}

生產端 連接 10.0.61.49:9876節點 產生消息

public class Producer {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException, UnsupportedEncodingException {
        DefaultMQProducer producer =new DefaultMQProducer("gc_rocket_prd_test");
        //producer.setNamesrvAddr("10.0.61.34:9876;10.0.61.49:9876");
        producer.setNamesrvAddr("10.0.61.49:9876");
        producer.start();
        for (int i=0;i<100;i++)
        {
            Message msg=new Message("test","", ("TEST ROCKET MQ "+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
            SendResult sendResult=producer.send(msg);
            System.out.printf("%s%n", sendResult);
        }
        producer.shutdown();
        System.out.println("生產者結束髮送");
    }
}

可以實現消息發送消費

web管理界面

https://github.com/apache/rocketmq-externals 下載項目rocketmq-console,配置nameserver
java -jar啓動服務
訪問
http://10.10.61.34:8080/rocketmq-console/cluster/list.do

官網文檔

詳見官網指定的github,中文文檔非常全
官方文檔https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md

我直接copy一份
============================================
1 集羣搭建
1.1 單Master模式
這種方式風險較大,一旦Broker重啓或者宕機時,會導致整個服務不可用。不建議線上環境使用,可以用於本地測試。

1)啓動 NameServer
### 首先啓動Name Server
$ nohup sh mqnamesrv &
 
### 驗證Name Server 是否啓動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啓動 Broker
### 啓動Broker
$ nohup sh bin/mqbroker -n localhost:9876 &

### 驗證Name Server 是否啓動成功,例如Broker的IP爲:192.168.1.2,且名稱爲broker-a
$ tail -f ~/logs/rocketmqlogs/Broker.log 
The broker[broker-a, 192.169.1.2:10911] boot success...
1.2 多Master模式
一個集羣無Slave,全是Master,例如2個Master或者3個Master,這種模式的優缺點如下:

優點:配置簡單,單個Master宕機或重啓維護對應用無影響,在磁盤配置爲RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高;

缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到影響。

1)啓動NameServer
NameServer需要先於Broker啓動,且如果在生產環境使用,爲了保證高可用,建議一般規模的集羣啓動3個NameServer,各節點的啓動命令相同,如下:

### 首先啓動Name Server
$ nohup sh mqnamesrv &
 
### 驗證Name Server 是否啓動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啓動Broker集羣
### 在機器A,啓動第一個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &
 
### 在機器B,啓動第二個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties &

...
如上啓動命令是在單個NameServer情況下使用的。對於多個NameServer的集羣,Broker啓動命令中-n後面的地址列表用分號隔開即可,例如 192.168.1.1:9876;192.161.2:9876。

1.3 多Master多Slave模式-異步複製
每個Master配置一個Slave,有多對Master-Slave,HA採用異步複製方式,主備有短暫消息延遲(毫秒級),這種模式的優缺點如下:

優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,同時Master宕機後,消費者仍然可以從Slave消費,而且此過程對應用透明,不需要人工干預,性能同多Master模式幾乎一樣;

缺點:Master宕機,磁盤損壞情況下會丟失少量消息。

1)啓動NameServer
### 首先啓動Name Server
$ nohup sh mqnamesrv &
 
### 驗證Name Server 是否啓動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啓動Broker集羣
### 在機器A,啓動第一個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties &
 
### 在機器B,啓動第二個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &
 
### 在機器C,啓動第一個Slave,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties &
 
### 在機器D,啓動第二個Slave,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &
1.4 多Master多Slave模式-同步雙寫
每個Master配置一個Slave,有多對Master-Slave,HA採用同步雙寫方式,即只有主備都寫成功,才嚮應用返回成功,這種模式的優缺點如下:

優點:數據與服務都無單點故障,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高;

缺點:性能比異步複製模式略低(大約低10%左右),發送單個消息的RT會略高,且目前版本在主節點宕機後,備機不能自動切換爲主機。

1)啓動NameServer
### 首先啓動Name Server
$ nohup sh mqnamesrv &
 
### 驗證Name Server 是否啓動成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)啓動Broker集羣
### 在機器A,啓動第一個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
 
### 在機器B,啓動第二個Master,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
 
### 在機器C,啓動第一個Slave,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
 
### 在機器D,啓動第二個Slave,例如NameServer的IP爲:192.168.1.1
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
以上Broker與Slave配對是通過指定相同的BrokerName參數來配對,Master的BrokerId必須是0,Slave的BrokerId必須是大於0的數。另外一個Master下面可以掛載多個Slave,同一Master下的多個Slave通過指定不同的BrokerId來區分。$ROCKETMQ_HOME指的RocketMQ安裝目錄,需要用戶自己設置此環境變量。

2 mqadmin管理工具
注意:

執行命令方法:./mqadmin {command} {args}
幾乎所有命令都需要配置-n表示NameServer地址,格式爲ip:port
幾乎所有命令都可以通過-h獲取幫助
如果既有Broker地址(-b)配置項又有clusterName(-c)配置項,則優先以Broker地址執行命令,如果不配置Broker地址,則對集羣中所有主機執行命令,只支持一個Broker地址。-b格式爲ip:port,port默認是10911
在tools下可以看到很多命令,但並不是所有命令都能使用,只有在MQAdminStartup中初始化的命令才能使用,你也可以修改這個類,增加或自定義命令
由於版本更新問題,少部分命令可能未及時更新,遇到錯誤請直接閱讀相關命令源碼
2.1 Topic相關
名稱	含義	命令選項	說明
updateTopic	創建更新Topic配置	-b	Broker 地址,表示 topic 所在 Broker,只支持單臺Broker,地址爲ip:port
-c	cluster 名稱,表示 topic 所在集羣(集羣可通過 clusterList 查詢)
-h-	打印幫助
-n	NameServer服務地址,格式 ip:port
-p	指定新topic的讀寫權限( W=2|R=4|WR=6 )
-r	可讀隊列數(默認爲 8)
-w	可寫隊列數(默認爲 8)
-t	topic 名稱(名稱只能使用字符 ^[a-zA-Z0-9_-]+$ )
deleteTopic	刪除Topic	-c	cluster 名稱,表示刪除某集羣下的某個 topic (集羣 可通過 clusterList 查詢)
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic 名稱(名稱只能使用字符 ^[a-zA-Z0-9_-]+$ )
topicList	查看 Topic 列表信息	-h	打印幫助
-c	不配置-c只返回topic列表,增加-c返回clusterName, topic, consumerGroup信息,即topic的所屬集羣和訂閱關係,沒有參數
-n	NameServer 服務地址,格式 ip:port
topicRoute	查看 Topic 路由信息	-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
topicStatus	查看 Topic 消息隊列offset	-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
topicClusterList	查看 Topic 所在集羣列表	-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
updateTopicPerm	更新 Topic 讀寫權限	-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-b	Broker 地址,表示 topic 所在 Broker,只支持單臺Broker,地址爲ip:port
-p	指定新 topic 的讀寫權限( W=2|R=4|WR=6 )
-c	cluster 名稱,表示 topic 所在集羣(集羣可通過 clusterList 查詢),-b優先,如果沒有-b,則對集羣中所有Broker執行命令
updateOrderConf	從NameServer上創建、刪除、獲取特定命名空間的kv配置,目前還未啓用	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic,鍵
-v	orderConf,值
-m	method,可選get、put、delete
allocateMQ	以平均負載算法計算消費者列表負載消息隊列的負載結果	-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-i	ipList,用逗號分隔,計算這些ip去負載Topic的消息隊列
statsAll	打印Topic訂閱關係、TPS、積累量、24h讀寫總量等信息	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-a	是否只打印活躍topic
-t	指定topic
2.2 集羣相關
名稱	含義	命令選項	說明
clusterList	查看集羣信息,集羣、BrokerName、BrokerId、TPS等信息	-m	打印更多信息 (增加打印出如下信息 #InTotalYest, #OutTotalYest, #InTotalToday ,#OutTotalToday)
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-i	打印間隔,單位秒
clusterRT	發送消息檢測集羣各Broker RT。消息發往${BrokerName} Topic。	-a	amount,每次探測的總數,RT = 總時間 / amount
-s	消息大小,單位B
-c	探測哪個集羣
-p	是否打印格式化日誌,以|分割,默認不打印
-h	打印幫助
-m	所屬機房,打印使用
-i	發送間隔,單位秒
-n	NameServer 服務地址,格式 ip:port
2.3 Broker相關
名稱	含義	命令選項	說明
updateBrokerConfig	更新 Broker 配置文件,會修改Broker.conf	-b	Broker 地址,格式爲ip:port
-c	cluster 名稱
-k	key 值
-v	value 值
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
brokerStatus	查看 Broker 統計信息、運行狀態(你想要的信息幾乎都在裏面)	-b	Broker 地址,地址爲ip:port
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
brokerConsumeStats	Broker中各個消費者的消費情況,按Message Queue維度返回Consume Offset,Broker Offset,Diff,TImestamp等信息	-b	Broker 地址,地址爲ip:port
-t	請求超時時間
-l	diff閾值,超過閾值纔打印
-o	是否爲順序topic,一般爲false
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
getBrokerConfig	獲取Broker配置	-b	Broker 地址,地址爲ip:port
-n	NameServer 服務地址,格式 ip:port
wipeWritePerm	從NameServer上清除 Broker寫權限	-b	Broker 地址,地址爲ip:port
-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
cleanExpiredCQ	清理Broker上過期的Consume Queue,如果手動減少對列數可能產生過期隊列	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-b	Broker 地址,地址爲ip:port
-c	集羣名稱
cleanUnusedTopic	清理Broker上不使用的Topic,從內存中釋放Topic的Consume Queue,如果手動刪除Topic會產生不使用的Topic	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-b	Broker 地址,地址爲ip:port
-c	集羣名稱
sendMsgStatus	向Broker發消息,返回發送狀態和RT	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-b	BrokerName,注意不同於Broker地址
-s	消息大小,單位B
-c	發送次數
2.4 消息相關
名稱	含義	命令選項	說明
queryMsgById	根據offsetMsgId查詢msg,如果使用開源控制檯,應使用offsetMsgId,此命令還有其他參數,具體作用請閱讀QueryMsgByIdSubCommand。	-i	msgId
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
queryMsgByKey	根據消息 Key 查詢消息	-k	msgKey
-t	Topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
queryMsgByOffset	根據 Offset 查詢消息	-b	Broker 名稱,(這裏需要注意 填寫的是 Broker 的名稱,不是 Broker 的地址,Broker 名稱可以在 clusterList 查到)
-i	query 隊列 id
-o	offset 值
-t	topic 名稱
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
queryMsgByUniqueKey	根據msgId查詢,msgId不同於offsetMsgId,區別詳見常見運維問題。-g,-d配合使用,查到消息後嘗試讓特定的消費者消費消息並返回消費結果	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-i	uniqe msg id
-g	consumerGroup
-d	clientId
-t	topic名稱
checkMsgSendRT	檢測向topic發消息的RT,功能類似clusterRT	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic名稱
-a	探測次數
-s	消息大小
sendMessage	發送一條消息,可以根據配置發往特定Message Queue,或普通發送。	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic名稱
-p	body,消息體
-k	keys
-c	tags
-b	BrokerName
-i	queueId
consumeMessage	消費消息。可以根據offset、開始&結束時間戳、消息隊列消費消息,配置不同執行不同消費邏輯,詳見ConsumeMessageCommand。	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic名稱
-b	BrokerName
-o	從offset開始消費
-i	queueId
-g	消費者分組
-s	開始時間戳,格式詳見-h
-d	結束時間戳
-c	消費多少條消息
printMsg	從Broker消費消息並打印,可選時間段	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic名稱
-c	字符集,例如UTF-8
-s	subExpress,過濾表達式
-b	開始時間戳,格式參見-h
-e	結束時間戳
-d	是否打印消息體
printMsgByQueue	類似printMsg,但指定Message Queue	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-t	topic名稱
-i	queueId
-a	BrokerName
-c	字符集,例如UTF-8
-s	subExpress,過濾表達式
-b	開始時間戳,格式參見-h
-e	結束時間戳
-p	是否打印消息
-d	是否打印消息體
-f	是否統計tag數量並打印
resetOffsetByTime	按時間戳重置offset,Broker和consumer都會重置	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-g	消費者分組
-t	topic名稱
-s	重置爲此時間戳對應的offset
-f	是否強制重置,如果false,只支持回溯offset,如果true,不管時間戳對應offset與consumeOffset關係
-c	是否重置c++客戶端offset
2.5 消費者、消費組相關
名稱	含義	命令選項	說明
consumerProgress	查看訂閱組消費狀態,可以查看具體的client IP的消息積累量	-g	消費者所屬組名
-s	是否打印client IP
-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
consumerStatus	查看消費者狀態,包括同一個分組中是否都是相同的訂閱,分析Process Queue是否堆積,返回消費者jstack結果,內容較多,使用者參見ConsumerStatusSubCommand	-h	打印幫助
-n	NameServer 服務地址,格式 ip:port
-g	consumer group
-i	clientId
-s	是否執行jstack
updateSubGroup	更新或創建訂閱關係	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-b	Broker地址
-c	集羣名稱
-g	消費者分組名稱
-s	分組是否允許消費
-m	是否從最小offset開始消費
-d	是否是廣播模式
-q	重試隊列數量
-r	最大重試次數
-i	當slaveReadEnable開啓時有效,且還未達到從slave消費時建議從哪個BrokerId消費,可以配置備機id,主動從備機消費
-w	如果Broker建議從slave消費,配置決定從哪個slave消費,配置BrokerId,例如1
-a	當消費者數量變化時是否通知其他消費者負載均衡
deleteSubGroup	從Broker刪除訂閱關係	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-b	Broker地址
-c	集羣名稱
-g	消費者分組名稱
cloneGroupOffset	在目標羣組中使用源羣組的offset	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-s	源消費者組
-d	目標消費者組
-t	topic名稱
-o	暫未使用
2.6 連接相關
名稱	含義	命令選項	說明
consumerConnec tion	查詢 Consumer 的網絡連接	-g	消費者所屬組名
-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
producerConnec tion	查詢 Producer 的網絡連接	-g	生產者所屬組名
-t	主題名稱
-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
2.7 NameServer相關
名稱	含義	命令選項	說明
updateKvConfig	更新NameServer的kv配置,目前還未使用	-s	命名空間
-k	key
-v	value
-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
deleteKvConfig	刪除NameServer的kv配置	-s	命名空間
-k	key
-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
getNamesrvConfig	獲取NameServer配置	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
updateNamesrvConfig	修改NameServer配置	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
-k	key
-v	value
2.8 其他
名稱	含義	命令選項	說明
startMonitoring	開啓監控進程,監控消息誤刪、重試隊列消息數等	-n	NameServer 服務地址,格式 ip:port
-h	打印幫助
3 運維常見問題
3.1 RocketMQ的mqadmin命令報錯問題
問題描述:有時候在部署完RocketMQ集羣后,嘗試執行“mqadmin”一些運維命令,會出現下面的異常信息:

org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <null> failed
解決方法:可以在部署RocketMQ集羣的虛擬機上執行export NAMESRV_ADDR=ip:9876(ip指的是集羣中部署NameServer組件的機器ip地址)命令之後再使用“mqadmin”的相關命令進行查詢,即可得到結果。

3.2 RocketMQ生產端和消費端版本不一致導致不能正常消費的問題
問題描述:同一個生產端發出消息,A消費端可消費,B消費端卻無法消費,rocketMQ Console中出現:

Not found the consumer group consume stats, because return offset table is empty, maybe the consumer not consume any message的異常消息。
解決方案:RocketMQ 的jar包:rocketmq-client等包應該保持生產端,消費端使用相同的version。

3.3 新增一個topic的消費組時,無法消費歷史消息的問題
問題描述:當同一個topic的新增消費組啓動時,消費的消息是當前的offset的消息,並未獲取歷史消息。

解決方案:rocketmq默認策略是從消息隊列尾部,即跳過歷史消息。如果想消費歷史消息,則需要設置:org.apache.rocketmq.client.consumer.DefaultMQPushConsumer#setConsumeFromWhere。常用的有以下三種配置:

默認配置,一個新的訂閱組第一次啓動從隊列的最後位置開始消費,後續再啓動接着上次消費的進度開始消費,即跳過歷史消息;
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
一個新的訂閱組第一次啓動從隊列的最前位置開始消費,後續再啓動接着上次消費的進度開始消費,即消費Broker未過期的歷史消息;
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
一個新的訂閱組第一次啓動從指定時間點開始消費,後續再啓動接着上次消費的進度開始消費,和consumer.setConsumeTimestamp()配合使用,默認是半個小時以前;
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);
3.4 如何開啓從Slave讀數據功能
在某些情況下,Consumer需要將消費位點重置到1-2天前,這時在內存有限的Master Broker上,CommitLog會承載比較重的IO壓力,影響到該Broker的其它消息的讀與寫。可以開啓slaveReadEnable=true,當Master Broker發現Consumer的消費位點與CommitLog的最新值的差值的容量超過該機器內存的百分比(accessMessageInMemoryMaxRatio=40%),會推薦Consumer從Slave Broker中去讀取數據,降低Master Broker的IO。

3.5 性能調優問題
異步刷盤建議使用自旋鎖,同步刷盤建議使用重入鎖,調整Broker配置項useReentrantLockWhenPutMessage,默認爲false;異步刷盤建議開啓TransientStorePoolEnable;建議關閉transferMsgByHeap,提高拉消息效率;同步刷盤建議適當增大sendMessageThreadPoolNums,具體配置需要經過壓測。

3.6 在RocketMQ中msgId和offsetMsgId的含義與區別
使用RocketMQ完成生產者客戶端消息發送後,通常會看到如下日誌打印信息:

SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000, offsetMsgId=0A42333A00002A9F000000000134F1F5, messageQueue=MessageQueue [topic=topicTest1, BrokerName=mac.local, queueId=3], queueOffset=4]
msgId,對於客戶端來說msgId是由客戶端producer實例端生成的,具體來說,調用方法MessageClientIDSetter.createUniqIDBuffer()生成唯一的Id;
offsetMsgId,offsetMsgId是由Broker服務端在寫入消息時生成的(採用”IP地址+Port端口”與“CommitLog的物理偏移量地址”做了一個字符串拼接),其中offsetMsgId就是在RocketMQ控制檯直接輸入查詢的那個messageId。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章