1. 程式人生 > 其它 >docker-compose 部署rocketmq cluster

docker-compose 部署rocketmq cluster

docker-compose 部署rocketmq cluster

製作rocketmq映象

1、下載

直接克隆官方映象製作檔案

# git clone https://github.com/apache/rocketmq-docker.git

[root@localhost rocketmq-docker-master]# ls
CONTRIBUTING.md image-build LICENSE NOTICE product README.md stages stage.sh templates

[root@localhost rocketmq-docker-master]# cd image-build/
[root@localhost image-build]# ls
build-image-dashboard.sh build-image.sh Dockerfile-alpine Dockerfile-centos Dockerfile-centos-dashboard scripts update.sh

2、建立RocketMQ映象

構建命令: sh build-image.sh RMQ-VERSION BASE-IMAGE
可選RMQ-VERSION

例如: sh build-image.sh 4.7.0 centos (or alpine)

構建時間比較長

//構建完成

Successfully built 128108c2e50d

Successfully tagged apacherocketmq/rocketmq:4.7.1-alpine

[root@localhost image-build]# docker images |grep mq
apacherocketmq/rocketmq 4.7.0 28ce832d84bf 59 minutes ago 533MB

3、生成配置

[root@localhost rocketmq-docker-master]# sh stage.sh 4.7.0
Stage version = 4.7.0
mkdir /root/rocketmq-docker-master/stages/4.7.0
staged templates into folder /root/rocketmq-docker-master/stages/4.7.0

[root@localhost templates]# ls
data docker-compose kubernetes play-consumer.sh play-docker-compose.sh play-docker-dledger.sh play-docker.sh play-docker-tls.sh play-kubernetes.sh play-producer.sh ssl

4、部署方式

  1、單機

    ./play-docker.sh alpine

  2、docker-composer

    ./play-docker-compose.sh

  3、kubernetes叢集

     ./play-kubernetes.sh

  4、Cluster of Dledger storage(RocketMQ需要4.4.0版本以上)

    ./play-docker-dledger.sh

  5、TLS

    ./play-docker-tls.sh

    ./play-producer.sh

    ./play-consumer.sh

  我這裡選擇的是單機部署,可以看到生成了兩個容器

[root@localhost templates]# docker ps |grep mq
9a0a6ab594b7 apacherocketmq/rocketmq:4.7.0 "sh mqbroker" 56 minutes ago Up 56 minutes 0.0.0.0:10909->10909/tcp, :::10909->10909/tcp, 9876/tcp, 0.0.0.0:10911-10912->10911-10912/tcp, :::1091110912->10911-10912/tcp rmqbroker
d8a4db8335de apacherocketmq/rocketmq:4.7.0 "sh mqnamesrv" 56 minutes ago Up 56 minutes 10909/tcp, 0.0.0.0:9876->9876/tcp, :::9876->9876/tcp, 10911-10912/tcp rmqnamesrv

  驗證RocketMQ啟動成功

1、使用命令 docker ps|grep rmqbroker找到RocketMQ broker的容器id

2、使用命令 docker exec -it 9a0a6ab594b7 ./mqadmin clusterList -n 172.17.0.8:9876 驗證RocketMQ broker工作正常

[root@localhost elasticsearch]# docker exec -it 9a0a6ab594b7 ./mqadmin clusterList -n 192.168.1.204:9876
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.

  如需升級執行以下命令

  cd image-build

  ./update.sh

5、安裝RocketMQ控制檯

// 拉取映象

docker pull apacherocketmq/rocketmq-console:2.0.0

// 執行容器,這裡172.15.65.xx為宿主機ip

docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=172.15.65.xx:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 6881:8080 -t apacherocketmq/rocketmq-console:2.0.0

6、映象儲存

// 映象根據私有映象倉庫重新命名 並推送到私有倉庫

docker tag IMAGEID(映象id) REPOSITORY:TAG(倉庫:標籤)

#例子
docker tag ca1b6b825289 harbor.jiuqichina.com/public/rocketmq:4.9.3

