RocketMQ系列:docker搭建rocketmq的dledger模式集群(全網獨家)


接上文:docker-compose搭建rocketmq集群環境

本文介紹如何使用play-docker-dledger.sh搭建rocketmq的集群環境

 

1 清理環境

這里需要刪除剛才docker-compose創建的docker的bridge網絡,否則會報錯:Error response from daemon: Pool overlaps with other one on this address spa

1.1 查看docker網絡

docker network ls

1.2 刪除網絡

docker network rm docker-compose_default

2 啟動rocketmq的dledger集群

#進入對應目錄
cd rocketmq-docker/stages/4.7.1/template

#執行play-docker-dledger.sh(如果build的rocketmq是centos,則直接執行成功;否則需要先docker tag一下,參考docker-compose搭建篇)
sh play-docker-dledger.sh

2.1 查看是否啟動

執行:docker ps -a

如圖,broker都退出了

 看下日志報錯:docker logs b0a03fa0b4cf

 

報錯:啟動broker找不到對應的配置文件broker.conf,我們看下play-docker-dledger.sh腳本。

 2.2 查看play-docker-dledger.sh

# Create network
# 這里是創建一個docker的bridge網絡,用於nameserver和broker直接通信 docker network create
--subnet=172.18.0.0/16 dledger-br # Start nameserver
# 啟動nameserver,這里--net指定了bridge網絡 docker run
--net dledger-br --ip 172.18.0.11 -d -p 9876:9876 -v `pwd`/data/namesrv/logs:/home/rocketmq/logs --name rmqnamesrv apacherocketmq/rocketmq:4.7.1 sh mqnamesrv # Start Brokers
# 這里也同樣是使用bridge網絡連namserver docker run
--net dledger-br --ip 172.18.0.12 -d -p 30911:30911 -p 30909:30909 -v `pwd`/data/broker0/logs:/home/rocketmq/logs -v `pwd`/data/broker0/store:/home/rocketmq/store -v `pwd`/data/broker0/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker -c ../conf/dledger/broker.conf docker run --net dledger-br --ip 172.18.0.13 -d -p 30921:30921 -p 30919:30919 -v `pwd`/data/broker1/logs:/home/rocketmq/logs -v `pwd`/data/broker1/store:/home/rocketmq/store -v `pwd`/data/broker1/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker1 --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker -c ../conf/dledger/broker.conf docker run --net dledger-br --ip 172.18.0.14 -d -p 30931:30931 -p 30929:30929 -v `pwd`/data/broker2/logs:/home/rocketmq/logs -v `pwd`/data/broker2/store:/home/rocketmq/store -v `pwd`/data/broker2/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker2 --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker -c ../conf/dledger/broker.conf

2.3 修改腳本

問題應該是出在啟動命令這里:

sh mqbroker -c ../conf/dledger/broker.conf

這里應該寫成絕對路徑(看來原腳本是有bug的):

sh mqbroker -c /opt/rocketmq-4.7.1/conf/dledger/broker.conf

腳本內容改成如下:

docker run --net dledger-br --ip 172.18.0.12 -d -p 30911:30911 -p 30909:30909 -v `pwd`/data/broker0/logs:/home/rocketmq/logs -v `pwd`/data/broker0/store:/home/rocketmq/store -v `pwd`/data/broker0/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf
docker run --net dledger-br --ip 172.18.0.13 -d -p 30921:30921 -p 30919:30919 -v `pwd`/data/broker1/logs:/home/rocketmq/logs -v `pwd`/data/broker1/store:/home/rocketmq/store -v `pwd`/data/broker1/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker1 --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf
docker run --net dledger-br --ip 172.18.0.14 -d -p 30931:30931 -p 30929:30929 -v `pwd`/data/broker2/logs:/home/rocketmq/logs -v `pwd`/data/broker2/store:/home/rocketmq/store -v `pwd`/data/broker2/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker2 --link rmqnamesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf

2.4 重新運行play-docker-dledger.sh

#進入對應目錄
cd rocketmq-docker/stages/4.7.1/template

#執行play-docker-dledger.sh(如果build的rocketmq是centos,則直接執行成功;否則需要先docker tag一下,參考docker-compose搭建篇)
sh play-docker-dledger.sh

輸入docker ps -a,查看是否啟動

2.5 查看集群信息

docker exec -it rmqbroker1 ./mqadmin clusterList -n {宿主機ip}:9876 

 

看到如圖所示內容說明dledger模式的rocketmq單集群OK了。我們可以通過上圖中的mqadmin對rocketmq的集群進行相關操作,但是在實際的使用場景里,服務A如果想要使用rocketmq,首先訪問的是rocketmq的namserver,但nameserver,broker的實際ip均處於docker的bridge網絡中(腳本中的dledger-br),其ip地址如上圖的172.18.0.x,外部機器是無法與這個網段進行直接通信(網絡隔離)。那么該如何解決這個問題呢?

