偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊 RocketMQ 主從復(fù)制

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
Master 啟動(dòng)后創(chuàng)建 AcceptSocketService 服務(wù) , 用來(lái)創(chuàng)建客戶(hù)端到服務(wù)端的 TCP 鏈接。

RocketMQ 主從復(fù)制是 RocketMQ 高可用機(jī)制之一,數(shù)據(jù)可以從主節(jié)點(diǎn)復(fù)制到一個(gè)或多個(gè)從節(jié)點(diǎn)。

這篇文章,我們聊聊 RocketMQ 的主從復(fù)制,希望大家讀完之后,能夠理解主從復(fù)制的精髓。

圖片圖片

一、同步與異步

在 RocketMQ 的集群模式中,Broker 分為 Master 與 Slave,一個(gè) Master 可以對(duì)應(yīng)多個(gè) Slave,但是一個(gè) Slave 只能對(duì)應(yīng)一個(gè) Master。

每個(gè) Broker 與 Name Server 集群中的所有節(jié)點(diǎn)建立長(zhǎng)連接,定時(shí)注冊(cè) Topic 信息到所有 Name Server。

圖片圖片

Master 節(jié)點(diǎn)負(fù)責(zé)接收客戶(hù)端的寫(xiě)入請(qǐng)求,并將消息持久化到磁盤(pán)上。而 Slave 節(jié)點(diǎn)則負(fù)責(zé)從 Master 節(jié)點(diǎn)復(fù)制消息數(shù)據(jù),并保持與 Master 節(jié)點(diǎn)的同步。

1、同步復(fù)制

圖片圖片

每個(gè) Master 配置一個(gè) Slave ,有多對(duì) Master-Slave ,HA 采用同步雙寫(xiě)方式,即只有主備都寫(xiě)成功,才向應(yīng)用返回成功。

這種模式的優(yōu)缺點(diǎn)如下:

  • 優(yōu)點(diǎn):數(shù)據(jù)與服務(wù)都無(wú)單點(diǎn)故障,Master宕機(jī)情況下,消息無(wú)延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高;
  • 缺點(diǎn):性能比異步復(fù)制模式略低(大約低10%左右),發(fā)送單個(gè)消息的 RT 會(huì)略高,且目前版本在主節(jié)點(diǎn)宕機(jī)后,備機(jī)不能自動(dòng)切換為主機(jī)。

2、異步復(fù)制

圖片圖片

每個(gè) Master 配置一個(gè) Slave ,有多對(duì) Master-Slave ,HA 采用異步復(fù)制方式,主備有短暫消息延遲(毫秒級(jí)),這種模式的優(yōu)缺點(diǎn)如下:

  • 優(yōu)點(diǎn):即使磁盤(pán)損壞,消息丟失的非常少,且消息實(shí)時(shí)性不會(huì)受影響,同時(shí)Master宕機(jī)后,消費(fèi)者仍然可以從Slave消費(fèi),而且此過(guò)程對(duì)應(yīng)用透明,不需要人工干預(yù),性能同多 Master 模式幾乎一樣;
  • 缺點(diǎn):Master 宕機(jī),磁盤(pán)損壞情況下會(huì)丟失少量消息 。

復(fù)制流程分為兩個(gè)部分:元數(shù)據(jù)復(fù)制和消息數(shù)據(jù)復(fù)制。

  • 主從服務(wù)器同步主題,消費(fèi)者進(jìn)度,延遲消費(fèi)進(jìn)度,消費(fèi)者配置數(shù)據(jù)
  • 主從服務(wù)器同步消息數(shù)據(jù)

二、元數(shù)據(jù)復(fù)制

Slave Broker 定時(shí)任務(wù)每隔 10 秒會(huì)同步元數(shù)據(jù),包括主題,消費(fèi)進(jìn)度,延遲消費(fèi)進(jìn)度,消費(fèi)者配置。

圖片圖片

同步主題時(shí), Slave Broker 向 Master Broker 發(fā)送 RPC 請(qǐng)求,返回?cái)?shù)據(jù)后,首先加入本地緩存里,然后持久化到本地。

