手把手教你搭建 RocketMQ 高可用集羣!

image.png

RocketMQ發展歷史

RocketMQ是一個由阿里巴巴開源的消息中間件, 2012年開源,2017年成爲apache頂級項目。RocketMQ在阿里內部應用是很是普遍的,阿里內部的幾千個應用都運行在RocketMQ之上,雙十一期間須要處理億萬級別的消息,TPS能夠達到幾十萬。目前支持Java、C/C++,Python、Go四種語言訪問。java

RocketMQ如今有兩個版本,一個是社區開源版,一個是商業的雲服務版(AliwareMQ)。最新版本:4.8.0(本文演示版本)。git

它的核心設計借鑑了Kafka,因此咱們在學習RocketMQ的時候,會發現不少和kafka相同的特性,可是在某些功能上和kafka又有較大的差別,它有如下一些特性:github

  • 支持集羣模型、負載均衡、水平擴展能力
  • 億級別消息堆積能力
  • 採用零拷貝的原理,順序寫盤,隨機讀
  • 底層通訊框架採用Netty NIO
  • NameServer代替Zookeeper,實現服務尋址和服務協調
  • 消息失敗重試機制、消息可查詢
  • 強調集羣無單點,可擴展,任意一點高可用,水平可擴展
  • 通過屢次雙十一的考驗

高可用架構

RocketMQ天生對集羣的支持很是好,它有如下一些模式:web

單Master

  • 優勢:除了配置簡單沒什麼優勢
  • 缺點:不可靠,該機器重啓或者宕機,將要致使整個服務不可用

多Master

  • 優勢:配置簡單,性能最高
  • 缺點:可能會有少許消息丟失(配置相關),單臺機器重啓或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性

多Master多Slave

每一個Master配一個Slave,有多對Master-Slave,集羣採用異步複製方式,主備有短暫消息延遲,毫秒級spring

  • 優勢:性能同多Master幾乎同樣,實時性高,主備間切換對應用透明,不需人工干預
  • 缺點:Master宕機或磁盤損壞時會有少許消息丟失

多Master多Slave

每一個Master配一個Slave,有多對Master-Slave,集羣採用同步雙寫方式,主備都寫成功,嚮應用返回成功apache

  • 優勢:服務可用性與數據可用性很是高
  • 缺點:性能比異步集羣略低,當前版本主宕備不能自動切換爲主

二主二從異步集羣安裝

本文采用的是二主二從安裝模式,即第四種多Master多Slavevim

端口規劃

首先我買了兩臺雲服務器,平時我會用來學習安裝一些中間件,比較方便,你們有條件的話也能夠買下,固然也能夠經過在本地安裝虛擬機的方式來操做。服務器

圖片

接下來我要經過這兩臺服務器來實現二主二從的安裝,首先對它們的端口進行一下規劃架構

第一臺機器  42.192.77.73
#端口規劃:
9876     NameServer1
10910    BrokerA-master
10921    BrokerB-slave
第二臺機器  39.103.144.86
#端口規劃:
9876     NameServer2
10920    BrokerB-master
10911    BrokerA-slave

畫圖看上去更加清晰明瞭一些app

圖片

下載

從官網rocketmq.apache.org/進去得到最新的下載地址,紅框裏標註出來的

圖片

這裏的地址均可以,下載下來

cd /jackxu
wget https://mirror.bit.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip

下載好後解壓,改個名字

unzip rocketmq-all-4.8.0-bin-release.zip
mv unzip rocketmq-all-4.8.0-bin-release.zip rocketmq

配置第一臺機器

在兩臺機器上都下載、解壓好。在rocketmq/conf目錄下,有三種建議配置模式:

  • 2m-2s-async(2主2從異步) —— 本文采用這種
  • 2m-2s-sync (2主2從同步)
  • 2m-noslave (2主)

如今須要修改兩臺機器上2m-2s-async這個目錄中的文件。在42.192.77.73機器上修改broker-a.properties

