RocketMQ叢集部署配置

匠心零度發表於2017-11-22

目標,使用2臺機器部署RocketMQ多Master多Slave模式,非同步複製叢集模式。

第一步,修改/etc/hosts檔案

192.168.116.115 rocketmq1
192.168.116.116 rocketmq2複製程式碼

叢集機器配置完成之後,叢集內進行ping一下,確保都通。

編譯得到環境

git clone -b develop https://github.com/apache/rocketmq.git
cd rocketmq
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/apache-rocketmq

本版本是基於4.1.0的,之後apache-rocketmq_4.1.0.tar.gz拷貝叢集所有機器進行解壓
tar -zxvf apache-rocketmq_4.1.0.tar.gz複製程式碼

配置叢集模式【多Master多Slave模式,非同步複製】

配置的目錄說明:

  • 2m-noslave: 多Master模式
  • 2m-2s-sync: 多Master多Slave模式,同步雙寫
  • 2m-2s-async:多Master多Slave模式,非同步複製

配置項一個主的配置

#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分號分割
namesrvAddr=rocketmq1:9876;rocketmq2:9876
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數
defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠
listenPort=10911
#刪除檔案時間點,預設凌晨 4點
deleteWhen=04
#檔案保留時間,預設 72 小時
fileReservedTime=120
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理檔案磁碟空間
diskMaxUsedSpaceRatio=75
#儲存路徑
storePathRootDir=/appl/rocketmq/store
#commitLog 儲存路徑
storePathCommitLog=/appl/rocketmq/store/commitlog
#消費佇列儲存路徑儲存路徑
storePathConsumeQueue=/appl/rocketmq/store/consumequeue
#訊息索引儲存路徑
storePathIndex=/appl/rocketmq/store/index
#checkpoint 檔案儲存路徑
storeCheckpoint=/appl/rocketmq/store/checkpoint
#abort 檔案儲存路徑
abortFile=/appl/rocketmq/store/abort
#限制的訊息大小 預設4M
#maxMessageSize=4194304

#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 非同步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=ASYNC_MASTER

#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH複製程式碼

配置項另外一個備的配置

#所屬叢集名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置檔案填寫的不一樣
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分號分割
namesrvAddr=rocketmq1:9876;rocketmq2:9876
#在傳送訊息時,自動建立伺服器不存在的topic,預設建立的佇列數
defaultTopicQueueNums=4
#是否允許 Broker 自動建立Topic,建議線下開啟,線上關閉
autoCreateTopicEnable=true
#是否允許 Broker 自動建立訂閱組,建議線下開啟,線上關閉
autoCreateSubscriptionGroup=true
#Broker 對外服務的監聽埠
listenPort=11911
#刪除檔案時間點,預設凌晨 4點
deleteWhen=04
#檔案保留時間,預設 72 小時
fileReservedTime=120
#commitLog每個檔案的大小預設1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個檔案預設存30W條,根據業務情況調整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理檔案磁碟空間
diskMaxUsedSpaceRatio=75
#儲存路徑
storePathRootDir=/appl/rocketmq-s/store
#commitLog 儲存路徑
storePathCommitLog=/appl/rocketmq-s/store/commitlog
#消費佇列儲存路徑儲存路徑
storePathConsumeQueue=/appl/rocketmq-s/store/consumequeue
#訊息索引儲存路徑
storePathIndex=/appl/rocketmq-s/store/index
#checkpoint 檔案儲存路徑
storeCheckpoint=/appl/rocketmq-s/store/checkpoint
#abort 檔案儲存路徑
abortFile=/appl/rocketmq-s/store/abort
#限制的訊息大小 預設4M
#maxMessageSize=4194304

#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 非同步複製Master
#- SYNC_MASTER 同步雙寫Master
#- SLAVE
brokerRole=SLAVE

#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH複製程式碼

備註:由於一臺機器部署主備,所以主、備的埠和儲存路徑會不同,如果多臺機器部署就可以保持一樣了,主備主要區別在於brokerId、brokerRole配置區別。

注意到logback.*.xml配置檔案中${user.home}需要替換自己指定的目錄