docker push harbor.jiuqichina.com/public/rocketmq:4.9.3

【RocketMQ高可用】RocketMQ 雙主雙從叢集搭建

一、叢集架構

** 描述**
NameServer 叢集 NameServer 是一個無狀態的節點,可叢集部署,節點都是各自獨立的,無任何資訊同步
Broker 叢集 ① Broker 分為 Master 與 Slave,一個 Master 可以對應多個 Slave,但一個 Slave 只能對應一 個Master
② Master 與 Slave 的對應關係通過制定相同的 BrokerName,不同的 BrokerID 來定義,id 為 0 表示 Master, 非 0 表示 Slave
③ 可以部署多個 Master 實現 Broker 叢集,即多組 Master - Slaves 的 Broker 節點
④ Master 通常用於寫入資料,Slaves 用於讀取資料
⑤ 每個 Broker 與 NameServer 叢集中的所有節點建立長連線,定時註冊 Topic 資訊到所有 NameServer
Producer 叢集 ① Producer 為訊息的生產者,都是各自獨立的無狀態的節點,可以認為只要向 mq 中推送訊息的節點都算作 Producer 節點。
② Producer 節點與 NameServer 叢集中的隨機一個節點建立長連線,定期從 NameServer 取出 Topic 路由資訊,並向提供 Topic 服務的 Master 建立長連線。且定時向 Master 傳送心跳。
Customer 叢集 ① Customer 為訊息的消費者,都是各自獨立的無狀態的節點,可以認為只要向 mq 中獲取訊息的節點都算作 Customer 節點。
② Customer 節點與 NameServer 叢集中的隨機一個節點建立長連線,定期從 NameServer 取出 Topic 路由資訊,並向提供 Topic 服務的 Master、Slave 建立長連線。且定時向 Master、Slave 傳送心跳。
③ Customer 節點既可以從 Master 訂閱訊息,也可以從 Slave 訂閱訊息,訂閱規則由 Broker 配置決定

二、四種叢集模式

2.1 單 Master 模式

部署簡單,但風險較大,一旦 Broker 重啟或者宕機時,會導致服務不可用,不建議在線上環境使用,可以在本地測試

2.2 多 Master 模式

Broker 叢集中無 Slave,全是 Master

優點:

配置簡單,且單個 Master 宕機或重啟維護對應用無影響,在磁碟配置為 RAID10 時,即使機器宕機不可恢復的情況下,由於 RAID10 磁碟非常可靠,訊息也不會丟(非同步刷盤丟失少量訊息,同步刷盤一條不丟),效能最高

缺點:

單臺機器宕機期間,這臺機器上未被消費的訊息在機器恢復之前不可訂閱和消費,消費實時性會受到影響

2.3 多 Master 多 Slave 模式(非同步)

每個 Master 配置一個 Slave,有多對 Master-Slave,HA 採取非同步複製方式,主備有短暫訊息延遲(毫秒級)。即提供者將訊息傳送到 Master 後,Master 即刻返回結果給提供者。同時非同步複製到 Slave 中

優點:

即使磁碟損壞,丟失的訊息非常少,且訊息的實時性不會受到影響。且 Master 宕機後,消費者仍然可以從 Slave 消費,而且此過程對應用透明,不需要人工干預,效能同多 Master 模式幾乎一樣

缺點:

Master 宕機,磁碟損壞的情況下會丟失少量訊息

2.4 多 Master 多 Slave 模式(同步)

每個Master配置一個Slave,有多對Master-Slave,HA採用同步雙寫方式,即只有主備都寫成功,才嚮應用返回成功。即提供者將訊息傳送到 Master後,Master 要將這條訊息同步到所有的 Slave 上,同步全部完成後,才會返回結果給提供者。

優點:

資料與服務都無單點故障,在 Master 宕機的情況下訊息無延遲,服務可用性與資料可用性都非常高

訊息安全高,高可用性

缺點:

