Linux下搭建RocketMQ4.5.2集羣並設置開機自啓

一、環境說明

        CentOS7;RocketMQ4.5.2;防火牆關閉;虛擬機地址:192.168.0.40,192.168.0.41,192.168.0.42,192.168.0.75;

因爲之前該虛擬機上搭建了其他的東西,因此這次就指定別名了,直接通過ip和端口訪問;

二、軟件說明

        RocketMQ本是阿里自己的,後來捐給阿帕奇了,截止到我寫這篇博客的時候,阿帕奇公佈的RocketMQ的版本是4.5.2,因此這次安裝的是4.5.2的。

下載地址:http://rocketmq.apache.org/,首頁展示的最新本的版本,點擊進去下載即可,若需要之前的版本,可點擊Documentation--》左邊Download--》選擇你想要安裝的版本即可安裝,選擇Binary版本的,可直接安裝使用,不要選擇Source版本的,那個是源碼版本的,無法直接使用還得編譯。

三、單機版搭建

單機版的我安裝在192.168.0.75虛擬機上

1、上傳安裝包到75虛擬機的/root目錄

2、解壓,並重命名爲rocketmq,unzip rocketmq-all-4.5.2-bin-release.zip,mv rocketmq-all-4.5.2-bin-release rocketmq

3、創建RocketMQ存儲文件的目錄,依次執行如下命令:

cd rocketmq
mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index

文件夾說明:

logs:存儲RocketMQ日誌目錄
store:存儲RocketMQ數據文件目錄
commitlog:存儲RocketMQ消息信息
consumequeue、index:存儲消息的索引數據

4、 修改配置文件,進入rocketmq的conf目錄

conf目錄配置文件說明:

2m-2s-async:2主2從異步
2m-2s-sync :2主2從同步
2m-noslave :2主沒有從

因爲要搭建單機版的,所以只要對其中一個文件夾中的文件進行修改即可,我們修改2m-2s-async的配置實現。

4.1、進入2m-2s-async目錄,修改第1個配置文件broker-a.properties,vim broker-a.propertie

將如下配置覆蓋掉broker-a.properties所有配置:

#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分號分割
namesrvAddr=192.168.0.75: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=/root/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/root/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/root/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
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128

 4.2、進入conf目錄,替換所有xml中的${user.home},保證日誌路徑正確

sed -i 's#${user.home}#/root/rocketmq#g' *.xml

注意:sed -i在這裏起一個批量替換的作用,

sed -i 's#原字符串#新字符#g' 替換的文件

5、RocketMQ對內存的要求比較高,最少1G,如果內存太少,會影響RocketMQ的運行效率和執行性能。我們需要修改bin目錄下的runbroker.sh和runserver.sh文件

runbroker.sh

改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

改後:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"

runserver.sh

改前:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

改後:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

6、啓動RocketMQ,注意先啓動namesrv再啓動broker

啓動namesrv,nohup sh mqnamesrv &

再啓動broker,nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &

輸入jps查看進程,可看到NamesrvStartup和BrokerStartup兩個進程即代表啓動

四、RocketMQ控制檯安裝

我們這裏直接將RocketMQ控制代碼的源碼放到IDEA中運行,後面我們可以打包成jar包在虛擬機上運行。RocketMQ的控制檯由一些RocketMQ愛好者提供。

下載地址:https://github.com/apache/rocketmq-externals/tree/master

rocketmq-connect-console下載並導入到我們本地的idea中,然後修改application.properties,配置RocketMQ的namesrv地址,如下圖:

修改好以後找到啓動類啓動以後即可查看如下圖,等RocketMQ收到消息以後即可在該控制檯查看消息的情況

五、集羣搭建

1、搭建說明

我準備了四臺虛擬機:192.168.0.40,192.168.0.41,192.168.0.42,192.168.0.75

準備搭建兩主兩從異步刷盤同步複製集羣,40,41爲主,42,75爲從

刷盤:broker收到消息以後會先存在內存中,如果消息從內存寫入磁盤然後再反饋給客戶端收到消息即爲同步刷盤,若消息寫入內存以後直接反饋給客戶端收到消息,等待某個時間段再統一從內存寫入到磁盤中則爲異步刷盤。同步刷盤頻繁跟磁盤交互,效率不如異步刷盤的高。

複製:broker分爲主從,主收到消息以後複製到從節點,然後再反饋給客戶端,則爲同步複製,否則爲異步複製。

工作中常用的是異步刷盤和同步複製相結合的模式,保證無單點的情況。

2、環境準備

75上剛纔已經安裝了RocketMQ,現在要將其作爲一個從節點使用,那麼若75處於運行當中,則先停止75上的RocketMQ,啓動時候是先啓動namesrv再啓動broker,停止的時候則先停止broker再停止namesrv。

進入75的rocketmq的bin文件夾下,執行以下命令:

sh mqshutdown broker
sh mqshutdown namesrv

3、4臺機器一起解壓rocketmq壓縮文件,最後將解壓文件存放在/root/rocketmq目錄下。

分別在4臺機器的rocketmq目錄下執行如下操作:

mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index

進入40集羣rocketmq/conf/2m-2s-sync目錄下配置對應的配置文件,修改broker-a.properties配置文件,如下:

#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分號分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/root/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 異步複製Master
# - SYNC_MASTER 同步雙寫Master
# - SLAVE
brokerRole=SYNC_MASTER
# 刷盤方式
# - ASYNC_FLUSH 異步刷盤
# - SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128

修改broker-b.properties文件,如下:

#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分號分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/root/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 異步複製Master
# - SYNC_MASTER 同步雙寫Master
# - SLAVE
brokerRole=SYNC_MASTER
# 刷盤方式
# - ASYNC_FLUSH 異步刷盤
# - SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128