cd /jackxu/rocketmq/conf/2m-2s-async
vim  broker-a.properties

修改集羣名字

brokerClusterName=jackxu-cluster

增長的內容

#Broker 對外服務的監聽端口
listenPort=10910
#是否容許 Broker 自動建立Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否容許 Broker 自動建立訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-a
#commitLog 存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-a/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-a/index
#checkpoint 文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

修改broker-b-s.properties

vim  broker-b-s.properties

修改集羣名字

brokerClusterName=jackxu-cluster

增長的內容

#Broker 對外服務的監聽端口
listenPort=10921
#是否容許 Broker 自動建立Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否容許 Broker 自動建立訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-b-s
#commitLog 存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-b-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b-s/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-b-s/index
#checkpoint 文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

配置第二臺機器

在39.103.144.86機器上修改broker-b.properties

cd /jackxu/rocketmq/conf/2m-2s-async
vim  broker-b.properties

修改集羣名字

brokerClusterName=jackxu-cluster

增長的內容

#Broker 對外服務的監聽端口
listenPort=10920
#是否容許 Broker 自動建立Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否容許 Broker 自動建立訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-b
#commitLog 存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-b/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-b/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-b/index
#checkpoint 文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

修改broker-a-s.properties

vim  broker-a-s.properties

修改集羣名字

brokerClusterName=jackxu-cluster

增長的內容

#Broker 對外服務的監聽端口
listenPort=10911
#是否容許 Broker 自動建立Topic,建議線下開啓,線上關閉
autoCreateTopicEnable=true
#是否容許 Broker 自動建立訂閱組,建議線下開啓,線上關閉
autoCreateSubscriptionGroup=true
#nameServer地址,分號分割
namesrvAddr=39.103.144.86:9876;42.192.77.73:9876
#存儲路徑
storePathRootDir=/jackxu/rocketmq/store/broker-a-s
#commitLog 存儲路徑
storePathCommitLog=/jackxu/rocketmq/store/broker-a-s/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/jackxu/rocketmq/store/broker-a-s/consumequeue
#消息索引存儲路徑
storePathIndex=/jackxu/rocketmq/store/broker-a-s/index
#checkpoint 文件存儲路徑
storeCheckpoint=/jackxu/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/jackxu/rocketmq/store/abort

建立數據目錄

第一臺機器42.192.77.73執行,只須要執行一次

mkdir -p /jackxu/rocketmq/store/broker-a /jackxu/rocketmq/store/broker-a/consumequeue /jackxu/rocketmq/store/broker-a/commitlog /jackxu/rocketmq/store/broker-a/index /jackxu/rocketmq/logs /jackxu/rocketmq/store/broker-b-s /jackxu/rocketmq/store/broker-b-s/consumequeue /jackxu/rocketmq/store/broker-b-s/commitlog /jackxu/rocketmq/store/broker-b-s/index

第二臺機器39.103.144.86執行,只須要執行一次

mkdir -p /jackxu/rocketmq/store/broker-a-s /jackxu/rocketmq/store/broker-a-s/consumequeue /jackxu/rocketmq/store/broker-a-s/commitlog /jackxu/rocketmq/store/broker-a-s/index /jackxu/rocketmq/logs /jackxu/rocketmq/store/broker-b /jackxu/rocketmq/store/broker-b/consumequeue /jackxu/rocketmq/store/broker-b/commitlog /jackxu/rocketmq/store/broker-b/index

啓動兩個NameServer

在兩臺機器分別執行,& 表示在後臺運行,默認狀況下,nameserver監聽的是9876端口

nohup sh /jackxu/rocketmq/bin/mqnamesrv >/jackxu/rocketmq/logs/mqnamesrv.log 2>&1 &

查看日誌

tail -f /jackxu/rocketmq/logs/mqnamesrv.log

啓動Broker

啓動的時候按照下面的順序來,-c 是指定broker的配置文件