我們可以使用docker的host網絡共享宿主機的網絡,這有就可以直接訪問,所以還要在play-docker-dledger.sh中改造下腳本。

3. 改造腳本和配置

這里需要改造兩個部分,一個是play-docker-dledger.sh,另外是三個broker對應的broker.conf的內容。

3.1 修改play-docker-dledger.sh

假設我的本機的ip為10.10.10.15

3.1.1  nameserver

修改腳本:

  • 修改--net dledger-br為--net host
  • 刪除指定ip選項:--ip xxx

play-docker-dledger.sh:

#這里使用host模式
docker run --net host  -d -p 9876:9876 -v `pwd`/data//logs:/home/rocketmq/logs --name rmqnamesrv  dockerhub.qingcloud.com/apacherocketmq/rocketmq:4.7.1 sh mqnamesrv 

3.1.2 broker

修改腳本

  • 修改--net dledger-br為--net host

  • 刪除--link rmqnamesrv:namesrv

  • 修改NAMESRV_ADDR=namesrv:9876為本機網卡IP:NAMESRV_ADDR=10.10.10.15:9876

  • 刪除指定ip選項:--ip xxx

修改broker.conf

     rocketmq-docker/stages/4.7.1/template下

  • data/broker0/conf/dledger/broker.conf

  • data/broker1/conf/dledger/broker.conf
  • data/broker2/conf/dledger/broker.conf

修改play-docker-dledger.sh:

docker run --net host -d -p 30911:30911 -p 30909:30909 -v `pwd`/data/broker0/logs:/home/rocketmq/logs -v `pwd`/data/broker0/store:/home/rocketmq/store -v `pwd`/data/broker0/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker   -e "NAMESRV_ADDR=10.10.10.15:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf
docker run --net host -d -p 30921:30921 -p 30919:30919 -v `pwd`/data/broker1/logs:/home/rocketmq/logs -v `pwd`/data/broker1/store:/home/rocketmq/store -v `pwd`/data/broker1/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker1  -e "NAMESRV_ADDR=10.10.10.15:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf
docker run --net host -d -p 30931:30931 -p 30929:30929 -v `pwd`/data/broker2/logs:/home/rocketmq/logs -v `pwd`/data/broker2/store:/home/rocketmq/store -v `pwd`/data/broker2/conf/dledger:/opt/rocketmq-4.7.1/conf/dledger --name rmqbroker2  -e "NAMESRV_ADDR=10.10.10.15:9876" apacherocketmq/rocketmq:4.7.1 sh mqbroker  -c   /opt/rocketmq-4.7.1/conf/dledger/broker.conf

修改data/broker0/conf/dledger/broker.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
brokerIP1=10.10.10.15
brokerIP2=10.10.10.15
listenPort=40911
namesrvAddr=10.10.10.15:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-10.10.10.15:30911;n1-10.10.10.15:30912;n2-10.10.10.15:30913
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16

修改data/broker1/conf/dledger/broker.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
brokerIP1=10.10.10.15
brokerIP2=10.10.10.15
listenPort=40921
namesrvAddr=10.10.10.15:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-10.10.10.15:30911;n1-10.10.10.15:30912;n2-10.10.10.15:30913
## must be unique
dLegerSelfId=n1
sendMessageThreadPoolNums=16

修改data/broker2/conf/dledger/broker.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
brokerIP1=10.10.10.15
brokerIP2=10.10.10.15
listenPort=40931
namesrvAddr=10.10.10.15:9876
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-10.10.10.15:30911;n1-10.10.10.15:30912;n2-10.10.10.15:30913
## must be unique
dLegerSelfId=n2
sendMessageThreadPoolNums=16 

3.2 重新運行play-docker-dledger.sh

#進入對應目錄
cd rocketmq-docker/stages/4.7.1/template #執行play-docker-dledger.sh(如果build的rocketmq是centos,則直接執行成功;否則需要先docker tag一下,參考docker-compose搭建篇) sh play-docker-dledger.sh

docker exec -it rmqbroker1 ./mqadmin clusterList -n {宿主機ip}:9876 

 

下一節我們在遠程機器上使用producer和consumer分別對本集群進行壓測實驗。

 

博主:測試生財(一個不為996而996的測開碼農)

座右銘:專注測試開發與自動化運維,努力讀書思考寫作,為內卷的人生奠定財務自由。

內容范疇:技術提升,職場雜談,事業發展,閱讀寫作,投資理財,健康人生。

csdn:https://blog.csdn.net/ccgshigao

博客園:https://www.cnblogs.com/qa-freeroad/

51cto:https://blog.51cto.com/14900374

微信公眾號:測試生財(定期分享獨家內容和資源)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM