日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

請注意,你的 Pulsar 集群可能有刪除數據的風險

來源: 責編: 時間:2024-01-09 08:52:21 234觀看
導讀在上一篇 Pulsar3.0新功能介紹中提到,在升級到 3.0 的過程中碰到一個致命的問題,就是升級之后 topic 被刪除了。正好最近社區也補充了相關細節,本次也接著這個機會再次復盤一下,畢竟這是一個非常致命的 Bug。圖片現象先來

在上一篇 Pulsar3.0新功能介紹中提到,在升級到 3.0 的過程中碰到一個致命的問題,就是升級之后 topic 被刪除了。H0B28資訊網——每日最新資訊28at.com

正好最近社區也補充了相關細節,本次也接著這個機會再次復盤一下,畢竟這是一個非常致命的 Bug。H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

現象

先來回顧下當時的情況:升級當晚沒有出現啥問題,各個流量指標、生產者、消費者數量都是在正常范圍內波動。H0B28資訊網——每日最新資訊28at.com

事后才知道,因為只是刪除了很少一部分的 topic,所以從監控中反應不出來。H0B28資訊網——每日最新資訊28at.com

早上上班后陸續有部分業務反饋應用連不上 topic,提示 topic nof found.H0B28資訊網——每日最新資訊28at.com

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'Producer': Invocation of init method failed; nested exception is org.apache.pulsar.client.api.PulsarClientException$TopicDoesNotExistException: Topic Not Found.

因為只是部分應用在反饋,所以起初懷疑是 broker 升級之后導致老版本的 pulsar-client 存在兼容性問題。H0B28資訊網——每日最新資訊28at.com

所以我就拿了平時測試用的 topic 再配合多個老版本的 sdk 進行測試,發現沒有問題。H0B28資訊網——每日最新資訊28at.com

直到這一步還好,至少證明是小范故障。H0B28資訊網——每日最新資訊28at.com

因為提示的是 topic 不存在,所以就準備查一下 topic 的元數據是否正常。H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

查詢后發現元數據是存在的。H0B28資訊網——每日最新資訊28at.com

之后我便想看看提示了 topic 不存在的 topic 的歸屬,然后再看看那個 broker 中是否有異常日志。H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

發現查看歸屬的接口也是提示 topic 不存在,此時我便懷疑是 topic 的負載出現了問題,導致這些 topic 沒有綁定到具體的 broker。H0B28資訊網——每日最新資訊28at.com

于是便重啟了 broker,結果依然沒有解決問題。H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

之后我們查詢了 topic 的 internal state 發現元數據中會少一個分區。H0B28資訊網——每日最新資訊28at.com

緊急恢復

我們嘗試將這個分區數恢復后,發現這個 topic 就可以正常連接了。H0B28資訊網——每日最新資訊28at.com

于是再挑選了幾個異常的 topic 發現都是同樣的問題,恢復分區數之后也可以正常連接了。H0B28資訊網——每日最新資訊28at.com

所以我寫了一個工具遍歷了所有的 topic,檢測分區數是否正常,不正常時便修復。H0B28資訊網——每日最新資訊28at.com

void checkPartition() {      String namespace = "tenant/ns";      List<String> topicList = pulsarAdmin.topics().getPartitionedTopicList(namespace);      for (String topic : topicList) {          PartitionedTopicStats stats = pulsarAdmin.topics().getPartitionedStats(topic, true);          int partitions = stats.getMetadata().partitions;          int size = stats.getPartitions().size();          if (partitions != size) {              log.info("topic={},partitinotallow={},size={}", topic, partitions, size);              pulsarAdmin.topics().updatePartitionedTopic(topic, partitions);          }     }}

排查

修復好所有 topic 之后便開始排查根因,因為看到的是元數據不一致所以懷疑是 zk 里的數據和 broker 內存中的數據不同導致的這個問題。H0B28資訊網——每日最新資訊28at.com