一、啓動73的A主

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-a.properties > /jackxu/rocketmq/logs/broker-a.log 2>&1 &

二、啓動86的A從

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties > /jackxu/rocketmq/logs/broker-a-s.log 2>&1 &

三、啓動86的B主

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-b.properties > /jackxu/rocketmq/logs/broker-b.log 2>&1 &

四、啓動73的B從

nohup sh /jackxu/rocketmq/bin/mqbroker -c /jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties > /jackxu/rocketmq/logs/broker-b-s.log 2>&1 &

查看日誌

tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-a.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-b.properties
tail -f /jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties

檢查是否啓動成功

輸入jps命令,一共四個進程沒問題

圖片

可是大多數狀況下不會這麼順利,我在安裝中有一些坑點:

  • 一、沒有安裝jdk,由於這是我新的服務器,上面是沒有jdk環境的,你們知道rocketmq是用java寫的,因此須要有java環境才能運行,包括jps命令就是查看java進程

圖片

  • 二、內存不足,由於默認的配置文件設置了很大的內存,可是個人機器只有1核2G,確定是不夠的,因此在啓動的時候會報內存不足

圖片

解決辦法就是修改配置文件

vim /jackxu/rocketmq/bin/runserver.sh
vim /jackxu/rocketmq/bin/runbroker.sh

把NameServer和Broker的內存大小都改小一點,而後從新啓動便可

圖片

關閉命令

中止服務的時候須要注意,要先中止broker,其次中止nameserver。

cd /jackxu/rocketmq/bin
sh mqshutdown namesrv
sh mqshutdown broker

web控制檯安裝

與kafka不一樣的是,rocket官方提供了一個可視化控制檯,你們能夠在這裏下載

https://github.com/apache/rocketmq-externals

這個是rocketmq的擴展,裏面不只包含控制檯的擴展,也包含對大數據flume、hbase等組件的對接和擴展。

下載

下載源碼,通常下載速度會比較慢,等不及的話能夠去網盤下載連接:

cd /jackxu
wget https://github.com/apache/rocketmq-externals/archive/master.zip

解壓

unzip master.zip

修改配置文件

cd /jackxu/rocketmq-externals-master/rocketmq-console/src/main/resources
vim application.properties
#這是一個spring boot項目,咱們須要修改裏面的參數
#修改端口號:
server.port=7298
#修改name server地址(多個地址用英文分號隔開)
rocketmq.config.namesrvAddr=39.103.144.86:9876;42.192.77.73:9876

打包

打成一個jar包, 這裏須要先安裝maven,編譯慢的話能夠替換成淘寶的鏡像

cd /jackxu/rocketmq-externals-master/rocketmq-console
mvn clean package -Dmaven.test.skip=true

啓動jar包

cd target
java -jar rocketmq-console-ng-2.0.0.jar

訪問

訪問一下  http://42.192.77.73:7298/  ,能夠看到都已經啓動成功了

圖片

踩坑點

這裏有兩個踩坑點,在啓動的時候會報錯

  • (1)spring boot啓動的時候報鏈接不上39.103.144.86:9876;42.192.77.73:9876,這裏個人第一反應是防火牆的緣由,關閉一下
systemctl disable firewalld.service

再次啓動仍是不行,而後個人第二個反應是端口沒有開放,telnet一下

telnet 42.192.77.73 9876

果真telnet不通,緣由是這樣的,我安裝在雲服務器上,默認端口是不開放的,須要到控制檯打開,這也算是一個經驗吧。

圖片

  • (2)再次啓動的時候又報了另外一個錯誤,鏈接不上172.26.182.88:9876,當時我就奇怪了,我寫的地址裏沒有這個地址啊,怎麼在鏈接它,並且這個IP看上去又像是內網地址,後來我打開阿里雲控制檯一看,果然是這臺機器的內網地址,而後我又百度了一番,大概緣由就是RocketMQ是阿里開源的,而那臺機器又是阿里雲的機器,它的源碼裏應該是優先鏈接到阿里雲的內網地址,網上的作法是在配置文件裏面顯式的加上公網地址便可解決。
