<noframes id="vddlx"><form id="vddlx"><nobr id="vddlx"></nobr></form>

    <noframes id="vddlx">
    <listing id="vddlx"><nobr id="vddlx"><meter id="vddlx"></meter></nobr></listing>
    <form id="vddlx"><th id="vddlx"><progress id="vddlx"></progress></th></form><em id="vddlx"></em>

      
      

      <listing id="vddlx"><listing id="vddlx"><menuitem id="vddlx"></menuitem></listing></listing>

        <span id="vddlx"></span>

          訂閱狀態的復制?跨機房同步下如何應用

          技術標簽: java  大數據  數據庫  kafka  分布式

          在 Pulsar 里,可以基于 geo-replication 將數據在多個機房進行復制,這個特性主要是復制的消息數據,而今天我們分享的主要是訂閱狀態的跨機房同步。

          訂閱狀態主要指訂閱的消費進度,開啟訂閱狀態跨機房復制可以在其中某個機房出現故障時,consumer 切換其他機房可以根據消費進度繼續進行消費,這樣可以減少消息的重復消費以及consumer丟失消息的問題。

          在正式開始之前,先來回顧一下近期的 Pulsar 動態。

          上周回顧

          StreamNative Cloud 功能已發布,你可以在 StreamNative 官網進入 cloud 頁面相關,進行下載和創建集群等。更多詳情參考文章??開源流數據公司 StreamNative 推出 Pulsar 云服務,推進企業“流優先”進程

          本周三(即今晚 8-9 點),將會舉行一場 Pulsar Community Meeting,有 Apache Pulsar 的 PMC 和眾多 contributor 共同參與,主要是分享一些近期 Apache Pulsar 的安排和計劃,共同探討關于 Apache Pulsar 的使用與實踐等等。

          如果你是 Pulsar 的 contributor,也歡迎參與到此次交流會中,分享你對 Pulsar 的使用和建議等等,更多參會詳情和討論可以參考下方鏈接。
          https://github.com/streamnative/pulsar-community-loc-cn/issues/1

          在之后 2.7.0 版本中,正在測試加入這些功能:

          • Topic Level Policy 層面:

            • Support MaxUnackedMessagesOnConsumer on topic level

            • Support Persistence Policies on topic level

            • Support deduplication on topic level

          • Transaction Support 層面:

            • Transaction message consumption

            • Transaction message acknowledgement


          Geo replication
          跨地域復制

          在 2.4.0 版本之后,Pulsar 加入了 geo replication 特性。如下圖所示,三個 cluster 都有 Topic T1 存在,他們的數據會互相之間進行復制。

          也就是說 producer 可以連接到任意一個 Topic T1 去寫數據,比如數據在集群 A 寫入數據,那么也會往 B 和 C 集群同步,其他同理。假設三個集群不在同一個地方,通過 geo-replication 特性,就可以完成跨地域復制同時提高消息容災能力。

          關于如何配置 geo cluster,可以參考下方鏈接。
          http://pulsar.apache.org/docs/en/administration-geo/

          在上圖中,consumer 也可以連接到任意集群中,同時共用 Subscription S1。如果說沒有進行訂閱狀態復制的話,上圖中兩個集群里的 Subscription S1 只是名字相同,而并不是同一個 Subscription。這樣就會導致切換集群時消費進度無法同步,導致consumer消費多余的數據。

          Replicated subscription
          訂閱狀態復制

          訂閱狀態復制解決的問題主要是將兩個集群中 topic 里的訂閱進行狀態同步,相當于你在下載電腦游戲時,中間休眠/斷網后重新下載時,是接著之前的進度進行的,而不是重新又從頭下載。

          在真正講解「訂閱模式復制狀態」前,我們需要了解幾個概念。

          首先是 Message ID,這個在我們第一次 TGIP-CN 的分享里有提到過。Message ID 字段一般由這幾個:ledger-id(在哪個 segment)、entry-id(entry 在這個 segment 的位置)、batch-id(消息被匹配后的位置)、partition-index(消息在 topic 的哪個 partition)構成。

          其次是 Message Acknowledgment(消息簽收),Pulsar 目前支持兩種簽收方式:單條逐一簽收和累積簽收。累積簽收的操作比較簡單,但是單條簽收的話需要對 broker 的狀態進行保存。

          比如連續簽收了 0、1、2、3、4,那么就會在 4 上標記“Mark delete position”,6 和 9 單獨簽收了,也會進行標記。這種狀態都可以被記錄到 ledger 中,方便后續數據的恢復。

          訂閱復制其實就是對 message 簽收狀態的一些復制,也就是關系到 「Mark delete position」和單獨簽收的復制。

          上圖是在同一個 topic 里,集群 A 和集群 B 的 Message ID 列舉。比如在集群 A 里寫入的 Message ID 為(1,0),復制到集群 B 時當前 topic 所用的 Message ID 就變成了(3,0)。

          那么如何解決不同集群中 Message ID 對應關系呢?目前我們采用的做法是定期做 cursor snapshot,即定期查看一下多個集群中 Message ID 的對應關系。

          >>> Cursor snapshot 流程

          Cursor snapshot 會從一個集群中,定期發起`ReplicatedSubscriptionsSnapshotRequest`的指令,從一個時間點發起發給不同的集群。這個請求一般會包含這個 `snapshot_id` 和 `source_cluster` 兩個信息。 

          當集群 B 和 C 收到請求后,會給集群 A 返回 `ReplicatedSubscriptionsSnapshotResponse`指令,這時會回給集群 A,告訴它當前集群的 ledger ID 和 entry ID(Message ID 包含的信息)。集群 A 就會根據 B 和 C 返回的消息來確定他們相對應的 Message ID 關系。

          當知道了集群間對應 Message ID 后,集群 A 也需要把 snapchat 對應結果的狀態傳遞給其他集群。不管是 request 還是 response 以及最后 snapshot 結果,都是與 topic 數據存儲在一起的。

          0、1、2 等數字這些是 topic 里的消息,標記 S 的位置并不是消息,而是一種標記。它可以是 request 的標記,也可以是 response 的標記等。

          這樣的好處是在跨地域復制中,數據和標記都可以復制同步到其他集群中。相當于利用消息復制的機制,達到傳遞消費進度狀態的目的。

          記錄完成以后,后續的更新狀態如何記錄呢?總不能一直不變吧。

          當其中某一個集群 ack 速度超過了當前 snapshot 進度,對于正在連接的集群,就可以發起`ReplicatedSubscriptionUpdate`指令,通知其他集群「xxx 更新了,準備作戰」的狀態。

          這時其他集群就可以接收到此次更新他們各自需要更新的信息,會進行相應地修改,達到同步狀態的特性。

          如何設置訂閱狀態復制

          在 Pulsar 中,當創建 consumer 時,默認是不會開啟「訂閱狀態復制」這個特性的,你需要在 broker 中利用 `enableReplicatedSubscriptions=true` 指令來開啟這個特性。同時在創建 consumer 時將 `replicateSubscriptionState( )`改為 ture。

          開啟后也可以通過設置一些指令來控制「訂閱狀態復制」時的一些行為,如下圖所示。

          不足

          ???? 由于 cursor snapshot 是定期進行的,在時間上精確度不會太高,多少有些偏差。

          ???? 目前只會同步“Mark delete position”的位置,對于單獨簽收的消息暫時無法同步。

          ???? 只有在所有相關集群都處于「可用」狀態時,才可以進行 cursor snapshot。

          ???? 當使用 cursor snapshot 后,會產生一些緩存,影響到后續涉及 backlog 的計算結果。

          Q&A

          Q:國內云廠也可以提供 Pulsar 服務么?

          A:目前我們的云服務是基于 Google Cloud 的,下一步目標計劃就是會適應國內云廠商的一些平臺,比如阿里云、騰訊云等。

          Q:有 Pulsar transaction 相關的介紹么?2.7.0 預計什么時候正式發布?

          A:我們將在 10 月份會發布 Pulsar transaction 的預覽版。2.7.0 版本的話預計也在 10 月份左右發布吧。敬請期待!

          總結

          本次分享主要針對 Pulsar 中「訂閱狀態復制」進行了一些操作和概念上的分享,希望通過本次分享,大家可以對相關知識有了更清晰的理解。更多細節回放可查看下方視頻。

          本周末 TGIP-CN,我們將邀請到 BIGO 大數據平臺的陳航,為我們分享關于 Apache Pulsar 在 BIGO 的一些實踐。詳情可掃描下方二維碼進行報名~

          ???? 相關閱讀

          ?? 來咯!Pulsar 2.6.1 版本發布前瞻

          ?? Pulsar namespace 策略的簡單小介紹

          ?? Pulsar 如何應用到數據查詢中

          版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
          本文鏈接:https://blog.csdn.net/zhaijia03/article/details/109766588

          智能推薦

          如何實現tm同時監控多個狀態的改變_廣電機房監控系統【斯必得智慧機房】

          廣電機房監控系統是根據廣電的業務需求研發的,廣電機房動力環境監控系統需要檢測的機房分部多、大小不一、而且廣電的機房是集中監控所以有一套機房監控系統是尤為的重要。 廣電機房監控系統功能 1.實時監控數據中心機房的供配電信息、精密空調末端信息、溫濕度、漏水等環境參數,可通過局域網上傳至統一網管監控機房(中心),實現統一監管。 2.系統監測到某參數超過安全閥值時,能提供界面報警、多媒體語音報警、短信報警...

          如何復制標準的gui狀態欄

          背景: 在ABAP開發中, 怎么樣復制gui的狀態欄位到我們的應用程序中。 解決方案 輸入事物代碼SE41; 2.輸入標準的SAPLKKBL程序; 3 然后從用戶接口->復制->狀態進入 4. 注意事項:以下復制后一定要**。 以下是對整個SAP程序**方法。...

          安裝ps時無法驗證訂閱狀態_Mac應用無法打開或文件損壞的處理方法

          MacOS 系統在 10.12 版本中,啟用了新的安全機制。默認情況下,只會信任在 App Store 下載的軟件和擁有開發者 ID 簽名的應用程序。簡單理解就是,您想使用的程序,必須得通過 Apple 公司的審查機制。否則,您就沒辦法使用。Apple 這么做不是為了限制您的使用哦,而是,為了我們的系統安全做的考量。 例如:作者在安裝 qshell 時,就報了 “ 無法驗證開...

          SqlServer 禁止架構更改的復制中手動修復使發布和訂閱中分別增加的字段同步

          由于之前的需要,禁止了復制架構更改,以至在發布中添加一個字段,并不會同步到訂閱中,而現在又在訂閱中添加了一個同名字段,怎么使這發布和訂閱的兩個字段建立同步關系呢? 下面就測試更改:此次發布類型為事務復制的可更新訂閱,其他類型的發布沒有測試。 首先建立事務復制的可更新訂閱,建立好之后。 在發布創建一張測試表: [sql] view plain copy CREATE T...

          專訪高德地圖開放平臺的負責人童遙:跨機房同步和多路寫入Redis集群方案將得到充分發展...

          杭州·云棲大會將于2016年10月13-16日在云棲小鎮舉辦,在這場標簽為互聯網、創新、創業的云計算盛宴上,眾多行業精英都將在這幾天里分享超過450個演講主題。 為了幫助大家進一步了解這場全球前言技術共振盛會的內容,云棲社區采訪了各個論壇的大咖,以饗讀者。 以下為正文: 童遙,高德地圖開放平臺的負責人,也在負責高德在線服務的研發工作。 關于本次云棲大會的分享內容,童謠表示,高德地圖既...

          猜你喜歡

          分布式系統各個節點狀態如何同步?淺談一下

          寫在前面:2020年面試必備的Java后端進階面試題總結了一份復習指南在Github上,內容詳細,圖文并茂,有需要學習的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master 一:簡介 分布式系統(distributed system)正變得越來越重要,大型網站幾乎都是分布式的。 分布式系統的最大難點...

          idea安裝tomcat之后進行間的測試,tomcat運行成功,網頁出現404錯誤

            項目場景: idea成功安裝tomcat之后,進行簡單的測試,tomcat運行成功,頁面出現404錯誤 問題描述:   原因分析: 運行tomcat成功之后,自動或者手動打開頁面,ip出現的問題,Application contest后面的是ip的項目路徑(別名),localhost:8080/項目路徑,但是訪問項目的默認路徑與Application contest里面的路...

          SAP調用接口通過PI的方式向外圍系統傳送數據配置

          在創建SAP下傳外圍系統的時候,相關的配置已經完成,但是發現發送給外圍系統的數據都是空的,經過檢查發現,MM調用的都是SAP方的字段,如下圖: 上面這張圖是修改后的,原先錯誤的問題在于,左邊是SAP端對應的MT下的字段,然后右邊外圍系統端對應的也是SAP端的MT下面的字段,這就直接導致了雖然程序運行了,但是數據并沒有發送出去。 經過處理之后就是如上圖所示,如果走的是webservice SOAP協...

          為什么越來越多的年輕人喜歡獨處?

          為什么你更愿意一個人生活? “一個人,吃自己喜歡的食物,睡自己喜歡睡的位置,走自己喜歡的小路,養自己喜歡的寵物。不用遷就,不用發愁,偶爾休息一天宅在家很舒服。室友之間泛泛無謂,朋友一年見幾回,家人電話也常給。說我自私也好,說我薄情也罷,但是確實,我一個人的生活,比任何時候都精彩。” 這是網友對這個問題的一段回答,這么短短幾句話,不知說出了現在多少年輕人的心聲。 在網絡上,時...

          聯想小新Air14 銳龍 換屏

          聯想小新Air14 銳龍版 將45%色域屏幕換成72色域 屏幕是某寶的72%色域屏幕,品牌是友達產的LG屏幕 顯示效果非常好(是鏡面的,顏色很好) 聯想小新Air14的原裝屏幕是膠帶粘在A面的殼子上的,所以買屏幕的時候要問商家要兩根膠帶,2塊錢。 下面介紹具體的拆裝屏幕教程: 步驟一: 先要注意,電腦要關機,移除外接電源。 電商會隨屏幕贈送一個藍色的撥片, 將吸盤吸住D面的中間部分,然后向上用力提...

          贊助商廣告

          相關文章

          熱門文章

          推薦文章

          相關標簽

          亚洲中文字幕A∨在线

          <noframes id="vddlx"><form id="vddlx"><nobr id="vddlx"></nobr></form>

            <noframes id="vddlx">
            <listing id="vddlx"><nobr id="vddlx"><meter id="vddlx"></meter></nobr></listing>
            <form id="vddlx"><th id="vddlx"><progress id="vddlx"></progress></th></form><em id="vddlx"></em>

              
              

              <listing id="vddlx"><listing id="vddlx"><menuitem id="vddlx"></menuitem></listing></listing>

                <span id="vddlx"></span>