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