效能比非同步複製模式略低(約低10%左右),傳送單個訊息的RT會略高,且在主節點宕機後,備機不能自動切換為主機,需要人為干涉

三、雙主雙從叢集搭建

3.1 總體架構圖

雙主雙從叢集(2m-2s)同步雙寫方式,即使用兩組 Master-Slave 形成叢集

3.2 工作流程

1)啟動NameServer,NameServer起來後監聽埠,等待Broker、Producer、Consumer連上來,相當於一個路由控制中心。

2)Broker啟動,跟所有的NameServer保持長連線,定時傳送心跳包。心跳包中包含當前Broker資訊(IP+埠等)以及儲存所有Topic資訊。註冊成功後,NameServer叢集中就有Topic跟Broker的對映關係。

3)收發訊息前,先建立Topic,建立Topic時需要指定該Topic要儲存在哪些Broker上,也可以在傳送訊息時自動建立Topic。

4)Producer傳送訊息,啟動時先跟NameServer叢集中的其中一臺建立長連線,並從NameServer中獲取當前傳送的Topic存在哪些Broker上,輪詢從佇列列表中選擇一個佇列,然後與佇列所在的Broker建立長連線從而向Broker發訊息。

5)Consumer跟Producer類似,跟其中一臺NameServer建立長連線,獲取當前訂閱Topic存在哪些Broker上,然後直接跟Broker建立連線通道,開始消費訊息。

3.3 雙主雙從叢集搭建流程

在實際工作中,應只對外暴露需要被外部訪問的埠。

  • nameserver: 預設使用 9876 埠

  • master: 預設使用 10911 埠

  • slave: 預設使用 11011 埠

本次部署採用兩臺伺服器搭建:

  • server01: 192.168.1.206

    • nameserver-:9876
    • broker-a:10911
    • broker-b-s:11011
  • server01: 192.168.1.199

    • nameserver:9876

    • broker-a-s:10911

    • broker-b:11011

序號 IP 角色 架構模式
server01 192.168.1.206 nameserver、broker-a、broker-b-s Master1、Slave2
server02 192.168.1.199 nameserver、broker-b、broker-a-s Master2、Slave1

建立配置儲存路徑:

注意:logs 目錄和store目錄的許可權 否則會啟動不成功

server01:

mkdir -p data/{broker-a/conf,broker-a/logs,broker-a/store,broker-b-s/conf,broker-b-s/logs,/broker-b-s/store}

server02:

mkdir -p data/{broker-b/conf,broker-b/logs,broker-b/store,broker-a-s/conf,broker-a-s/logs,/broker-a-s/store}

