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

  如下部署方式結合衆多博友的博客,通過本身一步一步實際搭建,若有雷同,侵權行爲,請見諒。。。其中遇到很多的坑,但願能幫到更多的人,如今不多能找到一份完整版4.2.6版本的搭建教程了,若是你有幸碰見,那麼咱們一定前世有緣。進入正題……java

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

多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會略高。目前主宕機後,備機不能自動切換爲主機,後續會支持自動切換功能。異步

注意:jvm

一、上述「2」只是說做爲一個集羣的最低配置數量,能夠根據實際狀況擴展。async

二、全部的刷盤(Dish Flush)操做所有默認爲:ASYNC_FLUSH(異步刷盤)。性能

核心概念:測試

  Disk Flush(磁盤刷新/同步操做):就是將內存的數據落地,存儲在磁盤中。spa

  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

 

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

二、雙Master

序號  ip            用戶名    密碼      角色               模式

(1) 10.43.98.34    root        nameServer1,brokerServer1   Master1

(2) 10.43.98.38   root        nameServer1,brokerServer1   Master2

 

一、Host添加信息

兩臺機器都執行vi  /etc/hosts,將nameServerbroker部署在同一臺機器上的,也能夠分開部署。  輸入以下圖所示的信息

 

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

 

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

 

# ping  rocketmq-nameserver2  

 

# ping  rocketmq-master2

 

  二、建立數據存儲路徑(兩臺機器都要建立)(爲方便後面集羣部署,最好設置,不設置也能夠成功部署)

任意你想設置保存位置的目錄下來存儲產生的數據的,我是/rocketmq1目錄下

mkdir store

mkdir store/commitlog

mkdir store/consumerqueue

mkdir store/index

  三、修改confRocketMQ的配置文件:(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。分別在3438上修改broker-a.propertiesbroker-b.properties

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

三、 修改日誌配置文件(略,可參考)

  修改日誌配置文件

  在建立的軟鏈接文件夾rocketmq下建立一個logs目錄 mkdir /opt/rocketmq/logs

 

  而後執行cd /opt/rocketmq/conf && sed -i 's#${user.home}#/opt/rocketmq#g' *.xml進行日誌文件的替換,sedlinux的替換命令。兩臺機器一樣操做。

四、 修改啓動腳本參數(JVM參數的調優)

1broker的調優

vi /opt/rocketmq/bin/runbroker.sh

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

2nameserver的調優

vi /opt/rocketmq/bin/runserver.sh

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

nameServerbroker放在了同一臺機器上,因此須要分別對nameServerbroker進行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是管理員命令,mqfiltersrvrocketmq的單獨組件,mqnamesrvNameServermqbrokerBroker

 啓動BrokerServer A 10.43.98.34BrokerServer 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監控界面查看,是否部署成功。。。

三、雙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 上的配置

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

相關文章
相關標籤/搜索