1、RocketMQ介紹
1.1. 簡介
RocketMQ 是一款分佈式、隊列模型的消息中間件,具有以下特點:
能夠保證嚴格的消息順序 提供豐富的消息拉取模式 高效的訂閱者水平擴展能力 實時的消息訂閱機制 億級消息堆積能力
選用理由:
強調集羣無單點,可擴展,任意一點高可用,水平可擴展。
海量消息堆積能力,消息堆積後,寫入低延遲。
支持上萬個隊列
消息失敗重試機制
消息可查詢
開源社區活躍
成熟度(經過雙十一考驗)
1.2. 關鍵概念
1.2.1. 主題與標籤
主題Tpoic:第一級消息類型,書的標題 標籤Tags:第二級消息類型,書的目錄,可以基於Tag做消息過濾
例如:
主題:訂單交易
標籤:訂單交易-創建 訂單交易-付款 訂單交易-完成
1.2.2. 發送與訂閱羣組
生產組:用於消息的發送。
消費組:用於消息的訂閱處理。
生產組和消費組,方便擴縮機器,增減處理能力,集羣組的名字,用於標記用 途中的一員。每次只會隨機的發給每個集羣中的一員。
2、RocketMQ集羣方式
推薦的幾種 Broker 集羣部署方式,這裏的Slave 不可寫,但可讀,類似於 Mysql 主備方式。
2.1.單個 Master
這種方式風險較大,一旦Broker 重啓或者宕機時,會導致整個服務不可用,不建議線上環境使用。
2.2.多 Master 模式
一個集羣無 Slave,全是 Master,例如 2 個 Master 或者 3 個 Master
優點:配置簡單,單個Master 宕機或重啓維護對應用無影響,在磁盤配置爲 RAID10 時,即使機器宕機不可恢復情況下,由與 RAID10 磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)
。性能最高。
缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂 閱,消息實時性會受到受到影響。
先啓動 NameServer
在機器 A,啓動第一個 Master
在機器 B,啓動第二個 Master
2.1. 多 Master 多 Slave 模式,異步複製
每個 Master 配置一個 Slave,有多對Master-Slave,HA
採用異步複製方式,主備有短暫消息延遲,毫秒級。 優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因爲
Master 宕機後,消費者仍然可以從 Slave
消費,此過程對應用透明。不需要人工干預。性能同多 Master 模式幾乎一樣。 缺點:Master 宕機,磁盤損壞情況,會丟失少量消息。
先啓動 NameServer
在機器 A,啓動第一個 Master
在機器 B,啓動第二個 Master
在機器 C,啓動第一個 Slave
在機器 D,啓動第二個 Slave
2.2. 多 Master 多 Slave 模式,同步雙寫
每個 Master 配置一個 Slave,有多對Master-Slave,HA
採用同步雙寫方式,主備都寫成功,嚮應用返回成功。
優點:數據與服務都無單點,Master宕機情況下,消息無延遲,服務可用性與 數據可用性都非常高
缺點:性能比異步複製模式略低,大約低 10%左右,發送單個消息的 RT
會略高。目前主宕機後,備機不能自動切換爲主機,後續會支持自動切換功能。
先啓動 NameServer
在機器 A,啓動第一個 Master
在機器 B,啓動第二個 Master
在機器 C,啓動第一個 Slave
在機器 D,啓動第二個 Slave
以上 Broker 與 Slave 配對是通過指定相同的brokerName 參數來配對,Master 的 BrokerId 必須是 0,Slave 的BrokerId 必須是大與 0 的數。另外一個 Master 下面可以掛載多個 Slave,同一 Master 下的多個 Slave通過指定不同的 BrokerId 來區分。
3、RocketMQ部署【雙Master方式】
3.1. 服務器環境
序號
IP
用戶名
密碼
角色
模式
1
192.168.100.24
root
nameServer1,brokerServer1
Master1
2
192.168.100.25
root
nameServer2,brokerServer2
Master2
3.2. Hosts添加信息
vi/etc/hosts
IP
NAME
192.168.100.24
rocketmq-nameserver1
192.168.100.24
rocketmq-master1
192.168.100.25
rocketmq-nameserver2
192.168.100.25
rocketmq-master2
3.3.上傳解壓【兩臺機器】
上傳alibaba-rocketmq-3.2.6.tar.gz文件至/usr/local
tar -zxvf alibaba-rocketmq-3.2.6.tar.gz -C /usr/local
mv alibaba-rocketmq alibaba-rocketmq-3.2.6
ln -s alibaba-rocketmq-3.2.6 rocketmq ll /usr/local
3.4.創建存儲路徑【兩臺機器】
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index
3.5. RocketMQ配置文件【兩臺機器】
vim/usr/local/rocketmq/conf/2m-noslave/broker-a.properties
vim/usr/local/rocketmq/conf/2m-noslave/broker-b.properties
複製代碼
#所屬集羣名字 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
#刪除文件時間點,默認凌晨 4點
deleteWhen=04
#文件保留時間,默認 48 小時 fileReservedTime=120
#commitLog每個文件的大小默認1G mapedFileSizeCommitLog=1073741824
#ConsumeQueue每個文件默認存30W條,根據業務情況調整 mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#檢測物理文件磁盤空間 diskMaxUsedSpaceRatio=88
#存儲路徑
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存儲路徑 storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消費隊列存儲路徑存儲路徑
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/usr/local/rocketmq/store/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
複製代碼
3.6. 修改日誌配置文件【兩臺機器】
mkdir -p /usr/local/rocketmq/logs
cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
3.7. 修改啓動腳本參數【兩臺機器】(堆內存最少設置爲1g,不然會出錯)
vim/usr/local/rocketmq/bin/runbroker.sh
#============================================================
開發環境JVM Configuration
#============================================================
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m"
vim/usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m"
3.8. 啓動NameServer【兩臺機器】
cd /usr/local/rocketmq/bin
nohup sh mqnamesrv &
3.9. 啓動BrokerServer A【192.168.100.24】
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/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
3.10.啓動BrokerServer B【192.168.100.25】
cd /usr/local/rocketmq/bin
nohup sh mqbroker -c /usr/local/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
3.11.RocketMQ Console
在tomcat中部署rocketmq-console.war
3.12. 數據清理
複製代碼
cd /usr/local/rocketmq/bin
sh mqshutdown broker
sh mqshutdown namesrv
--等待停止
rm -rf /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store
mkdir /usr/local/rocketmq/store/commitlog
mkdir /usr/local/rocketmq/store/consumequeue
mkdir /usr/local/rocketmq/store/index
--按照上面步驟重啓NameServer與BrokerServer
複製代碼