但我們查看了 zookeeper 中的數據發現一切又是正常的,所以只能轉變思路。H0B28資訊網——每日最新資訊28at.com

之后我們通過有問題的 topic 在日志中找到了一個關鍵日志:H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

以及具體的堆棧。H0B28資訊網——每日最新資訊28at.com

此時具體的原因已經很明顯了,元數據這些自然是沒問題;根本原因是 topic 被刪除了,但被刪除的 topic 只是某個分區,所以我們在查詢 internalState 時才發發現少一個 topic。H0B28資訊網——每日最新資訊28at.com

通過這個刪除日志定位到具體的刪除代碼:H0B28資訊網——每日最新資訊28at.com

org.apache.pulsar.broker.service.persistent.PersistentTopic#checkReplication

圖片圖片H0B28資訊網——每日最新資訊28at.com

原來是這里的  configuredClusters 值為空才導致的 topic 調用了 deleteForcefully()被刪除。H0B28資訊網——每日最新資訊28at.com

而這個值是從 topic 的 Policy 中獲取的。H0B28資訊網——每日最新資訊28at.com

復現問題

通過上圖中的堆棧跟蹤,懷疑是重啟  broker 導致的 topic unload ,同時 broker 又在構建 topic 導致了對 topicPolicy 的讀寫。H0B28資訊網——每日最新資訊28at.com

最終導致 topicPolicy 為空。H0B28資訊網——每日最新資訊28at.com

只要寫個單測可以復現這個問題就好辦了:H0B28資訊網——每日最新資訊28at.com