#新增公網IP
brokerIP1=39.103.144.86

控制檯介紹

  • 運維:主要是設置nameserver和配置vipchannel。
  • 駕駛艙:控制檯的dashboard,能夠分別按broker和主題來查看消息的數量和趨勢。
  • 集羣:整個RocketMQ的集羣狀況,包括分片,編號,地址,版本,消息生產和消息消費的TPS等,這個在作性能測試的時候能夠做爲數據指標。
  • 主題:即topic,能夠新增/更新topic,也能夠查看topic的信息,如狀態,路由,消費者管理和發送消息等。
  • 消費者:能夠在當前broker中查看/新建消費者group,包括消費者信息和消費進度。
  • 生產者:能夠在當前broker中查看生產組下的生產者group,包括生產者信息和生產者狀態。
  • 消息:能夠按照topic,messageID,messageKey分別查詢具體的消息。
  • 用戶中心:切換語言和登陸相關(登陸須要在console的配置中打開對應配置,默認不須要登陸)。

其中最經常使用的是集羣,主題,消費者和消息這四部分。

配置文件說明

下面介紹一下安裝RocketMQ配置文件裏面的屬性首先是集羣名字相同,上面四臺機器的集羣名字都叫 brokerClusterName=jackxu-cluster,其次是鏈接到相同的NameServer,namesrvAddr=39.103.144.86:9876;42.192.77.73:9876。在配置文件中brokerId=0表明master,brokerId=1表明slave。

在配置文件中還有這兩個屬性

圖片

brokerRole在master broker能夠配置成SYNC_MASTER或者ASYNC_MASTER,在slave broker統一配置成SLAVE

圖片

圖片

流程圖

圖片

咱們推薦的配置是異步刷盤+同步複製。

HA與故障轉移

在以前的版本中,RocketMQ只有master/slave一種部署方式,一組broker中有一個master,有0到多個slave,這種模式下提供了必定的高可用性。

master在掛了的狀況下,slave仍然能夠提供讀服務。默認狀況下,讀寫都在master上,若是開啓了slaveReadEnable=true,slave也能夠參與讀負載,可是是在master積壓的消息超過了物理內存的40%,纔會默認轉向brokerId爲1的從服務器讀取,具體轉向哪臺機器由whichBrokerWhenConsumeSlowly參數控制。

org.apache.rocketmq.common.subscription.SubscriptionGroupConfig
private long whichBrokerWhenConsumeSlowly=1;

因爲是多主的存在,當一個master掛了之後,能夠寫到其餘的master上。

RocketMQ 2019年3月發佈的4.5.0版本中,利用Dledger技術解決了自動選主的問題。Dledger就是一個基於raft協議的commitlog存儲庫,也是RocketMQ實現新的高可用多副本架構的關鍵。它的優勢是不須要引入外部組件,自動選主邏輯集成到各個節點的進程中,節點之間經過通訊就能夠完成選主。

架構圖

圖片

在這種狀況下,commitlog是Dledger管理的,具備選主的功能。默認是不開啓,若是須要開啓,須要在配置文件裏面添加如下配置:

# 是否啓用DLedger
    enableDLegerCommitLog=true
    # DLedger Raft Group的名字
    dLegerGroup=broker-a
    # DLedger Group內各節點的地址和端口,至少須要3個節點
    dLegerPeers=n0-192.168.44.163:10911;n1-192.168.44.164:10911;n2-192.168.44.165:10911
    # 本節點id
    dLegerSelfId=n0

結語

小夥伴在學習一箇中間件的時候必定要動手實踐安裝,首先是體驗一下安裝的過程氛圍,瞭解一些參數配置,雖然咱們平時可能接觸不到,可是學習仍是須要的,不必定須要精,至少是要會。

來源:jack_xu | https://juejin.cn/post/692950...

image

相關文章
相關標籤/搜索