可以使用sed進行替換:

sed -i 's#${user.home}#/appl/rocketmq#g' *.xml

# sed -i 's#${user.home}#/appl/rocketmq-s#g' *.xml 由於一臺機器部署了2個結點複製程式碼

修改啟動指令碼中的JVM引數

由於RocketMQ4.1.0官方建議使用64bit JDK 1.8+;比如檢視runserver.sh檔案jvm引數如下:

-server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m複製程式碼

需要特別說明下:
後設資料空間,專門用來存後設資料的,它是jdk8以後用來替代perm的。

JVM堆空間大小根據機器情況進行調整,如果測試機器記憶體太小需要調整,不然啟動不了,比如修改為如下

-Xms1G -Xmx1G -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m複製程式碼

可以使用sed進行替換,把所有PermSize、MaxPermSize替換掉:

sed -i 's#PermSize#MetaspaceSize#g' *
sed -i 's#MaxPermSize#MaxMetaspaceSize#g' *複製程式碼

runbroker.sh裡面的jvm:

-Xms8g -Xmx8g -Xmn4g複製程式碼

根據自己情況進行修改。

個人建議對於RocketMQ預設的jvm引數除了堆大小其他的先不要調整,後續通過觀察分析之後看看是否有必要進行其他引數的調整等,歡迎閱讀本人JVM菜鳥進階高手之路系列文章。

其實我有有疑惑,在broker的jvm引數:

JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m 
-XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30
-XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log 
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime 
-XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 
-XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"複製程式碼

-XX:+DisableExplicitGC,-XX:MaxDirectMemorySize=15g,但是當達到閥值之後會呼叫System.gc來做一次full gc,關鍵System.gc都被禁止了。 希望那位大佬知道,在留言區說明下,謝謝。

啟動服務

記住先啟動NameServer,再啟動Broker,關閉的時候恰好相反,先關閉Broker再關閉NameServer

啟動NameServer

 nohup sh /appl/apache-rocketmq/bin/mqnamesrv &
tail -f /appl/rocketmq-s/logs/rocketmqlogs/namesrv.log
#tail -f /appl/rocketmq/logs/rocketmqlogs/namesrv.log
INFO main - The Name Server boot success. serializeType=JSON複製程式碼

備註:由於namesrv的埠是寫死在程式碼裡面的,所以一臺機器啟動一個namesrv即可。

啟動Broker

rocketmq1機器:
nohup sh /appl/apache-rocketmq/bin/mqbroker -c /appl/apache-rocketmq/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 &

nohup sh /appl/apache-rocketmq-s/bin/mqbroker -c /appl/apache-rocketmq-s/conf/2m-2s-async/broker-b-s.properties >/dev/null 2>&1 &  

rocketmq2機器:
nohup sh /appl/apache-rocketmq/bin/mqbroker -c /appl/apache-rocketmq/conf/2m-2s-async/broker-b.properties >/dev/null 2>&1 &

nohup sh /appl/apache-rocketmq-s/bin/mqbroker -c /appl/apache-rocketmq-s/conf/2m-2s-async/broker-a-s.properties >/dev/null 2>&1 &   



tail -f /appl/rocketmq/logs/rocketmqlogs/broker.log 
……
INFO main - The broker[broker-a, 192.168.116.116:10911] boot success. serializeType=JSON and name server is rocketmq1:9876;rocketmq2:9876
……

tail -f /appl/rocketmq/logs/rocketmqlogs/namesrv.log
……
new broker registerd, 192.168.116.116:11911 HAServer: 192.168.116.116:11912
……
new broker registerd, 192.168.116.115:11911 HAServer: 192.168.116.115:11912
……複製程式碼

關閉服務:

sh bin/mqshutdown broker
sh bin/mqshutdown namesrv複製程式碼

到目前位置,關於RocketMQ的叢集環境部署就結束了,未完待續……

如果讀完覺得有收穫的話,歡迎點贊加關注。


個人公眾號,歡迎關注,查閱更多精彩歷史!!!

匠心零度公眾號
匠心零度公眾號

相關文章