@Test    public void testCreateTopicAndUpdatePolicyConcurrent() throws Exception {        final int topicNum = 100;        final int partition = 10;        // (1) Init topic        admin.namespaces().createNamespace("public/retention");        final String topicName = "persistent://public/retention/policy_with_broker_restart";        for (int i = 0; i < topicNum; i++) {            final String shadowTopicNames = topicName + "_" + i;            admin.topics().createPartitionedTopic(shadowTopicNames, partition);        }        // (2) Set Policy        for (int i = 90; i < 100; i++) {            final String shadowTopicNames = topicName + "_" + i;            CompletableFuture.runAsync(() -> {                while (true) {                    PublishRate publishRate = new PublishRate();                    publishRate.publishThrottlingRateInMsg = 100;                    try {                        admin.topicPolicies().setPublishRate(shadowTopicNames, publishRate);                    } catch (PulsarAdminException e) {                    }                }            });        }        for (int i = 90; i < 100; i++) {            final String shadowTopicNames = topicName + "_" + i;            CompletableFuture.runAsync(() -> {                while (true) {                    try {                        admin.lookups().lookupPartitionedTopic(shadowTopicNames);                    } catch (Exception e) {                    }                }            });        }        admin.namespaces().unload("public/retention");        admin.namespaces().unload("public/retention");        admin.namespaces().unload("public/retention");        Thread.sleep(1000* 5);        for (int i = 0; i < topicNum; i++) {            final String shadowTopicNames = topicName + "_" + i;            log.info("check topic: {}", shadowTopicNames);            PartitionedTopicStats partitionedStats = admin.topics().getPartitionedStats(shadowTopicNames, true);            Assert.assertEquals(partitionedStats.getPartitions().size(), partition);        }    }

同時還得查詢元數據有耗時才能復現:H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

只能手動 sleep 模擬這個耗時H0B28資訊網——每日最新資訊28at.com

具體也可以參考這個 issue https://github.com/apache/pulsar/issues/21653#issuecomment-1842962452H0B28資訊網——每日最新資訊28at.com

此時就會發現有 topic 被刪除了,而且是隨機刪除的,因為出現并發的幾率本身也是隨機的。H0B28資訊網——每日最新資訊28at.com

圖片圖片H0B28資訊網——每日最新資訊28at.com

這里畫了一個流程圖就比較清晰了,在 broker 重啟的時候會有兩個線程同時topicPolicy 進行操作。H0B28資訊網——每日最新資訊28at.com

在 thread3 讀取 topicPolicy 進行判斷時,thread2 可能還沒有把數據準備好,所以就導致了 topic 被刪除。H0B28資訊網——每日最新資訊28at.com

修復

圖片既然知道了問題原因就好修復了,我們只需要把 thread3 和 thread2 修改為串行執行就好了。H0B28資訊網——每日最新資訊28at.com

這也是處理并發最簡單高效的方法,就是直接避免并發;加鎖、隊列啥的雖然也可以解決,但代碼復雜度也高了很多,所以能不并發就盡量不要并發。H0B28資訊網——每日最新資訊28at.com

但要把這個修復推送到社區上游主分支最好是要加上單測,這樣即便是后續有其他的改動也能保證這個 bug 不會再次出現。H0B28資訊網——每日最新資訊28at.com

之后在社區大佬的幫助下完善了單測,最終合并了這個修復。H0B28資訊網——每日最新資訊28at.com

再次證明寫單測往往比代碼更復雜,也更花費時間。H0B28資訊網——每日最新資訊28at.com

PR:https://github.com/apache/pulsar/pull/21704H0B28資訊網——每日最新資訊28at.com

使用修復鏡像

因為社區合并代碼再發版的周期較長,而我們又急于修復該問題;不然都不敢重啟 broker,因為每重啟一次都可能會導致不知道哪個 topic 就被刪除了。H0B28資訊網——每日最新資訊28at.com

所以我們自己在本地構建了一個修復的鏡像,準備在線上進行替換。H0B28資訊網——每日最新資訊28at.com

此時坑又來了,我們滿懷信心的替換了一個鏡像再觀察日志發現居然還有刪除的日志

本文鏈接:http://www.www897cc.com/showinfo-26-58958-0.html請注意,你的 Pulsar 集群可能有刪除數據的風險

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 一文搞定JMM核心原理

下一篇: 依賴Kafka的Go單元測試例解

標簽:
  • 熱門焦點
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • vivo TWS Air開箱體驗:真輕 臻好聽

    在vivo S15系列新機的發布會上,vivo的最新款真無線藍牙耳機vivo TWS Air也一同發布,本次就這款耳機新品給大家帶來一個簡單的分享。外包裝盒上,vivo TWS Air保持了vivo自家產
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • JavaScript 混淆及反混淆代碼工具

    介紹在我們開始學習反混淆之前,我們首先要了解一下代碼混淆。如果不了解代碼是如何混淆的,我們可能無法成功對代碼進行反混淆,尤其是使用自定義混淆器對其進行混淆時。什么是混
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 馮提莫簽約抖音公會 前“斗魚一姐”消失在直播間

    來源:直播觀察提起&ldquo;馮提莫&rdquo;這個名字,很多網友或許聽過,但應該不記得她是哪位主播了。其實,作為曾經的&ldquo;斗魚一姐&rdquo;,馮提莫在游戲直播的年代影響力不輸于現
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業從業者、長三角一體化擁護者”的微博用戶 @長三角行健者 發文表示,據經銷商集團反饋,小米汽車目前
Top 主站蜘蛛池模板: 沁水县| 顺平县| 兴国县| 黄石市| 博白县| 奉新县| 开化县| 合水县| 崇文区| 马山县| 梅河口市| 莎车县| 中牟县| 金秀| 衢州市| 仪陇县| 永吉县| 新乡市| 禹城市| 绵竹市| 成安县| 英德市| 安塞县| 祁门县| 海盐县| 鹰潭市| 仙居县| 托克逊县| 宁蒗| 左权县| 封开县| 赤壁市| 济南市| 武夷山市| 霍林郭勒市| 桐柏县| 台中县| 拉萨市| 连城县| 台东市| 旌德县|