圖片圖片

三、消息數(shù)據(jù)復(fù)制

下圖是 Master 和 Slave 消息數(shù)據(jù)同步的流程圖。

圖片圖片

1、Master 啟動(dòng)后監(jiān)聽(tīng)指定端口;

Master 啟動(dòng)后創(chuàng)建 AcceptSocketService 服務(wù)  ,  用來(lái)創(chuàng)建客戶(hù)端到服務(wù)端的 TCP 鏈接。

圖片圖片

RocketMQ 抽象了鏈接對(duì)象 HAConnection , HAConnection 會(huì)啟動(dòng)兩個(gè)線程,分別用于讀服務(wù)和寫(xiě)服務(wù):

  • 讀服務(wù):處理 Slave 發(fā)送的請(qǐng)求
  • 寫(xiě)服務(wù):用于向 Slave 傳輸數(shù)據(jù)

圖片圖片

2、Slave 啟動(dòng)后,嘗試連接 Master ,建立 TCP 連接;

HAClient 是客戶(hù)端 Slave 的核心類(lèi) ,負(fù)責(zé)和 Master 創(chuàng)建連接和數(shù)據(jù)交互。

圖片圖片

客戶(hù)端在啟動(dòng)后,首先嘗試連接 Master , 查詢(xún)當(dāng)前消息存儲(chǔ)中最大的物理偏移量 ,并存儲(chǔ)在變量 currentReportedOffset 里。

3、Slave 向 Master 匯報(bào)拉取消息偏移量;

圖片圖片

上報(bào)進(jìn)度的數(shù)據(jù)格式是一個(gè) Long 類(lèi)型的 Offset ,  8個(gè)字節(jié) ,  非常簡(jiǎn)潔 。

圖片圖片

發(fā)送到 Socket 緩沖區(qū)后 ,  修改最后一次的寫(xiě)時(shí)間 lastWriteTimestamp 。

4、Master 解析請(qǐng)求偏移量,從消息文件中檢索該偏移量后的所有消息;

當(dāng) Slave 上報(bào)數(shù)據(jù)到 Master 時(shí),觸發(fā) SelectionKey.OP_READ 事件,Master 將請(qǐng)求交由 ReadSocketService 服務(wù)處理:

圖片圖片

當(dāng) Slave Broker 傳遞了自身 commitlog 的 maxPhyOffset 時(shí),Master 會(huì)馬上中斷 selector.select(1000) ,執(zhí)行 processReadEvent 方法。

圖片圖片

processReadEvent 方法的核心邏輯是設(shè)置 Slave 的當(dāng)前進(jìn)度 offset ,然后通知復(fù)制線程當(dāng)前的復(fù)制進(jìn)度。

寫(xiě)服務(wù) WriteSocketService 從消息文件中檢索該偏移量后的所有消息(傳輸批次數(shù)據(jù)大小限制),并將消息數(shù)據(jù)發(fā)送給 Slave。

圖片圖片

5、Slave 接收到數(shù)據(jù),將消息數(shù)據(jù) append 到消息文件 commitlog 里 。

圖片圖片

首先 HAClient 類(lèi)中調(diào)用 dispatchReadRequest 方法 , 解析出消息數(shù)據(jù) ;

圖片圖片

然后將消息數(shù)據(jù) append 到本地的消息存儲(chǔ)。

圖片圖片

四、 同步的實(shí)現(xiàn)

從數(shù)據(jù)復(fù)制流程圖,我們發(fā)覺(jué)數(shù)據(jù)復(fù)制本身就是一個(gè)異步執(zhí)行的,但是同步是如何實(shí)現(xiàn)的呢?

Master Broker 接收到寫(xiě)入消息的請(qǐng)求后 ,調(diào)用 Commitlog 的 aysncPutMessage 方法寫(xiě)入消息。

圖片圖片

這段代碼中,當(dāng) commitLog 執(zhí)行完 appendMessage 后, 需要執(zhí)行刷盤(pán)任務(wù)和同步復(fù)制兩個(gè)任務(wù)。