1)Master01配置(192.168.1.206)

  • 在192.168.1.206機器上的Master Broker的配置檔案broker-a.conf

    vim data/broker-a/conf/broker-a.conf
    

    檔案內容:

    # 叢集名稱
    brokerClusterName=jiuqidev-cluster
    # broker 名稱,注意 master與slave名稱一致才能正確匹配
    brokerName=broker-a
    # brokerid  0= master  0> 表示slave
    brokerId=0
    # 刪除檔案時間點,預設凌晨 4點
    deleteWhen=04
    # 檔案保留時間,預設 48 小時
    fileReservedTime=120
    # Broker 的角色
    # - ASYNC_MASTER 非同步複製Master
    # - SYNC_MASTER 同步雙寫Master
    # - SLAVE
    brokerRole=ASYNC_MASTER
    # 刷盤方式
    # - ASYNC_FLUSH 非同步刷盤
    # - SYNC_FLUSH 同步刷盤
    flushDiskType=ASYNC_FLUSH
    # 監聽埠
    listenPort=10911
    # 設定broker 節點IP地址
    brokerIP1=192.168.1.206
    # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟
    autoCreateTopicEnable=true
    # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟
    autoCreateSubscriptionGroup=true
    
  • 在192.168.1.206機器上的Slave Broker的配置檔案broker-b-s.conf

    vim data/broker-b-s/conf/broker-b-s.conf 
    

    檔案內容:

    # 叢集名稱
    brokerClusterName=jiuqidev-cluster
    # broker 名稱,注意 master與slave名稱一致才能正確匹配
    brokerName=broker-b
    # brokerid  0= master  0> 表示slave
    brokerId=1
    # 刪除檔案時間點,預設凌晨 4點
    deleteWhen=04
    # 檔案保留時間,預設 48 小時
    fileReservedTime=120
    # Broker 的角色
    # - ASYNC_MASTER 非同步複製Master
    # - SYNC_MASTER 同步雙寫Master
    # - SLAVE
    brokerRole=SLAVE
    # 刷盤方式
    # - ASYNC_FLUSH 非同步刷盤
    # - SYNC_FLUSH 同步刷盤
    flushDiskType=ASYNC_FLUSH
    # 監聽埠 與master節點保持一致
    listenPort=11011
    # 設定broker 節點IP地址
    brokerIP1=192.168.1.206
    # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟
    autoCreateTopicEnable=true
    # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟
    autoCreateSubscriptionGroup=true
    
  • 在192.168.1.206上啟動docker-compose檔案

    vim docker-compose.yml
    

    檔案內容(根據官方docker-compose部署檔案修改):

    version: '2'
    services:
      #Service for nameserver
      namesrv:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqnamesrv
        ports:
          - 9876:9876
        volumes:
          - ./data/namesrv/logs:/home/rocketmq/logs
        command: sh mqnamesrv
    
      #Service for broker
      broker-a:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqbroker-a
        # master不採用host模式會有slave同步失敗的問題。待解決
        network_mode: "host"
        #ports:
        #  - 10909:10909
        #  - 10911:10911
        #  - 10912:10912
        environment:
          NAMESRV_ADDR: "192.168.1.206:9876;192.168.1.199:9876"
          # 設定broker啟動的jvm引數,預設8G或者系統記憶體的1/4 否則會報記憶體不足無法啟動
          JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
        volumes:
          - ./data/broker-a/logs:/home/rocketmq/logs
          - ./data/broker-a/store:/home/rocketmq/store
          - ./data/broker-a/conf/broker-a.conf:/opt/rocketmq-4.9.3/conf/broker-a.conf
        command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-a.conf
      broker-b-s:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqbroker-b-s
        network_mode: "host"
        #ports:
        #  - 11009:11009
        #  - 11011:11011
        #  - 11012:11012
        environment:
          NAMESRV_ADDR: "192.168.1.206:9876;192.168.1.199:9876"
          JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
        volumes:
          - ./data/broker-b-s/logs:/home/rocketmq/logs
          - ./data/broker-b-s/store:/home/rocketmq/store
          - ./data/broker-b-s/conf/broker-b-s.conf:/opt/rocketmq-4.9.3/conf/broker-b-s.conf
        command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-b-s.conf
      # Service for console
      rocketmq-console:
        image: apacherocketmq/rocketmq-dashboard:1.0.0
        #image: apacherocketmq/rocketmq-console:2.0.0
        container_name: rocketmq-console
        ports:
          - 6881:8080
        environment:
          JAVA_OPTS: "-Drocketmq.namesrv.addr=192.168.1.206:9876;192.168.1.199:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    

