RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)
以下部署方式結合眾多博友的博客,經過自己一步一步實際搭建,如有雷同,侵權行為,請見諒。。。其中遇到不少的坑,希望能幫到更多的人,現在很少能找到一份完整版4.2.6版本的搭建教程了,如果你有幸遇見,那么我們必定前世有緣。進入正題……
首先,官方推薦有三種部署方式:
多Master模式(2m-noslave)
一個集群無Slave,全是Master,例如2個Master或者3個Master
優點:配置簡單,單個Master宕機或重啟維護對應用無影響,在磁盤配置為RAID10時,即使機器宕機不可恢復情況下,由于RAID10磁盤非常可靠,消息也不會丟(異步刷盤丟失少量消息,同步刷盤一條不丟)。性能最高。
缺點:單臺機器宕機期間,這臺機器上未被消費的消息在機器恢復之前不可訂閱,消息實時性會受到受到影響。
多Master多Slave模式,異步復制(2m-2s-async)
每個Master配置一個Slave,有多對Master-Slave,HA采用異步復制方式,主備有短暫消息延遲,毫秒級。
優點:即使磁盤損壞,消息丟失的非常少,且消息實時性不會受影響,因為Master宕機后,消費者仍然可以從Slave消費,此過程對應用透明。不需要人工干預。性能同多Master模式幾乎一樣。
缺點:Master宕機,磁盤損壞情況,會丟失少量消息。
多Master多Slave模式,同步雙寫(2m-noslave)
每個Master配置一個Slave,有多對Master-Slave,HA采用同步雙寫方式,主備都寫成功,向應用返回成功。
優點:數據與服務都無單點,Master宕機情況下,消息無延遲,服務可用性與數據可用性都非常高
缺點:性能比異步復制模式略低,大約低10%左右,發送單個消息的RT會略高。目前主宕機后,備機不能自動切換為主機,后續會支持自動切換功能。
注意:
1、上述“2”只是說作為一個集群的最低配置數量,可以根據實際情況擴展。
2、所有的刷盤(Dish?Flush)操作全部默認為:ASYNC_FLUSH(異步刷盤)。
核心概念:
| Disk?Flush(磁盤刷新/同步操作):就是將內存的數據落地,存儲在磁盤中。 RocketMQ提供了以下兩種模式: ? SYNC_FLUSH(同步刷盤):生產者發送的每一條消息都在保存到磁盤成功后才返回告訴生產者成功。這種方式不會存在消息丟失的問題,但是有很大的磁盤IO開銷,性能有一定影響。?? ? ? ? ? ? ? ? ? ASYNC_FLUSH(異步刷盤):生產者發送的每一條消息并不是立即保存到磁盤,而是暫時緩存起來,然后就返回生產者成功。隨后再異步的將緩存數據保存到磁盤,有兩種情況:1是定期將緩存中更新的數據進行刷盤,2是當緩存中更新的數據條數達到某一設定值后進行刷盤。這種方式會存在消息丟失(在還未來得及同步到磁盤的時候宕機),但是性能很好。默認是這種模式。
|
| 環境: JDK1.8? ? java?version?"1.8.0_171"? +虛擬機2臺(至少)+rocketmq-all-4.2.0-bin-release.zip ? |
1、單Master
| #?unzip?-o?rocketmq-all-4.2.0-bin-release.zip?-d?rocketmq1??(需要指定目錄) #?cd?/ulic/rocketmq1 #?nohup?sh?bin/mqnamesrv?&? ? ? ? ? ? ? #啟動namesrv #?tail?-f?~/logs/rocketmqlogs/namesrv.log? ? #?nohup?sh?bin/mqbroker?-n?10.18.3.21:9876?& #啟動broker #?tail?-f?~/logs/rocketmqlogs/broker.log #?jps? ? # 檢查是否成功啟動namesrv和broker 注意:啟動mqbroker時需要確保主機有足夠的內存,官方默認設置的-Xms8g?-Xmx8g?-Xmn4g都比較大; runBroker.sh中更改 JAVA_OPT="${JAVA_OPT}?-server?-Xms512m -Xmx512m -Xmn256m" runserver.sh中更改: JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" |
停止命令: (啟動先namesrv,再broker;停止先broker,再namesrv)
sh?bin/mqshutdown?broker
sh?bin/mqshutdown?namesrv
2、雙Master
| 序號 ip ? ? ? ? ?用戶名 ? ?密碼 角色 ???? ?模式 (1) 10.43.98.34 ??root ?? nameServer1,brokerServer1 ??Master1 (2) 10.43.98.38 ?root ? ?nameServer1,brokerServer1 ??Master2 |
?
1、Host添加信息
對兩臺機器都執行vi??/etc/hosts,將nameServer和broker部署在同一臺機器上的,也可以分開部署。 輸入如下圖所示的信息
| ? 重啟網卡:service?network?restart(可省略) ? 相互ping一下,在34機器上ping??10.43.98.38?? ? #?ping??rocketmq-nameserver2?? ? #?ping??rocketmq-master2 ? |
2、創建數據存儲路徑(兩臺機器都要創建)(為方便后面集群部署,最好設置,不設置也可以成功部署)
| 任意你想設置保存位置的目錄下來存儲產生的數據的,我是/rocketmq1目錄下 mkdir?store mkdir?store/commitlog mkdir store/consumerqueue mkdir store/index |
3、修改conf下RocketMQ的配置文件:(34機器)broker-a.properties? (38機器)broker-b.properties
| brokerClusterName=DefaultCluster | brokerClusterName=DefaultCluster namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 |
| 主要配置這些也可以,詳細可以自行根據需要補全,比如文件保存路徑配置等…… | ? |
詳細配置文件可參考:
| #所屬集群名字 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 #刪除文件時間點,默認凌晨 0點 deleteWhen=00 #文件保留時間,默認 48 小時 fileReservedTime=120 #commitLog每個文件的大小默認1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每個文件默認存30W條,根據業務情況調整 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #檢測物理文件磁盤空間 diskMaxUsedSpaceRatio=88 #存儲路徑 storePathRootDir=/opt/rocketmq/data #commitLog 存儲路徑 storePathCommitLog=/opt/rocketmq/data/commitlog #消費隊列存儲路徑存儲路徑 storePathConsumeQueue=/opt/rocketmq/data/consumequeue #消息索引存儲路徑 storePathIndex=/opt/rocketmq/data/index #checkpoint 文件存儲路徑 storeCheckpoint=/opt/rocketmq/data/checkpoint #abort 文件存儲路徑 abortFile=/opt/rocketmq/data/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 |
因為有兩個master主節點,所以主節點1啟動依賴broker-a.properties,主節點2啟動依賴broker-b.properties,如果是三個Master,那么還會有一個broker-c.properties,以此類推。brokerId=0表示是master,大于0則表示是slave;
另外BrokerName=broker-a要對應;在34機器上是broker-a,在第二臺機器38上則是broker-b。分別在34和38上修改broker-a.properties和broker-b.properties。
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876。這個要和之前配置的名稱相互對應。
3、修改日志配置文件(略,可參考)
修改日志配置文件
在創建的軟連接文件夾rocketmq下創建一個logs目錄?mkdir?/opt/rocketmq/logs
?
然后執行cd?/opt/rocketmq/conf?&&?sed?-i?'s#${user.home}#/opt/rocketmq#g'?*.xml進行日志文件的替換,sed是linux的替換命令。兩臺機器同樣操作。
4、修改啟動腳本參數(JVM參數的調優)
| 1)broker的調優 vi?/opt/rocketmq/bin/runbroker.sh JAVA_OPT="${JAVA_OPT}?-server?-Xms512m?-Xmx512m?-Xmn256m?-?XX:PermSize=128m?-XX:MaxPermSize=320m" 2)nameserver的調優 vi?/opt/rocketmq/bin/runserver.sh JAVA_OPT="${JAVA_OPT}?-server?-Xms512m?-Xmx512m?-Xmn256m?-?XX:PermSize=128m?-XX:MaxPermSize=320m" |
| 將nameServer和broker放在了同一臺機器上,所以需要分別對nameServer和broker進行jvm的性能調優。生產環境默認即可不要修改 |
啟動兩臺機器的NameServer:先啟動兩臺機器的NameServer,再啟動兩臺機器的Borker,關機的時候順序相反,先關閉兩臺機器的Broker,再關閉兩臺機器的Nameserver。
| #?cd?/opt/rocketmq/bin #?nohup?sh?mqnamesrv?& 上面這條命令nohup是起一個守護線程。 #?jps?查看進程 #?tail?-f?-n?500?/opt/rocketmq/logs/rocketmqlogs/broker.log #?tail?-f?-n?500?/opt/rocketmq/logs/rocketmqlogs/namesrv.log |
| mqadnin是管理員命令,mqfiltersrv是rocketmq的單獨組件,mqnamesrv是NameServer,mqbroker是Broker。 |
?啟動BrokerServer?A?10.43.98.34和BrokerServer?B?10.43.98.38
?
| 啟動BrokerServer?A?10.43.98.34 #?nohup?sh?mqbroker?-c?/opt/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 ? 啟動BrokerServer?B?10.43.98.38 nohup?sh?mqbroker?-c?/opt/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 ? |
成功啟動后,通過mqadmin命令或者rocketmq-console監控界面查看,是否部署成功。。。
3、雙Master+雙Slave-Async
實際可以準備4臺服務器,每臺上面部署1個;
參考:RocketMQ環境搭建(雙master雙slave模式)
因資源有限,同一臺機器部署兩個節點,broker-a的主節點與broker-b的從節點部署在一臺服務器,broker-a的從節點與broker-b的主節點部署在一臺服務器(交叉部署實現HA)。
注:同一臺機器部署兩個broker時,一定要注意,在配置文件中配置:
若原broker-a.properties中配置:
listenPort=10911??//默認
storePathRootDir=/opt/logs/rocketmqlogs/store?
storePathCommitLog=/opt/logs/rocketmqlogs/store?/commitlog?//日志存放目錄
則broker-b-s.properties中配置(不能有沖突)
listenPort=10915?//默認:10911?更改端口號,同一臺機器上兩個broker不可采用同一端口,且端口號間隔2個以上(經測試10913不可啟動)
storePathRootDir=/opt/logs/rocketmqlogs/store-b-s??
storePathCommitLog=/opt/logs/rocketmqlogs/store-b-s?/commitlog?//日志存放目錄
?
不然,會發現1臺機器只能啟動一個broker。。。。
主:192.168.151.131???從?192.168.151.132
1.?修改主從hosts文件
????vi?/etc/hosts??加入
????192.168.153.131??rocketmq.master
????192.168.153.132??rocketmq.slave
2.?修改mq配置文件采用異步復制??2m-2s-async
192.168.151.131?上的配置
(1)broker-a.properties(broker-a的master配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876????//所關聯的namesrv地址
brokerClusterName=FusionCluster?????//集群名稱
brokerName=broker-a?
brokerId=0?????????????????//0代表主
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER?????????????//角色
flushDiskType=ASYNC_FLUSH???????????//異步刷盤
storePathRootDir=/opt/logs/rocketmqlogs/store??
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog?//日志存放目錄
(2)broker-b-s.properties(broker-b的slave配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10913???//更改端口號,同一臺機器上兩個broker不可采用同一端口
storePathRootDir=/opt/logs/rocketmqlogs/store??
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog
192.168.151.132?上的配置
?1、修改hosts文件
????vi?/etc/hosts??加入
????192.168.153.131??rocketmq.master
????192.168.153.132??rocketmq.slave
?
(1)broker-b.properties(broker-b的master配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-b
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathRootDir=/opt/logs/rocketmqlogs/store??
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog?//日志存放目錄
(2)broker-a-s.properties(broker-a的slave配置)
namesrvAddr=rocketmq.master:9876;rocketmq.slave:9876
brokerClusterName=FusionCluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort=10915
storePathRootDir=/opt/logs/rocketmqlogs/store??
storePathCommitLog=/opt/logs/rocketmqlogs/store/commitlog
注意:?這里將broker-a和broker-b的主從分別放到不同的機器上啟動是為了保證當與一臺機器宕機時,另一臺可繼續工作。
?
3.啟動服務
?????????192.168.153.131
?????????sed?-i??'s#${user.home}#/opt#g'??*.xml???????//將conf目錄下所有xml文件中的${user.home}替換成/opt,進入rocketmq/conf目錄下執行該命令
?????????mqnamesrv?&??啟動nameservice
?????????mqbroker???-c???/opt/alibaba-rocketmq/conf/2m-2s-async/broker-a.properties?&???????????//啟動broker-a主
?????????mqbroker???-c???/opt/alibaba-rocketmq/conf/2m-2s-async/broker-b-s.properties?&??????//啟動broker-b從??
????????192.168.153.132
?????????sed?-i??'s#${user.home}#/opt#g'??*.xml???????//將conf目錄下所有xml文件中的${user.home}替換成/opt,進入rocketmq/conf目錄下執行該命令
?????????mqnamesrv?&??啟動nameservice
?????????mqbroker???-c???/opt/alibaba-rocketmq/conf/2m-2s-async/broker-b.properties?&???????????//啟動broker-b主
?????????mqbroker???-c???/opt/alibaba-rocketmq/conf/2m-2s-async/broker-a-s.properties?&???????//啟動broker-a從?
4.到此已經完成,可以發布rocketmq-console項目來查看mq的信息和配置。?
?????????創建一個topic到兩個broker上
??????????mqadmi??updateTopic?-c?FusionCluster??-b?192.168.153.131:10911???-t?testbroker
?????????mqadmi??updateTopic?-c?FusionCluster??-b?192.168.153.132:10911???-t?testbroker
?
轉載于:https://www.cnblogs.com/buyige/p/9454634.html
總結
以上是生活随笔為你收集整理的RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库事务的隔离机制
- 下一篇: 如果我是博客园的产品经理【上】