RocketMQ 集羣部署

RocketMQ介紹

概述

image

Apache RocketMQ是一個具有低延遲、高性能和高可靠性、萬億級容量,同時具備靈活的、可伸縮性強的分佈式消息流處理平臺,它由四個部分組成:name servers, brokers, producers 和 consumers。它們所有部分都可以水平擴展避免單點故障,就像上圖所示。

名稱服集羣務 NameServer cluster
NameServer服務提供了輕量級的服務發現和路由。每個NameServer服務記錄完整的路由信息,提供一致的讀寫服務,支持快速存儲擴展

代理服務集羣 Broker Cluster
Broker通過提供輕量級主題和隊列機制來處理消息存儲。它們支持Push和Pull模型,包含容錯機制(2個副本或3個副本),提供了極強的峯值處理裏能力和按照時間順序存儲數以百萬記的消息存儲能力,此外,代理提供了災難恢復、豐富的度量統計和警報機制,這些都是在傳統的消息傳遞系統中缺乏的

生產者集羣 Producer Cluster
produce支持分佈式部署,分佈式的produce通過broker集羣提供的各種負載均衡策略將消息發送到broker集羣中。發送過程支持快速失敗是低延遲的。

消費者集羣 Consumer Cluster
消費者也支持在推送或者拉取模式下分佈式部署,它還支持集羣消費和消息廣播。提供實時的消息訂閱機制,能夠滿足大多數消費者的需求。RocketMQ的網站爲感興趣的用戶提供了一個簡單的快速入門指南。

名稱服務NameServer

NameServer是一個功能齊全的服務器,主要包括兩個功能:
⊙broker 管理,nameserver 接受來自broker集羣的註冊信息並提供心跳來檢測他們是否可用。
⊙路由管理,每一個nameserver都持有關於broker集羣和隊列的全部路由信息,用來向客戶端提供查詢。

我們知道 ,rocketMQ客戶端(生產者/消費者)會從nameserver查詢隊列的路由信息,客戶端是如何知道nameserver的地址的呢?

有四種方式能夠讓客戶端獲取到nameserver的地址:
⊙通過程序,像這樣producer.setNamesrvAddr("ip:port")
⊙java 配置項,這麼用rocketmq.namesrv.addr
⊙環境變量 NAMESRV_ADDR
⊙HTTP 端點
更多關於nameserver地址發現的詳細信息請參考這裏  

代理服務 broker server

broker server負責消息的存儲傳遞,消息查詢,保證高可用等等。

像下圖所示,broker server有一些非常重要的子模塊:

image
⊙remoting(遠程) 模塊,broker的入口,處理從客戶端發起的請求。
⊙client manager(客戶端管理),管理各個客戶端(生產者/消費者)還有維護消費者主題訂閱。
⊙store(存儲服務),提供簡單的api來在磁盤保持或者查詢消息。
⊙HA 高可用服務,提供主從broker的數據同步。
⊙index(索引服務),爲消息建立索引提供消息快速查詢。

RocketMQ與其他消息隊列服務的區別

如下圖,列出了 ActiveMQ、Kafka、RocketMQ 三者的區別,詳見官方文檔

image

服務器規劃

如下表,準備兩臺服務器,互爲主備:

image

RocketMQ環境準備

1、設置主機hosts

echo "192.168.2.177 rocketmq-nameserver1" >> /etc/hosts
echo "192.168.2.177 rocketmq-master1" >> /etc/hosts
echo "192.168.2.178 rocketmq-nameserver2" >> /etc/hosts
echo "192.168.2.178 rocketmq-master2" >> /etc/hosts

2、準備 JAVA 環境

下載 JAVA 安裝包:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

解壓下載的 jdk 包到 /usr/local 目錄,並配置環境變量

[root@rocketmq-nameserver1 ~]#  vim .bash_profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export PATH=$PATH:$JAVA_HOME/bin

3、準備 Maven 環境

下載 Maven 安裝包:http://maven.apache.org/download.cgi  

下載 bin 包,則直接解壓到 /use/local 目錄,再修改環境變量

[root@rocketmq-nameserver1 ~]#  vim .bash_profile
export JAVA_HOME=/usr/local/jdk1.8.0_201
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

RocketMQ部署

下載 RocketMQ 安裝包:http://rocketmq.apache.org/dowloading/releases/

解壓所下載的 RocketMQ 安裝包,進行編譯

[root@rocketmq-nameserver1 rocketmq-all-4.4.0]# mvn -Prelease-all -DskipTests clean install –U

此過程受限於網絡狀況,有可能非常緩慢,請耐心等待。。。。。。

編譯完成之後,進入 distribution/target/ 目錄,將該目錄下的 apache-rocketmq 目錄整個複製到 /usr/local 目錄下

[root@rocketmq-nameserver1 rocketmq-all-4.4.0]# cd distribution/target/
[root@rocketmq-nameserver1 target]# cp -raf apache-rocketmq /usr/local/rocketmq

進入 /usr/local/rocketmq/conf 目錄,修改日誌配置文件,將配置文件中的相關日誌路徑修改爲自己設置的路徑

[root@rocketmq-nameserver1 conf]# vim logback_broker.xml
[root@rocketmq-nameserver1 conf]# vim logback_namesrv.xml
[root@rocketmq-nameserver1 conf]# vim logback_tools.xml

再進入 2m-2s-async 目錄(注意:這裏一共三個目錄,2m-2s-async爲多主多異步複製預配置文件目錄,2m-2s-sync爲多主多從同步雙寫預配置文件目錄,2m-noslave爲雙主預配置文件目錄),修改 broker 配置文件

