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

八張圖帶你徹底理解 Pulsar 的跨地域復(fù)制

開(kāi)發(fā) 前端
跨地域復(fù)制是 Apache Pulsar 企業(yè)級(jí)特性的重要組成部分,它保證了系統(tǒng)的高可用,在操作和管理上也非常便捷,今天用 5 張圖來(lái)帶大家學(xué)習(xí)這個(gè)功能。

[[438652]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序員jinjunzhu」,作者jinjunzhu。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員jinjunzhu公眾號(hào)。

跨地域復(fù)制是 Apache Pulsar 企業(yè)級(jí)特性的重要組成部分,它保證了系統(tǒng)的高可用,在操作和管理上也非常便捷,今天用 5 張圖來(lái)帶大家學(xué)習(xí)這個(gè)功能。

1.多機(jī)房部署

Pulsar 多機(jī)房部署如下圖:

上面的 Pulsar 架構(gòu)中,Pulsar 3 個(gè)集群分別部署在北京、上海、貴陽(yáng) 3 個(gè)機(jī)房,每個(gè)機(jī)房一套集群,每個(gè)集群中都有一個(gè) Topic1,并且對(duì)應(yīng)著訂閱是 Subscription1。但是 3 個(gè)集群之間并沒(méi)有數(shù)據(jù)同步。如果某一個(gè)機(jī)房發(fā)生故障,那這個(gè)機(jī)房的存量消息將不能被消費(fèi)掉。

2.跨地域復(fù)制 (GEO-Replication)

Pulsar 最初是在 Yahoo 內(nèi)部開(kāi)發(fā),在設(shè)計(jì)之初就加入了對(duì) Yahoo 全球十多個(gè)機(jī)房的跨地域復(fù)制的需求。在上面的例子中,如果這 3 個(gè)機(jī)房可以相互同步數(shù)據(jù),那即使某一個(gè)機(jī)房發(fā)生故障了,這個(gè)機(jī)房的存量數(shù)據(jù)因?yàn)橐呀?jīng)被同步到其他機(jī)房,可以被其他機(jī)房的消費(fèi)者消費(fèi)掉。如下圖:

那 Pulsar 的跨地域復(fù)制到底是怎么做的呢?

2.1 存儲(chǔ)模型回顧

首先我們回顧一下 Pulsar 的存儲(chǔ)模型。我們知道,Pulsar 的消息持久化用到了存儲(chǔ)系統(tǒng) BookKeeper,如下圖:

Producer 生產(chǎn)完消息后,會(huì)刷到底層的 BookKeeper 存儲(chǔ)引擎進(jìn)行持久化。

Consumer 創(chuàng)建的時(shí)候要訂閱一個(gè) Topic,Pulsar 就會(huì)給它分配一個(gè) Subscription 進(jìn)行綁定,如上圖 Consumer 綁定了 Subscription2。

Subscription 會(huì)持續(xù)從 Ledger 中獲取消息推給 Consumer,當(dāng)然前提是 Consumer 要有消息緩存空間。

Consumer 消費(fèi)完成一個(gè)消息后,回復(fù)給 Subscription 一個(gè) ACK,Subscription 收到 ACK 后把游標(biāo)向后推一位。這個(gè)游標(biāo)也是保存在了 BookKeeper,BookKeeper 會(huì)專門為這個(gè)游標(biāo)開(kāi)一個(gè) Ledger。

2.2 跨地域復(fù)制過(guò)程

Pulsar 的跨地域復(fù)制跟上面的存儲(chǔ)模型很類似,集群中多了一個(gè) Replicator。以上海機(jī)房復(fù)制到北京機(jī)房為例,如下圖:

上海機(jī)房的 Pulsar 集群中有一個(gè) Replicator,這個(gè) Replicator 中有一個(gè) Producer-R,綁定的了北京機(jī)房的 Topic1,把數(shù)據(jù)用生產(chǎn)者的方式發(fā)送到北京機(jī)房。

上海機(jī)房集群中生產(chǎn)的消息首先在本地集群中持久化,然后再被異步轉(zhuǎn)發(fā)到北京集群。

上海機(jī)房 Replicator 中的 Producer-R 跟集群中的 Producer1 沒(méi)有任何關(guān)系,它配置的集群地址是北京機(jī)房集群地址。

整個(gè)復(fù)制流程如下:

  • Producer1 生產(chǎn)消息到上海機(jī)房 Topic1;
  • 上海機(jī)房把消息持久化到 BookKeeper;
  • BookKeeper 返回成功后把消息推給 Replicator 的 Cursor;
  • Replicator 的 Cursor 通過(guò) Producer-R 把消息發(fā)給北京機(jī)房 Topic1;
  • 北京機(jī)房 Topic1 寫入 BookKeeper 成功后給上海機(jī)房 Replicator 的 Cursor 回復(fù)一個(gè) ACK,上海機(jī)房 Cursor 收到 ACK 后通過(guò) Producer-R 推送下一條消息。