2)Master02配置(192.168.1.199)

  • 在192.168.1.199 機器上的Master Broker的配置檔案broker-b.conf

    vim data/broker-b/conf/broker-b.conf 
    

    檔案內容:

    # 叢集名稱
    brokerClusterName=jiuqidev-cluster
    # broker 名稱,注意 master與slave名稱一致才能正確匹配
    brokerName=broker-b
    # brokerid  0= master  0> 表示slave
    brokerId=0
    # 刪除檔案時間點,預設凌晨 4點
    deleteWhen=04
    # 檔案保留時間,預設 48 小時
    fileReservedTime=120
    # Broker 的角色
    # - ASYNC_MASTER 非同步複製Master
    # - SYNC_MASTER 同步雙寫Master
    # - SLAVE
    brokerRole=ASYNC_MASTER
    # 刷盤方式
    # - ASYNC_FLUSH 非同步刷盤
    # - SYNC_FLUSH 同步刷盤
    flushDiskType=ASYNC_FLUSH
    # 監聽埠
    listenPort=11011
    # 設定broker 節點IP地址
    brokerIP1=192.168.1.199
    # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟
    autoCreateTopicEnable=true
    # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟
    autoCreateSubscriptionGroup=true
    
  • 在192.168.1.199機器上的Slave Broker的配置檔案broker-a-s.conf

    vim data/broker-a-s/conf/broker-a-s.conf 
    

    檔案內容:

    # 叢集名稱
    brokerClusterName=jiuqidev-cluster
    # broker 名稱,注意 master與slave名稱一致才能正確匹配
    brokerName=broker-a
    # brokerid  0= master  0> 表示slave
    brokerId=1
    # 刪除檔案時間點,預設凌晨 4點
    deleteWhen=04
    # 檔案保留時間,預設 48 小時
    fileReservedTime=120
    # Broker 的角色
    # - ASYNC_MASTER 非同步複製Master
    # - SYNC_MASTER 同步雙寫Master
    # - SLAVE
    brokerRole=SLAVE
    # 刷盤方式
    # - ASYNC_FLUSH 非同步刷盤
    # - SYNC_FLUSH 同步刷盤
    flushDiskType=ASYNC_FLUSH
    # 監聽埠 與master節點保持一致
    listenPort=10911
    # 設定broker 節點IP地址
    brokerIP1=192.168.1.199
    # 是否允許 Broker 自動建立Topic,生產建議關閉 預設開啟
    autoCreateTopicEnable=true
    # 是否允許 Broker 自動建立訂閱組,生產建議關閉 預設開啟
    autoCreateSubscriptionGroup=true
    
  • 在192.168.1.199上啟動docker-compose檔案

    vim docker-compose.yml
    

    檔案內容(根據官方docker-compose部署檔案修改):

    version: '2'
    services:
      #Service for nameserver
      namesrv:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqnamesrv
        ports:
          - 9876:9876
        volumes:
          - ./data/namesrv/logs:/home/rocketmq/logs
        command: sh mqnamesrv
    
      #Service for broker
      broker-b:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqbroker-b
        network_mode: "host"
        #ports:
        #  - 11009:11009
        #  - 11011:11011
        #  - 11012:11012
        environment:
          - NAMESRV_ADDR=192.168.1.206:9876;192.168.1.199:9876
          - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
        volumes:
          - ./data/broker-b/logs:/home/rocketmq/logs
          - ./data/broker-b/store:/home/rocketmq/store
          - ./data/broker-b/conf/broker-b.conf:/opt/rocketmq-4.9.3/conf/broker-b.conf
        command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-b.conf
        #command: "tail -f /dev/null"
      broker-a-s:
        image: harbor.jiuqichina.com/public/rocketmq:4.9.3
        container_name: rmqbroker-a-s
        network_mode: "host"
        #ports:
        #  - 10909:10909
        #  - 10911:10911
        #  - 10912:10912
        environment:
          - NAMESRV_ADDR=192.168.1.206:9876;192.168.1.199:9876
          - JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
        volumes:
          - ./data/broker-a-s/logs:/home/rocketmq/logs
          - ./data/broker-a-s/store:/home/rocketmq/store
          - ./data/broker-a-s/conf/broker-a-s.conf:/opt/rocketmq-4.9.3/conf/broker-a-s.conf
        command: sh mqbroker -c /opt/rocketmq-4.9.3/conf/broker-a-s.conf
    

3.4 啟動叢集

  • server01 執行命令:

    docker-compose up -d
    
  • server02 執行命令:

    docker-compose up -d
    

開啟dashboard地址(http://192.168.1.206:6881/)檢視:

參考文件:

https://blog.csdn.net/qq_34416331/article/details/107336391