但這兩個(gè)任務(wù)并不是同步執(zhí)行,而是異步的方式,使用了 CompletableFuture 這個(gè)異步神器。

當(dāng) HAConnection 讀服務(wù)接收到 Slave 的進(jìn)度反饋,發(fā)現(xiàn)消息數(shù)據(jù)復(fù)制成功,則喚醒 future 。

圖片圖片

最后 Broker 組裝響應(yīng)命令 ,并將響應(yīng)命令返回給客戶(hù)端。

五、總結(jié)

RocketMQ 主從復(fù)制的實(shí)現(xiàn)思路非常簡(jiǎn)潔,Slave 啟動(dòng)一個(gè)線程,不斷從 Master 拉取 Commit Log 中的數(shù)據(jù),然后在異步 build 出 Consume Queue 數(shù)據(jù)結(jié)構(gòu)。

核心要點(diǎn)如下:

1、主從復(fù)制包含元數(shù)據(jù)復(fù)制和消息數(shù)據(jù)復(fù)制兩個(gè)部分;

2、元數(shù)據(jù)復(fù)制

Slave Broker 定時(shí)任務(wù)每隔 10 秒向 Master Broker 發(fā)送 RPC 請(qǐng)求,將元數(shù)據(jù)同步到緩存后,然后持久化到磁盤(pán)里;

3、消息數(shù)據(jù)復(fù)制

  1. Master 啟動(dòng)監(jiān)聽(tīng)指定端口
  2. Slave  啟動(dòng) HaClient 服務(wù),和 Master 創(chuàng)建 TCP 鏈接
  3. Slave 向 Master 上報(bào)存儲(chǔ)進(jìn)度
  4. Master 接收進(jìn)度,消息文件中檢索該偏移量后的所有消息,并傳輸給 Slave
  5. Slave 接收到數(shù)據(jù)后,將消息數(shù)據(jù) append 到本地的消息存儲(chǔ)。

4、同步的實(shí)現(xiàn)

當(dāng) commitLog 執(zhí)行完 appendMessage 后, 需要執(zhí)行刷盤(pán)任務(wù)和同步復(fù)制兩個(gè)任務(wù),這里用到了 CompletableFuture 這個(gè)異步神器。 

當(dāng) HAConnection 讀服務(wù)接收到 Slave 的進(jìn)度反饋,發(fā)現(xiàn)消息數(shù)據(jù)復(fù)制成功,則喚醒 future 。最后 Broker 組裝響應(yīng)命令 ,并將響應(yīng)命令 返回給客戶(hù)端 。

責(zé)任編輯:武曉燕 來(lái)源: 勇哥java實(shí)戰(zhàn)分享
相關(guān)推薦

2025-01-15 15:47:36

2023-03-19 11:53:27

2023-03-19 22:38:12

邏輯復(fù)制PostgreSQL

2023-09-24 14:32:15

2025-02-10 10:55:16

2024-07-04 08:00:24

2024-03-01 18:33:59

MySQL節(jié)點(diǎn)數(shù)據(jù)

2021-06-08 07:48:27

MySQL主從配置

2023-12-25 08:02:09

2017-09-05 16:00:49

MySQL主從復(fù)制備份

2017-10-11 15:40:20

MySQL主從復(fù)制拓?fù)浣Y(jié)構(gòu)

2022-12-20 08:46:41

MySQL主從復(fù)制

2021-05-20 06:49:45

MongoDB高可用數(shù)據(jù)庫(kù)

2021-03-19 11:33:42

MySQL數(shù)據(jù)庫(kù)備份

2021-07-29 10:39:50

MySQLMySQL5.7MySQL8

2020-04-14 16:26:22

MySQL線程同步

2017-06-23 22:00:13

MySqlsslcentos

2021-01-12 09:03:17

MySQL復(fù)制半同步

2023-04-06 13:15:48

MySQL復(fù)制原理應(yīng)用實(shí)踐

2024-07-04 17:22:23

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)