RocketMQ集群部署
RocketMQ是一款非常優秀的消息中間件,運用的場景也是非常豐富,且在各大公司運用中也非常廣泛。但是它是如何進行部署的呢,以及它的高可用是如何實現的呢。那么就由我來為大家講解一哈RocketMQ是如何進行部署的。本篇文章中沒有對mq中各個角色進行講解,本文也默認大家對mq的各個角色已經有了一定的認識。博主在未來一周中會對mq的基礎部分以及如何使用進行詳解。
一、環境准備
虛擬機、JDK、RocketMQ環境包,
二、JDK、RocketMQ相關包准備
| 版本 | 名稱 | 官方下載地址 | |
| JDK | 1.8 | jdk-8u321-linux-x64.tar.gz |
JDK官方下載地址 |
| RocketMQ | 4.5.2 | rocketmq-all-4.5.2-bin-release.zip |
|
| rocketmq-dashboard | latest release | rocketmq-dashboard-master.zip | rocketMQ控制台下載地址 |
三、部署到Linxu系統並解壓
上傳文件可以使用XShell。
1、如果沒有lrzsz工具,可以安裝,否則:跳過這一步。命令:yum install lrzsz
2、上傳:rz + 上傳的文件
3、上傳完所有的文件,進行解壓。
4、jdk解壓:tar -zxvf jdk-8u321-linux-x64.tar.gz -C /opt/jdk
5、rocketMQ解壓:unzip -d /opt/rocketMQ rocketmq-all-4.5.2-bin-release.zip
6、rocketmq-dashboard在windows10解壓。並修改一些配置,打包就可以使用了。具體的在本文最后一個目錄有講解。
7、配置JDK環境變量:(大家可能有疑惑為啥會配置JDK環境變量,原因:rocketMQ是JAVA語言開發出來的,所有要運行rocketMQ就必須安裝JDK的環境。)
1、編輯/etc/profile文件 命令:vim /etc/profile 2、配置環境變量: export JAVA_HOME=/opt/soft/jdk1.8.0_261 export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 3、重新加載配置:source /etc/profile
4、查看是否配置成功。java -version
效果:
9、rocketMQ高可用有很多種方式,比如:單機部署,多主集群,雙主雙從同步部署,雙主雙從異步部署,以及多主多從部署。部署集群可按照自己公司的實際情況進行部署。
單機部署:只啟動一個rocketMQ實例就可以了,一般常用來本機測試使用。原因:一旦rocketMQ因某些原因掛掉,導致mq無法使用,則我們服務器無法接受信息與消費信息等。
多主集群:只部署mq主節點,無部署從節點。優點:配置簡單,單個Master宕機或重啟維護對應用無影響,即使機器宕機不可恢復情況下,也有其他主節點進行寫入操作,
消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟),性能最高;
雙主雙從同步:部署四個節點,每個主節點都有一個從節點,主與從節點的信息通過同步的方式進行保存。優點:消息不會丟失,即:主節點掛了后,從節點的消息也不會造成丟失,只不過沒法接受新消息,只能消費,但是能保證我消費的消息一定是准確的。缺點:客戶端接受服務器響應時間長。可用於消息安全高的場景。
雙主雙從異步:與雙主雙從一致,只不過在主從數據傳輸是通過異步的方式,優點:客戶端能快速的接收到服務器的消息,缺點:主節點掛的情況,從節點會丟失一部分消息。可用於允許消息丟失,吞吐量高的情景。
四、雙主雙從同步部署集群
1、啟動虛擬機,至少准備兩個ip,也可准備四個。
| ip | broker名稱 | 說明 |
| 192.168.0.129 | broker-a | a主節點 |
| 192.168.0.129 | broker-b-s | b從節點 |
| 192.168.0.130 | broker-b | b主節點 |
| 192.168.0.130 | borker-a-s | a從節點 |
2、修改mq的配置。 runserver.sh與runbroker.sh
原因:我啟動的虛擬機的內存設置的是3G,而mq默認的JVM最小的堆內容是8G,太大了,不修改將無法啟動。
修改命令:vim /mq目錄/bin/runserver.sh,或vim /mq目錄/bin/runbroker.sh ,大家可以根據虛擬機大小自行修改。如果想了解更多的這個可以了解JVM相關的知識。
1 1、runserver.sh 2 JAVA_OPT="${JAVA_OPT} -server -Xms520m -Xmx1g -Xmn128m -XX:metaspaceSize=120m -XX:MaxMetaspaceSize=320m" 3 2、runnbroker.sh 4 JAVA_OPT="${JAVA_OPT} -server -Xms520m -Xmx1G -Xmn128m"
3、修改conf目錄中2m-2s-sync目錄中的配置文件
broker-a.properties # 所屬集群名字 brokerClusterName=myRocketmqCluster # broker名字,注意此處不同的配置文件填寫的不一樣(按配置文件文件名來匹配) brokerName=broker-a # 0 表示Master, > 0 表示slave brokerId=0 # 注冊中心,可使用集群模式 namesrvAddr=192.168.0.129:9876;192.168.0.130:9876 # 在發送消息時,自動創建服務器不存在的Topic,默認創建的隊列數 defaultTopicQueueNums=4 # 是否允許Broker 自動創建Topic,建議線下開啟,線上關閉 autoCreateTopicEnable=true # 是否允許Broker自動創建訂閱組,建議線下開啟,線上關閉 autoCreateSubscriptionGroup=true # Broker 對外服務的監聽端口 listenPort=10933 # 刪除文件時間點,默認是凌晨4點 deleteWhen=04 # 文件保留時間,默認48小時 fileReservedTime=120 # commitLog每個文件的大小默認1G # 附加:消息實際存儲位置,和ConsumeQueue是mq的核心存儲概念,之前搭建2m環境的時候創建在store下面,
用於數據存儲,consumequeue是一個邏輯的概念,消息過來之后,consumequeue並不是把消息所有保存起來,
而是記錄一個數據的位置,記錄好之后再把消息存到commitlog文件里 mapedFileSizeCommitLog=1073741824 # ConsumeQueue每個文件默認存30W條,根據業務情況調整 mapedFileSizeConsumeQueue=300000 destroyMapedFileIntervalForcibly=120000 redeleteHangedFileInterval=120000 # 檢測物理文件磁盤空間 diskMaxUsedSpaceRatio=88 # 存儲路徑 storePathRootDir=/opt/rocketmq/store # commitLog存儲路徑 storePathCommitLog=/opt/rocketmq/commitlog # 消費隊列存儲路徑 storePathConsumeQueue=/opt/rocketmq/consumequeue # 消息索引存儲路徑 storePathIndex=/opt/rocketmq/index # checkpoint 文件存儲路徑 storeCheckpoint=/opt/rocketmq/checkpoint # abort 文件存儲路徑 abortFile=/opt/rocketm/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-s.properties
# 所屬集群名字 brokerClusterName=myRocketmqCluster # broker名字,注意此處不同的配置文件填寫的不一樣(按配置文件文件名來匹配) brokerName=broker-a # 0 表示Master, > 0 表示slave brokerId=1 # 注冊中心,可使用集群模式 namesrvAddr=192.168.0.129:9876;192.168.0.130:9876 # 在發送消息時,自動創建服務器不存在的Topic,默認創建的隊列數 defaultTopicQueueNums=4 # 是否允許Broker 自動創建Topic,建議線下開啟,線上關閉 autoCreateTopicEnable=true # 是否允許Broker自動創建訂閱組,建議線下開啟,線上關閉 autoCreateSubscriptionGroup=true # Broker 對外服務的監聽端口 listenPort=10900 # 刪除文件時間點,默認是凌晨4點 deleteWhen=04 # 文件保留時間,默認48小時 fileReservedTime=120 # commitLog每個文件的大小默認1G # 附加:消息實際存儲位置,和ConsumeQueue是mq的核心存儲概念,之前搭建2m環境的時候創建在store下面,用於數據存儲,
consumequeue是一個邏輯的概念,消息過來之后,consumequeue並不是把消息所有保存起來,而是記錄一個數據的位置,
記錄好之后再把消息存到commitlog文件里 mapedFileSizeCommitLog=1073741824 # ConsumeQueue每個文件默認存30W條,根據業務情況調整 mapedFileSizeConsumeQueue=300000 destroyMapedFileIntervalForcibly=120000 redeleteHangedFileInterval=120000 # 檢測物理文件磁盤空間 diskMaxUsedSpaceRatio=88 # 存儲路徑 storePathRootDir=/opt/rocketmq/slave/store # commitLog存儲路徑 storePathCommitLog=/opt/rocketmq/slave/commitlog # 消費隊列存儲路徑 storePathConsumeQueue=/opt/rocketmq/slave/consumequeue # 消息索引存儲路徑 storePathIndex=/opt/rocketmq/slave/index # checkpoint 文件存儲路徑 storeCheckpoint=/opt/rocketmq/slave/checkpoint # abort 文件存儲路徑 abortFile=/opt/rocketm/slave/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
這里面的核心:
brokerClusterName:只要是同一個集群里面的節點,都必須是這一個名稱,可以自定義
brokerName:broker的名稱,同一個broker的主從節點名稱保持一致。
brokerId:broker的id標識。0:主節點,大於0都是從節點
namesrvAddr:nameSrv的注冊中心地址,可以是集群模式,多個ip之間使用英文的;分隔
listenPort:監聽端口,同一個ip地址下,端口不能保持一致,需修改
brokerRole:broker的角色,ASYNC_MASTER 異步復制Master,SYNC_MASTER 同步雙寫Master,SLAVE從節點專用。
flushDiskType:數據刷盤方式。ASYNC_FLUSH 異步刷盤,SYNC_FLUSH 同步刷盤
storePathRootDir=/opt/rocketmq/store 存儲路徑
storePathCommitLog=/opt/rocketmq/commitlog commitLog存儲路徑
storePathConsumeQueue=/opt/rocketmq/consumequeue 消費隊列存儲路徑
storePathIndex=/opt/rocketmq/index消息索引存儲路徑
storeCheckpoint=/opt/rocketmq/checkpoint checkpoint 文件存儲路徑
abortFile=/opt/rocketm/abort abort 文件存儲路徑
4、192.168.0.130虛擬機重復上面的步驟即可。
5、兩台虛擬機都已經部署完成了,開始對mq集群進行啟動吧。先進入mq中bin目錄中,如果配置了MQ的環境變量,就沒必要進入bin目錄中
1、先啟動兩台機子上的nameServer。nohup sh mqnamesrv &
2、在啟動mq中129機子上的broker的節點。
集群中a主節點:nohup sh mqbroker -c /opt/soft/rocketmq/rocketmq-all-4.5.2-bin-release/conf/2m-2s-sync/broker-a.properties &
集群中b從節點:nohup sh mqbroker -c /opt/soft/rocketmq/rocketmq-all-4.5.2-bin-release/conf/2m-2s-sync/broker-b-s.properties &
3、啟動的效果:
4、對130機子重復操作即可。
6、到這里,集群我們就部署完成了,但是在這里我們肯定有疑問我們怎么看到他就是部署成功了。要不我們寫一段代碼來進行測試。不要急,官方雖然提供了例子來操作,但是我們只能看到一堆的控制台數據呈現,不太好看。所以官方就提供了一個用於b端的頁面的控制台。那我們就來對其進行配置部署吧。
五、rocketmq-dashboard 控制台部署
1、將下載好的壓縮包解壓到本地中,對resource目錄中的application.yml的配置進行修改,目前我們只對nameServer的配置修改一哈,其他的配置我們先不動,注重看我加粗的地方。
rocketmq:
config:
# Linux系統中啟動的nameServerd地址與端口
namesrvAddrs:
- 192.168.0.130:9876
- 192.168.0.129:9876
2、打包成jar包並上傳到Linux系統中。打包的時間比較久,耐心等待。
打包注意事項:必須在src同級目錄下使用這個命令(也就是可以看到pom.xml的目錄)。mvn clean package -Dmaven.test.skip=true
如果看到這個就說明打包成功了。那就使用rz上傳到Linux系統中。

