1、RocketMQ基礎知識介紹 Apache RocketMQ是阿里開源的一款高性能、高吞吐量、隊列模型的消息中間件的分佈式消息中間件。RocketMQ具備如下特色:javascript
上圖是一個典型的消息中間件收發消息的模型,RocketMQ也是這樣的設計,簡單說來 RocketMQ具備如下特色: 1)是一個隊列模型的消息中間件,具備高性能、高可靠、高實時、分佈式特色。 2)Producer、Consumer、隊列均可以分佈式。 3)Producer向一些隊列輪流發送消息,隊列集合稱爲Topic,Consumer若是作廣播消費,則一個consumer實例消費這個Topic對應的全部隊列,若是作集羣消費,則多個Consumer實例平均消費這個topic對應的隊列集合。 4)支持嚴格的消息順序; 5)提供豐富的消息拉取模式 6)高效的訂閱者水平擴展能力 7)實時的消息訂閱機制 8)億級消息堆積能力 9)較少的依賴 10)支持Topic與Queue兩種模式; 11)同時支持Push與Pull方式消費消息;前端
消息隊列的應用場景 1)異步處理 將不是必須的業務邏輯,進行異步處理,好比註冊以後短信、郵箱的發送java
2)應用解耦 訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。 庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操做。 假如:在下單時庫存系統不能正常使用。也不影響正常下單,由於下單後,訂單系統寫入消息隊列就再也不關心其餘的後續操做了。實現訂單系統與庫存系統的應用解耦。linux
3)流量削鋒,也是消息隊列中的經常使用場景,通常在秒殺或團搶活動中使用普遍。 應用場景:秒殺活動,通常會由於流量過大,致使流量暴增,應用掛掉。爲解決這個問題,通常須要在應用前端加入消息隊列。 a)能夠控制活動的人數; b)能夠緩解短期內高流量壓垮應用; c)用戶的請求,服務器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面; d)秒殺業務根據消息隊列中的請求信息,再作後續處理。vim
4)日誌處理服務器
5)消息通信 消息通信是指,消息隊列通常都內置了高效的通訊機制,所以也能夠用在純的消息通信。好比實現點對點消息隊列,或者聊天室等。異步
6)性能 RocketMQ單機也能夠支持億級的消息堆積能力。單機寫入TPS單實例約7萬條/秒,單機部署3個Broker,能夠跑到最高12萬條/秒,消息大小10個字節分佈式
RocketMQ 物理部署結構ide
如上圖所示, RocketMQ的部署結構有如下特色: 1)Name Server 可集羣部署,節點之間無任何信息同步。 2)Broker(消息中轉角色,負責存儲消息,轉發消息) 部署相對複雜,Broker 分爲Master 與Slave,一個Master 能夠對應多個Slave,可是一個Slave 只能對應一個Master,Master 與Slave 的對應關係經過指定相同的BrokerName,不一樣的BrokerId來定 義,BrokerId爲0 表示Master,非0 表示Slave。Master 也能夠部署多個。每一個Broker 與Name。 3)Producer 與Name Server 集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從Name Server 取Topic 路由信息,並向提供Topic 服務的Master 創建長鏈接,且定時向Master 發送心跳。Producer 徹底無狀態,可集羣部署。 4)Consumer 與Name Server 集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從Name Server 取Topic 路由信息,並向提供Topic 服務的Master、Slave 創建長鏈接,且定時向Master、Slave 發送心跳。Consumer既能夠從Master 訂閱消息,也能夠從Slave 訂閱消息,訂閱規則由Broker 配置決定。性能
Broker:消息中轉角色,負責存儲消息,轉發消息 Broker集羣有多種配置方式: 1)單Master 優勢:除了配置簡單沒什麼優勢 缺點:不可靠,該機器重啓或宕機,將致使整個服務不可用 2)多Master 優勢:配置簡單,性能最高 缺點:可能會有少許消息丟失(配置相關),單臺機器重啓或宕機期間,該機器下未被消費的消息在機器恢復前不可訂閱,影響消息實時性 3)多Master多Slave,每一個Master配一個Slave,有多對Master-Slave,集羣採用異步複製方式,主備有短暫消息延遲,毫秒級 優勢:性能同多Master幾乎同樣,實時性高,主備間切換對應用透明,不需人工干預 缺點:Master宕機或磁盤損壞時會有少許消息丟失 4)多Master多Slave,每一個Master配一個Slave,有多對Master-Slave,集羣採用同步雙寫方式,主備都寫成功,嚮應用返回成功 優勢:服務可用性與數據可用性很是高 缺點:性能比異步集羣略低,當前版本主宕備不能自動切換爲主
Master和Slave的配置文件參考conf目錄下的配置文件 Master與Slave經過指定相同的brokerName參數來配對,Master的BrokerId必須是0,Slave的BrokerId必須是大於0的數。 一個Master下面能夠掛載多個Slave,同一Master下的多個Slave經過指定不一樣的BrokerId來區分。
2、RocketMQ集羣部署記錄
部署需求: 準備5臺虛擬機,其中4臺做爲rocektmq broker(雙master 雙slave,同步雙寫,異步刷盤),另1臺用做rocektmq的console(rocketmq監控平臺)和nameserver。 0)基礎信息
ip地址 主機名 角色 192.168.10.202 mq-master01 broker-a 192.168.10.203 mq-master02 broker-b 192.168.10.205 mq-slave01 broker-a-s 192.168.10.206 mq-slave02 broker-b-s 192.168.10.207 mq-console-nameserver nameserver、console -------------------------------------------------------------------------- 其實也能夠不用那麼多機器,2臺機器也能夠,broker-a和broker-b-s在一臺機器(也就是說broker-a的主節點與broker-b的從節點部署在一臺服務器), broker-a-s和broker-b在一臺機器。nameserver和console部署到2臺中的任一臺上。 -------------------------------------------------------------------------- 關閉5臺機器的iptables和selinux(全部節點機器上都要操做) [root@mq-master01 ~]# /etc/init.d/iptables stop [root@mq-master01 ~]# vim /etc/sysconfig/selinux ...... SELINUX=disabled [root@mq-master01 ~]# setenforce 0 [root@mq-master01 ~]# getenforce Permissive 5臺機器都要按照java環境 [root@mq-master01 ~]# java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) -------------------------------------------------------------------------- 5臺機器必定要提早作hosts綁定,不然後續啓動broker的時候,會報錯諸如: java.net.UnknownHostException: mq-master01: mq-master01: Name or service not known [root@mq-master01 bin]# cat /etc/hosts ...... 192.168.10.202 mq-master01 192.168.10.203 mq-master02 192.168.10.205 mq-slave01 192.168.10.206 mq-slave02 192.168.10.207 mq-console-nameserver
1)rocektmq broker 雙master雙slave部署
1)安裝rocketmq(四臺broker節點機器操做同樣) 下載地址:https://pan.baidu.com/s/16UAXHwzzy0DoGX4u93vK7A 提取密碼:rjib [root@mq-master01 software]# pwd /data/software [root@mq-master01 software]# unzip rocketmq3.2.6.zip [root@mq-master01 software]# ln -s /data/software/alibaba-rocketmq3.2.6 /data/rocketmq 建立存儲路徑 [root@mq-master01 software]# mkdir -p /data/rocketmq/store [root@mq-master01 software]# mkdir -p /data/rocketmq/store/commitlog [root@mq-master01 software]# mkdir -p /data/rocketmq/store/consumequeue [root@mq-master01 software]# mkdir -p /data/rocketmq/store/index [root@mq-master01 software]# ls /data/rocketmq/ benchmark bin conf issues lib LICENSE.txt readme.txt store test wiki [root@mq-master01 software]# ls /data/rocketmq/store/ commitlog consumequeue index --------------------------------------------------------------------------------- 2)配置rocektmq broker (四個節點機器都要操做) mq-master01節點配置/data/rocketmq/conf/2m-2s-sync/broker-a.properties [root@mq-master01 ~]# vim /data/rocketmq/conf/2m-2s-sync/broker-a.properties #所屬集羣名字 brokerClusterName=rocketmq-cluster #broker名字,注意此處不一樣的配置文件填寫的不同 例如:在a.properties 文件中寫 broker-a 在b.properties 文件中寫 broker-b brokerName=broker-a #0 表示 Master,>0 表示 Slave brokerId=0 #nameServer地址,這裏nameserver是單臺,若是nameserver是多臺集羣的話,就用分號分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3) namesrvAddr=192.168.10.207: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=/data/software/rocketmq/store #commitLog 存儲路徑 storePathCommitLog=/data/software/rocketmq/store/commitlog #消費隊列存儲路徑存儲路徑 storePathConsumeQueue=/data/software/rocketmq/store/consumequeue #消息索引存儲路徑 storePathIndex=/data/software/rocketmq/store/index #checkpoint 文件存儲路徑 storeCheckpoint=/data/software/rocketmq/store/checkpoint #abort 文件存儲路徑 abortFile=/data/software/rocketmq/store/abort #限制的消息大小 maxMessageSize=65536 #flushCommitLogLeastPages=4 #flushConsumeQueueLeastPages=2 #flushCommitLogThoroughInterval=10000 #flushConsumeQueueThoroughInterval=60000 #Broker 的角色 #- ASYNC_MASTER 異步複製Master #- SYNC_MASTER 同步雙寫Master #- SLAVE brokerRole=MASTER #要配置爲MASTER或SLAVE的角色 #刷盤方式 #- ASYNC_FLUSH 異步刷盤 #- SYNC_FLUSH 同步刷盤 flushDiskType=SYNC_FLUSH #checkTransactionMessageEnable