1. 程式人生 > >RocketMQ 升級到主從切換(DLedger、多副本)實戰

RocketMQ 升級到主從切換(DLedger、多副本)實戰

目錄

  • 1、RocketMQ DLedger 多副本即主從切換核心配置引數詳解
  • 2、搭建主從同步環境
  • 3、主從同步叢集升級到DLedger
    • 3.1 部署架構
    • 3.2 升級步驟
    • 3.3 驗證訊息傳送與訊息查詢

本文主要介紹如何將 RocketMQ 叢集從原先的主從同步升級到主從切換。

首先先介紹與 DLedger 多副本即 RocketMQ 主從切換相關的核心配置屬性,然後嘗試搭建一個主從同步叢集,再從原先的 RocketMQ 叢集平滑升級到 DLedger 叢集的示例,並簡單測試一下主從切換功能。

@(本節目錄)

1、RocketMQ DLedger 多副本即主從切換核心配置引數詳解

其主要的配置引數如下所示:

  • enableDLegerCommitLog
    是否啟用 DLedger,即是否啟用 RocketMQ 主從切換,預設值為 false。如果需要開啟主從切換,則該值需要設定為 true 。
  • dLegerGroup
    節點所屬的 raft 組,建議與 brokerName 保持一致,例如 broker-a。
  • dLegerPeers
    叢集節點資訊,示例配置如下:n0-127.0.0.1:40911;n1-127.0.0.1:40912;n2-127.0.0.1:40913,多個節點用英文冒號隔開,單個條目遵循 legerSlefId-ip:埠,這裡的埠用作 dledger 內部通訊。
  • dLegerSelfId
    當前節點id。取自 legerPeers 中條目的開頭,即上述示例中的 n0,並且特別需要強調,只能第一個字元為英文,其他字元需要配置成數字。
  • storePathRootDir
    DLedger 日誌檔案的儲存根目錄,為了能夠支援平滑升級,該值與 storePathCommitLog 設定為不同的目錄。

2、搭建主從同步環境

首先先搭建一個傳統意義上的主從同步架構,往叢集中灌一定量的資料,然後升級到 DLedger 叢集。

在 Linux 伺服器上搭建一個 rocketmq 主從同步叢集我想不是一件很難的事情,故本文就不會詳細介紹按照過程,只貼出相關配置。

實驗環境的部署結構採取 一主一次,其部署圖如下:


下面我就重點貼一下 broker 的配置檔案。
220 上的 broker 配置檔案如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.0.220
brokerIP2=192.168.0.220
namesrvAddr=192.168.0.221:9876;192.168.0.220:9876
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store
storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

221 上 broker 的配置檔案如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.0.221
brokerIP2=192.168.0.221
namesrvAddr=192.168.0.221:9876;192.168.0.220:9876
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store
storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false

相關的啟動命令如下:

nohup bin/mqnamesrv  /dev/null  2>&1 &
nohup bin/mqbroker -c conf/broker.conf  /dev/null  2>&1 &

安裝後的叢集資訊如圖所示:

3、主從同步叢集升級到DLedger

3.1 部署架構

DLedger 叢集至少需要3臺機器,故搭建 DLedger 還需要再引入一臺機器,其部署結構圖如下:

從主從同步叢集升級到 DLedger 叢集,使用者最關心的還是升級後的叢集是否能夠相容原先的資料,即原先儲存在訊息能否能被訊息消費者消費端,甚至於能否查詢到。
為了方便後續驗證,首先我使用下述程式向 mq 叢集中添加了一篇方便查詢的訊息(設定訊息的key)。