3、啟動dashborad。
nohup java -jar /opt/soft/rocketmq-dashboard-1.0.1-SNAPSHOT.jar &
查看 cat nohup.out ,看到這個就說明成功了。

4、關閉防火牆或開放端口號。
方式一:建議新手使用 1、關閉防火牆。 systemctl stop firewalld 方式二:生產環境使用 1、開放指定的端口號:firewall-cmd --zone=public --add-port=8080/tcp --permanent 2、重啟防火牆:firewall-cmd --reload 注意:使用方式二,就需要將nameServer 與 broker 的端口也需要開放出來。使用了那個端口就必須開放出來,否則會被防火牆給阻擋。
5、效果,如果集群中把我們部署的都顯示出來了,說明我們部署的沒問題,放心的使用吧。


6、鑒權登錄。
既然有b端可視化頁面,那肯定也有我們登錄驗證撒,不然任何人知道我們的ip與端口都能看到了。官方是不可能這個玩的。那我們下面就來配置一哈登錄校驗。
1、還是對resource下的application.yml文件進行編輯。
rocketmq:
config:
loginRequired: true
2、對resource下的user.properties修改 這個配置文件是專門來登錄賬號的
用戶名 密碼 角色:1:管理員 0:普通用戶
admin=123456,1
2、修改完了,重新打包上傳運行即可。
3、效果