修改broker-a-s.properties文件,如下:

#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=1
#nameServer 地址,分號分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/root/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 異步複製Master
# - SYNC_MASTER 同步雙寫Master
# - SLAVE
brokerRole=SLAVE
# 刷盤方式
# - ASYNC_FLUSH 異步刷盤
# - SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128

修改broker-b-s.properties文件,如下:

#所屬集羣名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此處不同的配置文件填寫的不一樣
brokerName=broker-b
#0 表示Master, > 0 表示slave
brokerId=1
#nameServer 地址,分號分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存儲路徑
storePathCommitLog=/root/rocketmq/store/commitlog
#消費隊列存儲路徑
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存儲路徑
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存儲路徑
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存儲路徑
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 異步複製Master
# - SYNC_MASTER 同步雙寫Master
# - SLAVE
brokerRole=SLAVE
# 刷盤方式
# - ASYNC_FLUSH 異步刷盤
# - SYNC_FLUSH 同步刷盤
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#發消息線程池數量
#sendMessageTreadPoolNums=128
#拉消息線程池數量
#pullMessageTreadPoolNums=128

將節點信息拷貝到每臺機器,在40機器執行如下命令:

scp broker-*.properties 192.168.0.41:/root/rocketmq/conf/2m-2s-sync
scp broker-*.properties 192.168.0.42:/root/rocketmq/conf/2m-2s-sync
scp broker-*.properties 192.168.0.75:/root/rocketmq/conf/2m-2s-sync

 進入到每臺機器的conf目錄,替換日誌文件路徑,執行如下命令:

sed -i 's#${user.home}#/root/rocketmq#g' *.xml

進入每臺機器的bin目錄下,需改runbroker.sh和runserver.sh文件:

runbroker.sh

改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

改後:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"

runserver.sh

改前:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

改後:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

4、啓動集羣

先在每臺服務器啓動namesrv

nohup sh mqnamesrv &

再啓動broker,

40服務器執行如下啓動命令:

nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-a.properties > /dev/null 2>&1 &

41服務器執行如下啓動命令:

nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-b.properties > /dev/null 2>&1 &

42服務器執行如下啓動命令:

nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-a-s.properties > /dev/null 2>&1 &

75服務器執行如下啓動命令:

nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-b-s.properties > /dev/null 2>&1 &

輸入jps查看進程,每臺機器上看到NamesrvStartup和BrokerStartup即爲啓動成功。

5、控制檯查看集羣

在控制檯的項目application.properties的namesrv地址,如下修改:

rocketmq.config.namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75:9876

 6、啓動控制檯服務,並訪問控制檯,如下:

這裏如果想停掉服務,可以先停掉broker:

sh mqshutdown broker

再關閉namesrv:

sh mqshutdown namesrv

7、問題注意 

當使用控制檯的項目查看集羣的時候,啓動以後可能會報:RemotingConnectException: connect to <172.17.0.1:10909> failed,

如果你的rocketmq版本小於3.5.8,那麼你需要在控制檯的項目的application.properties中的rocketmq.config.isVIPChannel設置爲false即可解決,如下圖:

若你的rocketmq版本大於3.5.8,那麼控制檯的項目的application.properties中的rocketmq.config.isVIPChannel不需要設置任何值,其默認是true,但是你需要在對應機器的集羣配置文件中加上,brokerIP1=你機器的ip,據說是因爲你虛擬機多網卡導致的,指定以後就沒整個問題了。

舉個例子:41機器,我啓動broker時根據上面的命令我用的是conf/2m-2s-sync/broker-b.properties文件,那麼我在broker-b.properties中加入brokerIP1=你機器的ip即可,如下圖

六、利用腳本設置開機自啓

1、 編寫管理腳本命令,vi /etc/init.d/rocketmq

#!/bin/sh
#
# rocketmq - this script starts and stops the rocketmq daemon
#
# chkconfig: - 85 15

ROCKETMQ_HOME=/root/rocketmq
ROCKETMQ_BIN=${ROCKETMQ_HOME}/bin
ADDR=192.168.0.75:9876
LOG_DIR=${ROCKETMQ_HOME}/logs

start() {
if [ ! -d ${LOG_DIR} ];then
mkdir ${LOG_DIR}
fi
cd ${ROCKETMQ_HOME}
nohup sh bin/mqnamesrv &
echo -n "The Name Server boot success..."
nohup sh bin/mqbroker -c ${ROCKETMQ_HOME}/conf/2m-2s-sync/broker-b-s.properties > /dev/null 2>&1 &
echo -n "The broker[%s, ${ADDR}] boot success..."
}
stop() {
cd ${ROCKETMQ_HOME}
sh bin/mqshutdown broker
sleep 1
sh bin/mqshutdown namesrv
}
restart() {
stop
sleep 5
start
}


case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac

 注意:

(1.1)注: 複製這個腳本到Linux可能會丟失最上面的一部分,不知道爲什麼,通過xshell打開Linux,然後複製這些內容到文件中,會丟失一部分,自己複製過去以後檢查清楚是否丟失一些內容。不然就算註冊成一個服務也沒法用。

(1.2)ROCKETMQ_HOME的地址、利用nohup啓動broker是指定啓動的配置文件都要寫對

2、將rocketmq服務添加爲開機啓動服務

chmod +x /etc/init.d/rocketmq

chkconfig --add rocketmq

再運行chkconfig --list查看是否出現以下內容,出現則代表加入成功了

注:若出現下圖0-6都是關,那代表還不能開機自啓,再運行 chkconfig rocketmq on,然後再運行chkconfig --list以後2-5都是開以後纔行。

3、通過service命令來管理rocketmq

啓動:service rocketmq start
關閉:service rocketmq stop
重啓:service rocketmq restart

 

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