public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("producer_dw_test");
        producer.setNamesrvAddr("192.168.0.220:9876;192.168.0.221:9876");
        producer.start();
        for(int i =600000; i < 600100; i ++) {
            try {
                Message msg = new Message("topic_dw_test_by_order_01",null , "m" + i,("Hello RocketMQ" + i ).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(msg);
               //System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        producer.shutdown();
        System.out.println("end");
    }
}

訊息的查詢結果示例如下:

3.2 升級步驟

Step1:將 192.168.0.220 的 rocketmq 拷貝到 192.168.0.222,可以使用如下命令進行操作。在 192.168.0.220 上敲如下命令:

 scp -r rocketmq-all-4.5.2-bin-release/ [email protected]:/opt/application/rocketmq-all-4.5.2-bin-release

溫馨提示:示例中由於版本是一樣,實際過程中,版本需要升級,故需先下載最新的版本,然後將老叢集中的 store 目錄完整的拷貝到新叢集的 store 目錄。

Step2:依次在三臺伺服器的 broker.conf 配置檔案中新增與 dledger 相關的配置屬性。

192.168.0.220 broker配置檔案如下:

brokerClusterName = DefaultCluster
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.0.220
brokerIP2=192.168.0.220
namesrvAddr=192.168.0.221:9876;192.168.0.220:9876
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store
storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
# 與 dledger 相關的屬性
enableDLegerCommitLog=true
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store/dledger_store
dLegerGroup=broker-a
dLegerPeers=n0-192.168.0.220:40911;n1-192.168.0.221:40911;n2-192.168.0.222:40911
dLegerSelfId=n0

192.168.0.221 broker配置檔案如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.0.221
brokerIP2=192.168.0.221
namesrvAddr=192.168.0.221:9876;192.168.0.220:9876
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store
storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
# 與dledger 相關的配置屬性
enableDLegerCommitLog=true
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store/dledger_store
dLegerGroup=broker-a
dLegerPeers=n0-192.168.0.220:40911;n1-192.168.0.221:40911;n2-192.168.0.222:40911
dLegerSelfId=n1

192.168.0.222 broker配置檔案如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.0.222
brokerIP2=192.168.0.222
namesrvAddr=192.168.0.221:9876;192.168.0.220:9876
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store
storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog
autoCreateTopicEnable=false
autoCreateSubscriptionGroup=false
# 與 dledger 相關的配置
enableDLegerCommitLog=true
storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store/dledger_store
dLegerGroup=broker-a
dLegerPeers=n0-192.168.0.220:40911;n1-192.168.0.221:40911;n2-192.168.0.222:40911
dLegerSelfId=n2

溫馨提示:legerSelfId 分別為 n0、n1、n2。在真實的生產環境中,broker配置檔案中的 storePathRootDir、storePathCommitLog 儘量使用單獨的根目錄,這樣判斷其磁碟使用率時才不會相互影響。

Step3:將 store/config 下的 所有檔案拷貝到 dledger store 的 congfig 目錄下。

cd /opt/application/rocketmq-all-4.5.2-bin-release/store/
cp config/* dledger_store/config/

溫馨提示:該步驟按照各自按照時配置的目錄進行復制即可。

Step4:依次啟動三臺 broker。

nohup bin/mqbroker -c conf/broker.conf  /dev/null  2>&1 &

如果啟動成功,則在 rocketmq-console 中看到的叢集資訊如下:

3.3 驗證訊息傳送與訊息查詢

首先我們先驗證升級之前的訊息是否能查詢到,那我們還是查詢key 為 m600000 的訊息,查詢結果如圖所示:

然後我們來測試一下訊息傳送。測試程式碼如下:

public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("producer_dw_test");
        producer.setNamesrvAddr("192.168.0.220:9876;192.168.0.221:9876");
        producer.start();
        for(int i =600200; i < 600300; i ++) {
            try {
                Message msg = new Message("topic_dw_test_by_order_01",null , "m" + i,("Hello RocketMQ" + i ).getBytes(RemotingHelper.DEFAULT_CHARSET));
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        producer.shutdown();
        System.out.println("end");
    }
}

執行結果如下:

再去控制檯查詢一下訊息,其結果也表明新的訊息也能查詢到。

最後我們再來驗證一下主節點宕機,訊息傳送是否會受影響。

在訊息傳送的過程中,去關閉主節點,其截圖如下:
再來看一下叢集的狀態:

等待該複製組重新完成主伺服器選舉後,即可繼續處理訊息傳送。

溫馨提示:由於本示例是一主一從,故在選舉期間,訊息不可用,但在真實的生產環境上,其部署架構是多主主從,即一個複製組在 leader 選舉期間,其他複製組可以接替該複製組完成訊息的傳送,實現訊息服務的高可用。

與 DLedger 相關的日誌,預設儲存在 broker_default.log 檔案中。

本文就介紹到這裡了,如果覺得文章對您有幫助的話,還希望幫忙點個贊,謝謝。


推薦閱讀:原始碼分析 RocketMQ DLedger 多副本即主從切換系列文章:
1、RocketMQ 多副本前置篇:初探raft協議
2、原始碼分析 RocketMQ DLedger 多副本之 Leader 選主
3、原始碼分析 RocketMQ DLedger 多副本儲存實現
4、原始碼分析 RocketMQ DLedger(多副本) 之日誌追加流程
5、原始碼分析 RocketMQ DLedger(多副本) 之日誌複製(傳播)
6、基於 raft 協議的 RocketMQ DLedger 多副本日誌複製設計原理
7、RocketMQ 整合 DLedger(多副本)即主從切換實現平滑升級的設計技巧
8、原始碼分析 RocketMQ DLedger 多副本即主從切換實現原理


作者介紹:丁威,《RocketMQ技術內幕》作者,RocketMQ 社群佈道師,公眾號:中介軟體興趣圈 維護者,目前已陸續發表原始碼分析Java集合、Java 併發包(JUC)、Netty、Mycat、Dubbo、RocketMQ、Mybatis等原始碼專欄。可以點選連結加入中介軟體知識星球 ,一起探討高併發、分散式服務架構,交流原始碼。

相關推薦

RocketMQ 升級主從切換(DLedger副本)實戰

目錄 1、RocketMQ DLedger 多副本即主從切換核心配置引數詳解 2、搭建主從同步環境 3、主從同步叢集升級到DLedger 3.1 部署架構 3.2 升級步驟 3

Redis主從復制實例及其高可用(三)--技術流ken

ups not run mct redis 監控 主從復制 傳輸 recv cep Redis主從復制 Redis的主從復制策略是通過其持久化的rdb文件來實現的,其過程是先dump出rdb文件,將rdb文件全量傳輸給slave,然後再將dump後的操作實時同步到sla

RocketMQ 整合 DLedger(副本)即主從切換實現平滑升級的設計技巧

目錄 1、閱讀原始碼之前的思考 2、從 Broker 啟動流程看 DLedger 2.1 構建 DefaultMessageStore 2.2 增加節點狀態變更事件監聽器 2.3 呼叫 Def

原始碼分析 RocketMQ DLedger 副本之 Leader 選主

目錄 1、DLedger關於選主的核心類圖 1.1 DLedgerConfig 1.2 MemberState 1.3 raft協議相關 1.4 DLedgerRpcService

原始碼分析 RocketMQ DLedger(副本) 之日誌複製(傳播)

目錄 1、DLedgerEntryPusher 1.1 核心類圖 1.2 構造方法 1.3 startup 2、EntryDispatcher 詳解 2.1

基於 raft 協議的 RocketMQ DLedger 副本日誌複製設計原理

目錄 1、RocketMQ DLedger 多副本日誌複製流程圖 1.1 RocketMQ DLedger 日誌轉發(append) 請求流程圖 1.2 RocketMQ DLedger 日誌仲裁流程圖 1.

企業實戰-KeepAlived+Redis實現主從熱備秒級切換

keepalived redis 楊文 最近公司生產環境需要做一個Redis+Keepalived的集群架構,分別用六個端口,實現多路復用,最終實現主從熱備、秒級切換。一、部署Redis集群首先用兩臺虛擬機模擬6個節點,一臺機器3個節點,創建出3 master、3 salve 環境。然後模擬成功,

使用Mycat實現MySQL的分庫分表讀寫分離主從切換

Mycat 分庫分表 讀寫分離 主從切換 Mycat及MySQL實例部署情況:Mycat:IP:10.20.8.57,Port:3310/3311MySQL :db1-M1,IP:10.20.8.126,Port:3306db1-M2,IP:10.20.8.126,Port:3307db2-M

Node快速切換版本版本回退(降級)版本更新(升級)

Node快速切換版本、版本回退(降級)、版本更新(升級) 場景 最近遇到一些node的坑,比如6.3.0版的node用不了公司最新的工作流,升級到10.x版的node後,又用不了另一套工作流。 問題 怎麼實現node版本降級、升級?是否可以安裝多個版本按需要進行切換?

redis在Docker下的主從複製(讀寫分離)哨兵(主從切換

       公司專案涉及到redis,最近不太忙於是準備仔細學習下,起初是直接在Windows下搭建,現在試試Docker下搭建redis然後試下哨兵配置,廢話不多說,直接搭建步驟: 1.Docker安裝redis 指令1)docker search redis 查詢

redis的主從複製(讀寫分離)哨兵(主從切換)配置

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。redis提供了一個master,多個slave的服務。          準備三個redis服務,依次命名資料夾子

Redis服務端優化實踐:配置優化主從切換持久化

Redis是部門業務重要的核心業務元件,被廣泛應用在行情繫統、推送服務、資料中心、投顧、圈子、量化分析等平臺。在使用Redis的過程中遇到了很多問題,涉及到開發者使用API時的一些注意事項,以及如何通過優化服務端配置提高Redis的健壯性、容錯性。 本文通過案例分析的方式分享一下我們在Redis服務

自動化測試——frame表單切換視窗切換

一、frame表單 frame:HTML頁面中的一中框架,主要作用是在當前頁面中指定區域顯示另一頁面元素;              (HTML語言中,frame/iframe標籤為表單框架) 1、frame表單切換

vim開啟視窗檔案之間的切換

開啟多個檔案: 一、vim還沒有啟動的時候: 1.在終端裡輸入 vim file1 file2 ... filen便可以開啟所有想要開啟的檔案 2.vim已經啟動 輸入 :e file 可以再開啟一個檔案,並且此時vim裡會顯示出file檔案的內容。 3.同時

Storyboard的基礎知識-介面管理View切換View間資料傳遞

Storyboard是現在Apple推薦的介面管理方式,我初學,使用的Xcode 5,預設已經不再使用XIB管理介面了,不過Storyboard跟XIB其實也是一樣的,都是一個XML檔案,只不過Storyboard的XML結構更加複雜。 此專案的St

ROCKETMQ 主從切換機制

       之前看rocketmq,然後在想一個問題,就是一主一從的叢集結構中,如果master宕機了,consumer這邊是怎麼選擇的,按照官方說明中,master掛了,但是slave中的訊息仍然可以被consume消費到,然後master恢復後,master的訊息又

Spring AOP實現Mysql資料庫主從切換(一主從)

設定資料庫主從切換的原因:資料庫中經常發生的是“讀多寫少”,這樣讀操作對資料庫壓力比較大,通過採用資料庫叢集方案,  一個數據庫是主庫,負責寫;其他為從庫,負責讀,從而實現讀寫分離增大資料庫的容錯率。  那麼,對資料庫的要求是:  1. 讀庫和寫庫的資料一致;  2. 寫資料

mongodb之單個例項主從配置個節點

在大資料的時代,傳統的關係型資料庫要能更高的服務必須要解決高併發讀寫、海量資料高效儲存、高可擴充套件性和高可用性這些難題。不過就是因為這些問題Nosql誕生了。 NOSQL有這些優勢:  · 大資料量,可以通過廉價伺服器儲存大量的資料,輕鬆擺脫傳統mysql單表儲存量級限制

Spring Boot MyBatis 動態資料來源切換資料來源,讀寫分離

轉載自:https://blog.csdn.net/u013360850/article/details/78861442本專案使用 Spring Boot 和 MyBatis 實現多資料來源,動態資料來源的切換;有多種不同的實現方式,在學習的過程中發現沒有文章將這些方式和常

Mycat實現MySQL的分庫分表讀寫分離主從切換

mysql> show tables;+--------------+| Tables in db |+--------------+| t1           |+--------------+1 row in set (0.00 sec)mysql> desc t1;+---------+-