2.3 消息丟失和冪等

因?yàn)樵?Replicator 中維護(hù)了一個(gè) Cursor,如果一條消息沒(méi)有收到北京機(jī)房的 ACK,Replicator 可以通過(guò) Producer-R 再次把這條消息發(fā)送北京機(jī)房,這樣可以防止消息丟失。

如果因?yàn)榫W(wǎng)絡(luò)問(wèn)題,Producer-R 給北京機(jī)房推送消息后,北京機(jī)房回復(fù)的 ACK 上海機(jī)房沒(méi)有收到,怎么處理呢?Producer-R 會(huì)再次給北京機(jī)房發(fā)送同一條消息,這種場(chǎng)景很容易導(dǎo)致消息重復(fù)。為了解決消息冪等的問(wèn)題,Pulsar 提供了一個(gè) Producer 冪等配置,北京機(jī)房開(kāi)啟這個(gè)設(shè)置后,broker 中會(huì)緩存一個(gè)內(nèi)部 Cursor,用于保存收到的上一條消息的 MessageId ,如果收到一條新消息的 MessageId 小于等于當(dāng)前 Cursor 中緩存的 MessageId,這條消息就會(huì)被丟掉。

2.4 消息順序

上圖中,上海機(jī)房的 Producer-R 和 北京機(jī)房的 Producer2 都往北京機(jī)房的 Topic1 寫消息,消息的順序怎么保證呢?

因?yàn)榭鐧C(jī)房復(fù)制是異步的過(guò)程,Pulsar 只能保證上海機(jī)房和北京機(jī)房各自寫入消息的順序性,比如上海機(jī)房Producer-R 寫入 msg1~msg5 這 5 條消息,北京機(jī)房 Producer2 寫入 msgA~msgE 這5條消息,最終消息順序可能如下:

2.5 低延遲

跨區(qū)域復(fù)制的低延遲從兩個(gè)方面來(lái)保證:

Replicator 和 broker 是在一個(gè)進(jìn)程中,這樣減少了數(shù)據(jù)拷貝

跨地域復(fù)制采用異步方式

2.6 ZooKeeper 集群

跨機(jī)房復(fù)制可以采用全局 ZooKeeper 集群,把 Pulsar 集群信息注冊(cè)到 ZooKeeper 集群。如下圖:

這樣每個(gè)集群就可以根據(jù) ZooKeeper 中保存的信息來(lái)創(chuàng)建本地的 Replicator。

但是如果沒(méi)有全局 ZooKeeper 集群,因?yàn)楸4娴臄?shù)據(jù)是輕量級(jí)的,使用本地 ZooKeeper 集群也是可以的。如下圖:

這樣每個(gè)機(jī)房的 Pulsar 集群從本地 ZooKeeper 中獲取到需要復(fù)制的遠(yuǎn)程集群信息,就可以創(chuàng)建 Replicator 了。這種情況反而更加靈活。因?yàn)橄旅孢@種方式的 Pulsar 集群,全局 ZooKeeper 是不能滿足要求的。

比如現(xiàn)在有一個(gè)西安機(jī)房的 Pulsar 集群自己不生產(chǎn)消息,只接受從北京、上海、貴陽(yáng)三個(gè)機(jī)房的復(fù)制數(shù)據(jù),如下圖:

3.復(fù)制原理

Pulsar 中 Topic 的格式如下:

  1. persistent://tenant/namespace/topic 

一個(gè) Topic 的上級(jí)目錄有 namespace 和 tenant。要允許兩個(gè)集群間消息跨地域復(fù)制,首先要允許 tenant(租戶) 有權(quán)限訪問(wèn)兩個(gè)集群。而跨地域復(fù)制是在 namespace 級(jí)別進(jìn)行管理的,如果允許一個(gè) namespace 跨地域復(fù)制,那發(fā)布到這個(gè) namespace 上的任意一個(gè) topic 的消息,都會(huì)被復(fù)制到指定集合的所有集群中。

3.1 tenant 授權(quán)

要使用跨地域復(fù)制,首先要給租戶設(shè)置訪問(wèn)權(quán)限。下面命令給 my-tenant 這個(gè)租戶授予了 pulsar-shanghai、pulsar-beijing 和 pulsar-guiyang 的訪問(wèn)權(quán)限。

  1. bin/pulsar-admin tenants create my-tenant --admin-roles my-admin-role --allowed-clusters pulsar-shanghai,pulsar-beijing,pulsar-guiyang 

