接上文: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
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
微信公眾號:測試生財(定期分享獨家內容和資源)