1. 程式人生 > >RocketMQ初探(五)之RocketMQ4.2.6叢集部署(單Master+雙Master+2m+2s+async非同步複製)

RocketMQ初探(五)之RocketMQ4.2.6叢集部署(單Master+雙Master+2m+2s+async非同步複製)

原文地址:https://www.cnblogs.com/buyige/p/9454634.html

 

  以下部署方式結合眾多博友的部落格,經過自己一步一步實際搭建,如有雷同,侵權行為,請見諒。。。其中遇到不少的坑,希望能幫到更多的人,現在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇見,那麼我們必定前世有緣。進入正題……

  首先,官方推薦有三種部署方式:  

多Master模式(2m-noslave)

一個叢集無Slave,全是Master,例如2個Master或者3個Master
優點:配置簡單,單個Master宕機或重啟維護對應用無影響,在磁碟配置為RAID10時,即使機器宕機不可恢復情況下,由於RAID10磁碟非常可靠,訊息也不會丟(非同步刷盤丟失少量訊息,同步刷盤一條不丟)。效能最高。
缺點:單臺機器宕機期間,這臺機器上未被消費的訊息在機器恢復之前不可訂閱,訊息實時性會受到受到影響。

多Master多Slave模式,非同步複製(2m-2s-async)

每個Master配置一個Slave,有多對Master-Slave,HA採用非同步複製方式,主備有短暫訊息延遲,毫秒級。
優點:即使磁碟損壞,訊息丟失的非常少,且訊息實時性不會受影響,因為Master宕機後,消費者仍然可以從Slave消費,此過程對應用透明。不需要人工干預。效能同多Master模式幾乎一樣。
缺點:Master宕機,磁碟損壞情況,會丟失少量訊息。

多Master多Slave模式,同步雙寫(2m-noslave)

每個Master配置一個Slave,有多對Master-Slave,HA採用同步雙寫方式,主備都寫成功,嚮應用返回成功。
優點:資料與服務都無單點,Master宕機情況下,訊息無延遲,服務可用性與資料可用性都非常高
缺點:效能比非同步複製模式略低,大約低10%左右,傳送單個訊息的RT會略高。目前主宕機後,備機不能自動切換為主機,後續會支援自動切換功能。

注意:

1、上述“2”只是說作為一個叢集的最低配置數量,可以根據實際情況擴充套件。

2、所有的刷盤(Dish Flush)操作全部預設為:ASYNC_FLUSH(非同步刷盤)。

核心概念:

  Disk Flush(磁碟重新整理/同步操作):就是將記憶體的資料落地,儲存在磁碟中。

  RocketMQ提供了以下兩種模式:

   SYNC_FLUSH(同步刷盤):生產者傳送的每一條訊息都在儲存到磁碟成功後才返回告訴生產者成功。這種方式不會存在訊息丟失的問題,但是有很大的磁碟IO開銷,效能有一定影響。                         ASYNC_FLUSH

(非同步刷盤):生產者傳送的每一條訊息並不是立即儲存到磁碟,而是暫時快取起來,然後就返回生產者成功。隨後再非同步的將快取資料儲存到磁碟,有兩種情況:1是定期將快取中更新的資料進行刷盤,2是當快取中更新的資料條數達到某一設定值後進行刷盤。這種方式會存在訊息丟失(在還未來得及同步到磁碟的時候宕機),但是效能很好。預設是這種模式。

  • Broker Replication(Broker間資料同步/複製):叢集環境下需要部署多個Broker,Broker分為兩種角色:一種是master,即可以寫也可以讀,其brokerId=0,只能有一個;另外一種是slave,只允許讀,其brokerId為非0。一個master與多個slave通過指定相同的brokerName被歸為一個broker set(broker集)。通常生產環境中,我們至少需要2個broker set。Broker Replication只的就是slave獲取或者是複製master的資料。
  • Sync Broker:生產者傳送的每一條訊息都至少同步複製到一個slave後才返回告訴生產者成功,即“同步雙寫”。
  • Async Broker:生產者傳送的每一條訊息只要寫入master就返回告訴生產者成功。然後再“非同步複製”到slave。

環境:

JDK1.8    java version "1.8.0_171"  +虛擬機器2臺(至少)+rocketmq-all-4.2.0-bin-release.zip

 

1、單Master

# unzip -o rocketmq-all-4.2.0-bin-release.zip -d rocketmq1  (需要指定目錄)

# cd /ulic/rocketmq1

# nohup sh bin/mqnamesrv &                      #啟動namesrv

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

 

# nohup sh bin/mqbroker -n 10.18.3.21:9876 &    #啟動broker

# tail -f ~/logs/rocketmqlogs/broker.log

# jps                            # 檢查是否成功啟動namesrv和broker

注意:啟動mqbroker時需要確保主機有足夠的記憶體,官方預設設定的-Xms8g -Xmx8g -Xmn4g都比較大;

runBroker.sh中更改

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"

runserver.sh中更改:

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

 停止命令: (啟動先namesrv,再broker;停止先broker,再namesrv)

  sh bin/mqshutdown broker

  sh bin/mqshutdown namesrv

2、雙Master

序號  ip            使用者名稱    密碼      角色               模式

(1) 10.43.98.34    root        nameServer1,brokerServer1   Master1

(2) 10.43.98.38   root        nameServer1,brokerServer1   Master2

 

1、Host新增資訊

兩臺機器都執行vi  /etc/hosts,將nameServer和broker部署在同一臺機器上的,也可以分開部署。  輸入如下圖所示的資訊

 

重啟網絡卡:service network restart(可省略)

 

相互ping一下,在34機器上ping  10.43.98.38  

 

# ping  rocketmq-nameserver2  

 

# ping  rocketmq-master2

 

  2、建立資料儲存路徑(兩臺機器都要建立)(為方便後面叢集部署,最好設定,不設定也可以成功部署)

任意你想設定儲存位置的目錄下來儲存產生的資料的,我是/rocketmq1目錄下

mkdir store

mkdir store/commitlog

mkdir store/consumerqueue

mkdir store/index

  3、修改conf下RocketMQ的配置檔案:(34機器)broker-a.properties  (38機器)broker-b.properties

brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0

namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

主要配置這些也可以,詳細可以自行根據需要補全,比如檔案儲存路徑配置等……  

  詳細配置檔案可參考:  

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

  因為有兩個master主節點,所以主節點1啟動依賴broker-a.properties,主節點2啟動依賴broker-b.properties,如果是三個Master,那麼還會有一個broker-c.properties,以此類推。brokerId=0表示是master,大於0則表示是slave;

  另外BrokerName=broker-a要對應;在34機器上是broker-a,在第二臺機器38上則是broker-b。分別在34和38上修改broker-a.properties和broker-b.properties。

namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876。這個要和之前配置的名稱相互對應。

3、修改日誌配置檔案(略,可參考)

  修改日誌配置檔案

  在建立的軟連線資料夾rocketmq下建立一個logs目錄 mkdir /opt/rocketmq/logs

 

  然後執行cd /opt/rocketmq/conf && sed -i 's#${user.home}#/opt/rocketmq#g' *.xml進行日誌檔案的替換,sed是linux的替換命令。兩臺機器同樣操作。

4、修改啟動指令碼引數(JVM引數的調優)

1)broker的調優

vi /opt/rocketmq/bin/runbroker.sh

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m - XX:PermSize=128m -XX:MaxPermSize=320m"

2)nameserver的調優

vi /opt/rocketmq/bin/runserver.sh

JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m - XX:PermSize=128m -XX:MaxPermSize=320m"

將nameServer和broker放在了同一臺機器上,所以需要分別對nameServer和broker進行jvm的效能調優。生產環境預設即可不要修改

  啟動兩臺機器的NameServer:先啟動兩臺機器的NameServer,再啟動兩臺機器的Borker,關機的時候順序相反,先關閉兩臺機器的Broker,再關閉兩臺機器的Nameserver。

# cd /opt/rocketmq/bin

# nohup sh mqnamesrv &

上面這條命令nohup是起一個守護執行緒。

# jps 檢視程序

# tail -f -n 500 /opt/rocketmq/logs/rocketmqlogs/broker.log

# tail -f -n 500 /opt/rocketmq/logs/rocketmqlogs/namesrv.log

mqadnin是管理員命令,mqfiltersrv是rocketmq的單獨元件,mqnamesrv是NameServer,mqbroker是Broker。

 啟動BrokerServer A 10.43.98.34和BrokerServer B 10.43.98.38

 

啟動BrokerServer A 10.43.98.34

# nohup sh mqbroker -c /opt/rocketmq/conf/2m-noslave/broker-a.properties >/dev/null 2>&1 &

netstat -ntlp

# jps

# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log

# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

 

啟動BrokerServer B 10.43.98.38

nohup sh mqbroker -c /opt/rocketmq/conf/2m-noslave/broker-b.properties >/dev/null 2>&1 &