[root@rocketmq-nameserver1 2m-2s-async]# vim broker-a.properties
brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=0
brokerIP1=192.168.2.177
brokerIP2=192.168.2.177
listenPort=10911
storePathRootDir=/wdata/rocketmq/store
storePathCommitLog=/wdata/rocketmq/store/commitlog
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

保存退出

[root@rocketmq-nameserver1 2m-2s-async]# vim broker-a-s.properties
brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerId=1
brokerIP1=192.168.2.178
brokerIP2=192.168.2.178
listenPort=10920
storePathRootDir=/wdata/rocketmq/store-a-s
storePathCommitLog=/wdata/rocketmq/store-a-s/commitlog
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

保存退出

[root@rocketmq-nameserver1 2m-2s-async]# vim broker-b.properties
brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=0
brokerIP1=192.168.2.178
brokerIP2=192.168.2.178
listenPort=10911
storePathRootDir=/wdata/rocketmq/store
storePathCommitLog=/wdata/rocketmq/store/commitlog
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

保存退出

[root@rocketmq-nameserver1 2m-2s-async]# vim broker-b-s.properties
brokerClusterName=rocketmq-cluster
brokerName=broker-b
brokerId=1
brokerIP1=192.168.2.177
brokerIP2=192.168.2.177
listenPort=10920
storePathRootDir=/wdata/rocketmq/store-b-s
storePathCommitLog=/wdata/rocketmq/store-b-s/commitlog
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

保存退出

注意:這裏的 brokerId 格式爲主0從1

進入 /usr/local/rocketmq/bin ,修改 JAVA 虛擬機運行的所佔用的內存(這裏主要看服務器配置,如果服務器配置較差,建議修改)

[root@rocketmq-nameserver1 bin]# vim runbroker.sh

image

[root@rocketmq-nameserver1 bin]# vim runserver.sh

image

修改爲上圖中紅框中所示的內容

編輯 namesrv 服務的配置文件(此步可以忽略,採用系統默認的配置)

[root@rocketmq-nameserver1 conf]# vim /wdata/rocketmq/namesrv/namesrv.conf
rocketmqHome=/usr/local/rocketmq
kvConfigPath=/wdata/rocketmq/namesrv/kvConfig.json
configStorePath=/wdata/rocketmq/namesrv/namesrv.properties
productEnvName=center
clusterTest=false
orderMessageEnable=false
listenPort=9876
serverWorkerThreads=8
serverCallbackExecutorThreads=0
serverSelectorThreads=3
serverOnewaySemaphoreValue=256
serverAsyncSemaphoreValue=64
serverChannelMaxIdleTimeSeconds=120
serverSocketSndBufSize=65535
serverSocketRcvBufSize=65535
serverPooledByteBufAllocatorEnable=true
useEpollNativeSelector=false

主要修改相關的目錄以及端口號,其他想不用管

說明:以上配置中所涉及的字段含義,詳情請參閱官方文檔,這裏不錯過多說明。

複製文件

將 192.168.2.177 上 /usr/local/rocketmq 整個目錄複製到 192.168.2.178 上。

[root@rocketmq-nameserver1 local]# scp -r rocketmq [email protected]:/usr/local/
[root@rocketmq-nameserver1 local]# scp -r /wdata/rocketmq [email protected]:/wdata/

此處操作爲了方便起見,如果不是很放心,可在另外一臺服務器上做上述同樣的操作。

啓動 RocketMQ

在 192.168.2.177上操作

[root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqnamesrv -c /wdata/rocketmq/namesrv/namesrv.conf 2>&1 &
[root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-a.log 2>&1 &
[root@rocketmq-nameserver1 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-b-s.log 2>&1 &

在 192.168.2.178 上操作

[root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqnamesrv -c /wdata/rocketmq/namesrv/namesrv.conf 2>&1 &
[root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-b.log 2>&1 &
[root@rocketmq-nameserver2 ~]# nohup /usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties > /wdata/rocketmq/logs/rocketmqlogs/broker-a-s.log 2>&1 &

到此,RocketMQ 集羣部署完成,爲了查看集羣的狀態,我們可以使用 github 上的圖形化開源工具 rocketmq-console 。

下載 rocketmq-console :https://github.com/apache/rocketmq-externals

解壓並進入 rocketmq-console 目錄,進行編譯

[root@rocketmq-nameserver1 opt]# cd rocketmq-externals-master/rocketmq-console/

在編譯之前,需要先修改該目錄下的 pom.xml 文件

[root@rocketmq-nameserver1 rocketmq-console]# vim pom.xml

image

將上圖中紅框內的 <rocketmq.version>4.4.0-SNAPSHOT</rocketmq.version> 修改爲 <rocketmq.version>4.4.0</rocketmq.version>,不修改此處,在編譯的過程中可能會報錯。

編譯

[root@rocketmq-nameserver1 rocketmq-console]# mvn clean package -Dmaven.test.skip=true

此過程較爲漫長,需耐心等待。。。。。。

等編譯完成之後,進入 target/ 目錄

[root@rocketmq-nameserver1 rocketmq-console]# cd target/

運行 rocketmq-console-ng-1.0.0.jar 包

[root@rocketmq-nameserver1 target]# java -jar rocketmq-console-ng-1.0.0.jar

image

如上圖,出現 Tomcat started on port(s): 8080 (http) 表示服務開啓成功。

然後我們在瀏覽器中輸入 192.168.1.177:8080 查看

image

如圖,出現兩主兩從,表示我們的集羣配置成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章