docker進(jìn)行RocketMq集群部署方式
環(huán)境
- (1)Centos7
- (2)JDK1.8
- (3)docker
- (4)rocketmq 4.8
兩臺(tái)服務(wù)器ip
- A:192.168.5.49
- B:192.168.5.50
集群模式
1、單節(jié)點(diǎn) :
- 優(yōu)點(diǎn):本地開發(fā)測(cè)試,配置簡(jiǎn)單,同步刷盤消息一條都不會(huì)丟
- 缺點(diǎn):不可靠,如果宕機(jī),會(huì)導(dǎo)致服務(wù)不可用
2、主從(異步、同步雙寫) :
- 優(yōu)點(diǎn):同步雙寫消息不丟失, 異步復(fù)制存在少量丟失 ,主節(jié)點(diǎn)宕機(jī),從節(jié)點(diǎn)可以對(duì)外提供消息的消費(fèi),但是不支持寫入
- 缺點(diǎn):主備有短暫消息延遲,毫秒級(jí),目前不支持自動(dòng)切換,需要腳本或者其他程序進(jìn)行檢測(cè)然后進(jìn)行停止broker,重啟讓從節(jié)點(diǎn)成為主節(jié)點(diǎn)
3、雙主:
- 優(yōu)點(diǎn):配置簡(jiǎn)單, 可以靠配置RAID磁盤陣列保證消息可靠,異步刷盤丟失少量消息
- 缺點(diǎn): master機(jī)器宕機(jī)期間,未被消費(fèi)的消息在機(jī)器恢復(fù)之前不可消費(fèi),實(shí)時(shí)性會(huì)受到影響
4、雙主雙從,多主多從模式(異步復(fù)制)我們這里采用這種
- 優(yōu)點(diǎn):磁盤損壞,消息丟失的非常少,消息實(shí)時(shí)性不會(huì)受影響,Master 宕機(jī)后,消費(fèi)者仍然可以從Slave消費(fèi)
- 缺點(diǎn):主備有短暫消息延遲,毫秒級(jí),如果Master宕機(jī),磁盤損壞情況,會(huì)丟失少量消息
5、雙主雙從,多主多從模式(同步雙寫)
- 優(yōu)點(diǎn):同步雙寫方式,主備都寫成功,向應(yīng)用才返回成功,服務(wù)可用性與數(shù)據(jù)可用性都非常高
- 缺點(diǎn):性能比異步復(fù)制模式略低,主宕機(jī)后,備機(jī)不能自動(dòng)切換為主機(jī)
概念
rocketmq分為Name Server和Broker Server
名字服務(wù)(Name Server)
名稱服務(wù)充當(dāng)路由消息的提供者。
生產(chǎn)者或消費(fèi)者能夠通過(guò)名字服務(wù)查找各主題相應(yīng)的Broker IP列表。
多個(gè)Namesrv實(shí)例組成集群,但相互獨(dú)立,沒有信息交換。
是Topic路由注冊(cè)中心,端口默認(rèn)為9876
代理服務(wù)器(Broker Server)
消息中轉(zhuǎn)角色,負(fù)責(zé)存儲(chǔ)消息、轉(zhuǎn)發(fā)消息。
代理服務(wù)器在RocketMQ系統(tǒng)中負(fù)責(zé)接收從生產(chǎn)者發(fā)送來(lái)的消息并存儲(chǔ)、同時(shí)為消費(fèi)者的拉取請(qǐng)求作準(zhǔn)備。
代理服務(wù)器也存儲(chǔ)消息相關(guān)的元數(shù)據(jù),包括消費(fèi)者組、消費(fèi)進(jìn)度偏移和主題和隊(duì)列消息等。
端口有三個(gè):
- listenPort:默認(rèn)10911,接受客戶端連接的監(jiān)聽端口,作為對(duì)producer和consumer使用服務(wù)的端口號(hào),可以通過(guò)配置文件改
- haListenPort:默認(rèn)為listenPort + 1,高可用服務(wù)監(jiān)聽端口,主要用于slave同master同步
- fastListenPort:默認(rèn)為listenPort -2, 主要是fastRemotingServer服務(wù)使用,用于VIP通道
部署
1、安裝rmqnamesrv
兩臺(tái)的rmqnamesrv都直接運(yùn)行即可,所有配置都用默認(rèn)的即可
docker run -d --name rmqnamesrv \ -v /home/docker/rocketmq/data/namesrv/logs:/home/rocketmq/logs \ -p 9876:9876 \ --restart=always \ apacherocketmq/rocketmq:4.8.0-alpine sh mqnamesrv
2、安裝rmqbroker
docker run -d --name rmqbroker \ -v /home/docker/rocketmq/data/broker/logs:/home/rocketmq/logs \ --link rmqnamesrv:namesrv \ --restart=always \ -e "NAMESRV_ADDR=namesrv:9876" \ -p 10909:10909 -p 10911:10911 -p 10912:10912 \ apacherocketmq/rocketmq:4.8.0-alpine \ sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
拷貝rmqbroker的配置文件到主機(jī)目錄
docker cp rmqbroker:/home/rocketmq/rocketmq-4.8.0/conf /home/docker/rocketmq/data/broker/conf
編輯配置文件broker.conf
#切換到剛剛拷貝出來(lái)的文件夾下 cd /home/docker/rocketmq/data/broker/conf #編輯主節(jié)點(diǎn)配置文件 sudo vi broker.conf #編輯從節(jié)點(diǎn)配置文件 sudo vi broker-s.conf
主節(jié)點(diǎn)broker.conf內(nèi)容如下:
# 集群名稱,取同一個(gè) brokerClusterName = docker-mq-cluster # 節(jié)點(diǎn)名稱,每個(gè)主節(jié)點(diǎn)取不一樣的,另一個(gè)主節(jié)點(diǎn)我們?nèi)roker-b,如果是主從節(jié)點(diǎn)名稱保持一致 brokerName = broker-a #brokerName = broker-b # 主從標(biāo)識(shí),0為主,其他大于0的為從,從只允許讀,主可以讀寫 brokerId = 0 #未消費(fèi)的持久化消息清理時(shí)間點(diǎn),默認(rèn)凌晨4點(diǎn) deleteWhen = 04 #持久化消息保存周期(單位:小時(shí)) fileReservedTime = 48 #brocker角色,異步主 #- ASYNC_MASTER 異步復(fù)制Master #- SYNC_MASTER 同步雙寫Master #- SLAVE brokerRole = ASYNC_MASTER #刷盤方式:異步刷盤 flushDiskType = ASYNC_FLUSH #節(jié)點(diǎn)IP brokerIP1 = 192.168.5.49 #brokerIP1 = 192.168.5.50 #broker的服務(wù)端口 listenPort=10911 #server服務(wù)器地址和端口,多個(gè)用分號(hào)隔開 namesrvAddr=192.168.5.49:9876;192.168.5.50:9876 #延遲消息等級(jí)時(shí)間, #這個(gè)設(shè)置也影響全局的消費(fèi)重試機(jī)制的間隔時(shí)間,消費(fèi)重試機(jī)制走的就是延遲消息,這里設(shè)置后,第一次重試是在是失敗的10s后(從第三個(gè)開始 ,DefaultMQPushConsumerImpl源碼中setDelayTimeLevel(3 + msg.getReconsumeTimes()),舍去了前兩個(gè)),第二次是上次失敗的30s后,因?yàn)橄M(fèi)重試次數(shù)是16次(DefaultMQPushConsumerImpl源碼默認(rèn)是16次),而我們30s后面沒有設(shè)置了,他后面的13次都會(huì)按30s間隔去重試 messageDelayLevel = 1s 5s 10s 30s
從節(jié)點(diǎn)broker-s.conf內(nèi)容如下:
# 集群名稱,取同一個(gè) brokerClusterName = docker-mq-cluster # 節(jié)點(diǎn)名稱,每個(gè)主節(jié)點(diǎn)取不一樣的,另一個(gè)主節(jié)點(diǎn)我們?nèi)roker-b,如果是主從節(jié)點(diǎn)名稱保持一致 brokerName = broker-a #brokerName = broker-b # 主從標(biāo)識(shí),0為主,其他大于0的為從,從只允許讀,主可以讀寫 brokerId = 1 #未消費(fèi)的持久化消息清理時(shí)間點(diǎn),默認(rèn)凌晨4點(diǎn) deleteWhen = 04 #持久化消息保存周期(單位:小時(shí)) fileReservedTime = 48 #brocker角色,從 #- ASYNC_MASTER 異步復(fù)制Master #- SYNC_MASTER 同步雙寫Master #- SLAVE brokerRole = SLAVE #刷盤方式:異步刷盤 flushDiskType = ASYNC_FLUSH #節(jié)點(diǎn)IP brokerIP1 = 192.168.5.49 #brokerIP1 = 192.168.5.50 #broker的服務(wù)端口,和主節(jié)點(diǎn)區(qū)分開 listenPort=11911 #server服務(wù)器地址和端口,多個(gè)用分號(hào)隔開 namesrvAddr=192.168.5.49:9876;192.168.5.50:9876 #延遲消息等級(jí)時(shí)間 messageDelayLevel = 1s 5s 10s 30s
刪除rmqbroker原容器
#t停止容器 docker stop rmqbroker #刪除容器 docker rm rmqbroker
重啟啟動(dòng)rmqbroker
啟動(dòng)主節(jié)點(diǎn)
docker run -d --name rmqbroker \ -v /home/docker/rocketmq/data/broker/logs:/home/rocketmq/logs \ -v /home/docker/rocketmq/data/broker/conf/broker.conf:/home/rocketmq/rocketmq-4.8.0/conf/broker.conf \ --restart=always \ -p 10909:10909 -p 10911:10911 -p 10912:10912 \ apacherocketmq/rocketmq:4.8.0-alpine \ sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
啟動(dòng)從節(jié)點(diǎn)
注意我們的啟動(dòng)命令,-p后面的端口是和主節(jié)點(diǎn)不一樣的,
從節(jié)點(diǎn)和主節(jié)點(diǎn)區(qū)分開,我們就直接用11909、11911、11912
docker run -d --name rmqbroker-s \ -v /home/docker/rocketmq/data/broker-s/logs:/home/rocketmq/logs \ -v /home/docker/rocketmq/data/broker/conf/broker-s.conf:/home/rocketmq/rocketmq-4.8.0/conf/broker.conf \ --restart=always \ -p 11909:11909 -p 11911:11911 -p 11912:11912 \ apacherocketmq/rocketmq:4.8.0-alpine \ sh mqbroker -c /home/rocketmq/rocketmq-4.8.0/conf/broker.conf
3、啟動(dòng)可視化頁(yè)面rocketmq-console-ng
在一臺(tái)服務(wù)器安裝可視化頁(yè)面即可
docker run -d -p 8080:8080 --name rocketmq-console-ng \ -v /home/docker/rocketmq/tmp:/tmp \ --restart=always \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.5.49:9876;192.168.5.50:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" \ styletang/rocketmq-console-ng
結(jié)果驗(yàn)證
查看服務(wù)端和客戶端日志無(wú)報(bào)錯(cuò),查看可視化界面
http://192.168.5.49:8080
成功檢測(cè)到兩個(gè)服務(wù)端,集群狀態(tài)也正常
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
dockerfile指令構(gòu)建docker鏡像的示例代碼
本文主要介紹了dockerfile指令構(gòu)建docker鏡像的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04教你如何從正在運(yùn)行的容器創(chuàng)建?Docker?映像
這篇文章主要介紹了如何從正在運(yùn)行的容器創(chuàng)建?Docker?映像,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02使用Docker快速搭建Airflow+MySQL詳細(xì)步驟
本文詳細(xì)介紹了如何使用Docker和Docker Compose安裝并配置Apache Airflow 2.9.3,步驟包括創(chuàng)建項(xiàng)目目錄、編寫docker-compose.yml文件、創(chuàng)建所需目錄結(jié)構(gòu)、啟動(dòng)和管理Docker容器,以及如何訪問(wèn)和配置Airflow Web UI,感興趣的朋友跟隨小編一起看看吧2024-09-09Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法
這篇文章主要介紹了Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法,需要的朋友可以參考下2017-06-06docker映射端口穿透內(nèi)置防火墻的實(shí)現(xiàn)
在使用Docker部署項(xiàng)目時(shí),即使未開啟CentOS7的Firewalld防火墻,端口仍可被外網(wǎng)訪問(wèn),這是因?yàn)镈ocker在安裝后會(huì)接管iptables,并自動(dòng)添加規(guī)則以放行指定端口,解決方法包括依賴外置防火墻放行端口、指定端口監(jiān)聽地址為本機(jī)、禁用Docker的iptables規(guī)則修改2024-10-10mac通過(guò)docker一鍵部署Nexus3的過(guò)程記錄
編寫一些簡(jiǎn)易的 shell 腳本幫我們快速的搭建服務(wù)器,猿們只要按著套路“一步一步”的操作,基本上都可以快速部署服務(wù),這篇文章主要介紹了mac通過(guò)docker一鍵部署Nexus3及安裝步驟,需要的朋友可以參考下2022-10-10docker run起來(lái)之后執(zhí)行多條命令
docker run :創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令。這篇文章主要介紹了docker run起來(lái)之后執(zhí)行多條命令 ,需要的朋友可以參考下2017-11-11Docker部署Spring-boot項(xiàng)目的示例代碼
這篇文章主要介紹了Docker部署Spring-boot的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12