netstat -ntlp

# jps

# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/broker.log

# tail -f -n 500 /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log

 

  成功啟動後,通過mqadmin命令或者rocketmq-console監控介面檢視,是否部署成功。。。

3、雙Master+雙Slave-Async

  實際可以準備4臺伺服器,每臺上面部署1個;

  參考:RocketMQ環境搭建(雙master雙slave模式)

  因資源有限,同一臺機器部署兩個節點,broker-a的主節點與broker-b的從節點部署在一臺伺服器,broker-a的從節點與broker-b的主節點部署在一臺伺服器(交叉部署實現HA)。

注:同一臺機器部署兩個broker時,一定要注意,在配置檔案中配置:

若原broker-a.properties中配置:

listenPort=10911  //預設

storePathRootDir=/opt/logs/rocketmqlogs/store 
storePathCommitLog=/opt/logs/rocketmqlogs/store /commitlog //日誌存放目錄

broker-b-s.properties中配置(不能有衝突)

listenPort=10915 //預設:10911 更改埠號,同一臺機器上兩個broker不可採用同一埠,且埠號間隔2個以上(經測試10913不可啟動)

storePathRootDir=/opt/logs/rocketmqlogs/store-b-s  
storePathCommitLog=/opt/logs/rocketmqlogs/store-b-s /commitlog //日誌存放目錄

 

不然,會發現1臺機器只能啟動一個broker。。。。

主:192.168.151.131   從 192.168.151.132

1. 修改主從hosts檔案

    vi /etc/hosts  加入

    192.168.153.131  rocketmq.master
    192.168.153.132  rocketmq.slave

2. 修改mq配置檔案採用非同步複製  2m-2s-async

192.168.151.131 上的配置

(1)broker-a.properties(broker-a的master配置)

namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876    //所關聯的namesrv地址

brokerClusterName=FusionCluster     //叢集名稱
brokerName=broker-a 
brokerId=0                 //0代表主
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER             //角色
flushDiskType=ASYNC_FLUSH           //非同步刷盤
storePathRootDir=/opt/logs/rocketmqlogs/store  
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog //日誌存放目錄

(2)broker-b-s.properties(broker-b的slave配置)

namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10913   //更改埠號,同一臺機器上兩個broker不可採用同一埠

storePathRootDir=/opt/logs/rocketmqlogs/store  
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog

192.168.151.132 上的配置

 1、修改hosts檔案

    vi /etc/hosts  加入

    192.168.153.131  rocketmq.master
    192.168.153.132  rocketmq.slave

 

(1)broker-b.properties(broker-b的master配置)

namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/opt/logs/rocketmqlogs/store  
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog //日誌存放目錄

(2)broker-a-s.properties(broker-a的slave配置)

namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10915

storePathRootDir=/opt/logs/rocketmqlogs/store  
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog

注意: 這裡將broker-a和broker-b的主從分別放到不同的機器上啟動是為了保證當與一臺機器宕機時,另一臺可繼續工作。

 

3.啟動服務

         192.168.153.131

         sed -i  's#${user.home}#/opt#g'  *.xml       //將conf目錄下所有xml檔案中的${user.home}替換成/opt,進入rocketmq/conf目錄下執行該命令

         mqnamesrv &  啟動nameservice

         mqbroker   -c   /opt/alibaba-rocketmq/conf/2m-2s-async/broker-a.properties &           //啟動broker-a主

         mqbroker   -c   /opt/alibaba-rocketmq/conf/2m-2s-async/broker-b-s.properties &      //啟動broker-b從  

        192.168.153.132

         sed -i  's#${user.home}#/opt#g'  *.xml       //將conf目錄下所有xml檔案中的${user.home}替換成/opt,進入rocketmq/conf目錄下執行該命令

         mqnamesrv &  啟動nameservice

         mqbroker   -c   /opt/alibaba-rocketmq/conf/2m-2s-async/broker-b.properties &           //啟動broker-b主

         mqbroker   -c   /opt/alibaba-rocketmq/conf/2m-2s-async/broker-a-s.properties &       //啟動broker-a從 

4.到此已經完成,可以釋出rocketmq-console專案來檢視mq的資訊和配置。 

         建立一個topic到兩個broker上

          mqadmi  updateTopic -c FusionCluster  -b 192.168.153.131:10911   -t testbroker

         mqadmi  updateTopic -c FusionCluster  -b 192.168.153.132:10911   -t testbroker