3.2 namespace 級(jí)別啟動(dòng)

跨地域復(fù)制是在 namespace 級(jí)別進(jìn)行管理的,租戶擁有了權(quán)限后,把 namespace 指定給要復(fù)制的集群:

  1. bin/pulsar-admin namespaces set-clusters my-tenant/my-namespace --clusters pulsar-shanghai,pulsar-beijing,pulsar-guiyang 

namespace 級(jí)別的復(fù)制可以隨時(shí)改變,改變后立刻生效。

namespace 配置跨地域復(fù)制后,默認(rèn)該 namespace 下創(chuàng)建的所有 Topic 都會(huì)復(fù)制到列表中其他集群。如果要選擇固定的集群進(jìn)行復(fù)制,可以使用 Pulsar Client 來(lái)指定,比如 Java Client 下面的代碼只允許 my-topic 這個(gè) topic 在pulsar-shanghai,pulsar-beijing 這兩個(gè)集群間復(fù)制。

  1. List<String> restrictReplicationTo = Arrays.asList( 
  2.         "pulsar-shanghai"
  3.         "pulsar-beijing" 
  4. ); 
  5. Producer producer = client.newProducer() 
  6.         .topic("my-topic"
  7.         .create(); 
  8. producer.newMessage() 
  9.         .value("my-payload".getBytes()) 
  10.         .setReplicationClusters(restrictReplicationTo) 
  11.         .send(); 

3.3 Topic 級(jí)別啟動(dòng)

要讓一個(gè) Topic 能夠跨地域復(fù)制,要在 Topic 級(jí)別啟動(dòng):

bin/pulsar-admin topics set-replication-clusters --clusters pulsar-shanghai,pulsar-beijing,pulsar-guiyang my-tenant/my-namespace/Topic1

3.4 防止循環(huán)復(fù)制

如果配置了上海機(jī)房和北京機(jī)房之間的跨地域復(fù)制,那從上海機(jī)房復(fù)制到北京機(jī)房后,消息有沒(méi)有可能從北京機(jī)房再?gòu)?fù)制到上海機(jī)房呢?

當(dāng)然不會(huì)。上海機(jī)房發(fā)送消息到北京機(jī)房時(shí),會(huì)給消息加一個(gè) Property,用來(lái)表示是哪個(gè)機(jī)房生產(chǎn)的數(shù)據(jù)。北京機(jī)房收到這個(gè)數(shù)據(jù)后,就會(huì)知道是從別的機(jī)房復(fù)制來(lái)的,Replicator 中的 Cursor 在訂閱消息時(shí)就會(huì)把這部分消息過(guò)濾掉。

總結(jié) 

一句話概括,Pulsar 的跨地域復(fù)制,其實(shí)就是在一個(gè)本地集群中創(chuàng)建一個(gè) Producer,把異地的集群作為這個(gè) Producer 的發(fā)送地址,將本地集群的消息發(fā)送過(guò)去,并且在本地維護(hù)一個(gè) Cusor 來(lái)保證消息可靠性和冪等性。

 

責(zé)任編輯:武曉燕 來(lái)源: 程序員jinjunzhu
相關(guān)推薦

2022-02-28 11:10:42

ZGCG1收集器

2022-07-11 11:06:11

RocketMQ函數(shù).消費(fèi)端

2022-07-04 11:06:02

RocketMQ事務(wù)消息實(shí)現(xiàn)

2021-05-18 06:55:07

Java AQS源碼

2024-01-05 07:55:39

Linux虛擬內(nèi)存

2025-06-10 04:11:00

2021-01-20 06:02:24

數(shù)據(jù)分析驅(qū)動(dòng)

2021-07-04 22:27:42

存儲(chǔ)BookKeeper系統(tǒng)

2023-07-26 00:40:25

AI工具備忘錄

2021-08-15 18:59:13

垃圾收集器JDK

2020-11-27 06:28:55

Spring循環(huán)依賴

2022-04-11 11:55:34

架構(gòu)技術(shù)調(diào)優(yōu)

2020-10-16 06:30:45

分布式場(chǎng)景方案

2022-06-13 11:05:35

RocketMQ消費(fèi)者線程

2023-04-11 08:35:22

RocketMQ云原生

2022-06-11 18:15:26

KubernetesDockerLinux

2021-04-25 10:45:59

Docker架構(gòu)Job

2024-07-03 08:28:44

HWKafkaLEO

2024-02-06 08:36:54

2018-01-23 16:48:47

AI
點(diǎn)贊
收藏

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