RocketMQ是一個由阿里巴巴開源的消息中間件, 2012年開源,2017年成爲apache頂級項目。RocketMQ在阿里內部應用是很是普遍的,阿里內部的幾千個應用都運行在RocketMQ之上,雙十一期間須要處理億萬級別的消息,TPS能夠達到幾十萬。目前支持Java、C/C++,Python、Go四種語言訪問。java
RocketMQ如今有兩個版本,一個是社區開源版,一個是商業的雲服務版(AliwareMQ)。最新版本:4.8.0(本文演示版本)。git
它的核心設計借鑑了Kafka,因此咱們在學習RocketMQ的時候,會發現不少和kafka相同的特性,可是在某些功能上和kafka又有較大的差別,它有如下一些特性:github
RocketMQ天生對集羣的支持很是好,它有如下一些模式:web
每一個Master配一個Slave,有多對Master-Slave,集羣採用異步複製方式,主備有短暫消息延遲,毫秒級spring
每一個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這個目錄中的文件。在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監聽的是9876端口
nohup sh /jackxu/rocketmq/bin/mqnamesrv >/jackxu/rocketmq/logs/mqnamesrv.log 2>&1 &
查看日誌
tail -f /jackxu/rocketmq/logs/mqnamesrv.log
啓動的時候按照下面的順序來,-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命令,一共四個進程沒問題
可是大多數狀況下不會這麼順利,我在安裝中有一些坑點:
解決辦法就是修改配置文件
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
與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
cd target java -jar rocketmq-console-ng-2.0.0.jar
訪問一下 http://42.192.77.73:7298/ ,能夠看到都已經啓動成功了
這裏有兩個踩坑點,在啓動的時候會報錯
systemctl disable firewalld.service
再次啓動仍是不行,而後個人第二個反應是端口沒有開放,telnet一下
telnet 42.192.77.73 9876
果真telnet不通,緣由是這樣的,我安裝在雲服務器上,默認端口是不開放的,須要到控制檯打開,這也算是一個經驗吧。
#新增公網IP brokerIP1=39.103.144.86
其中最經常使用的是集羣,主題,消費者和消息這四部分。
下面介紹一下安裝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
流程圖
咱們推薦的配置是異步刷盤+同步複製。
在以前的版本中,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...