簡體   English   中英

以降低彈性為代價經濟高效地運行 Kafka

[英]Running Kafka cost-effectively at the expense of lower resilience

假設我有一個便宜但不太可靠的數據中心 A,以及一個昂貴但更可靠的數據中心 B。我想以最具成本效益的方式運行 Kafka,即使這意味着冒着數據丟失和/或停機的風險。 我可以在任一數據中心運行任意數量的代理,但請記住,成本需要盡可能低。

對於這種情況,假設如果代理不運行則不會產生任何費用。 還假設生產者/消費者完全可靠地運行而不用擔心他們的成本。

我有兩個想法如下:

  1. 提供兩個完全獨立的 Kafka 集群,每個數據中心一個,但讓更昂貴的數據中心 (B) 中的集群保持關閉狀態。 在檢測到 A 中的中斷后,啟動 B 中的集群。生產者/消費者將具有在集群之間切換的邏輯。
  2. 在 B 中運行 Zookeeper 集群,在 A 中啟動代理,在 B 中關閉代理。如果 A 中出現中斷,那么 B 中的代理會聯機從 A 停止的地方接手。

選項 1 會更便宜,但需要生產者/消費者更加復雜。 選項 2 會更昂貴,但對生產者/消費者的復雜性要求較低。

選項 2 甚至可能嗎? 如果 A 中出現中斷,是否有任何方法可以讓 B 中的代理上線,被選為主題的領導者並讓生產者/消費者無縫地開始向他們發送消息? 同樣,數據丟失是正常的,切換停機時間也是正常的。 但是無論選擇什么,都不需要人工干預。

我可以考慮其他方法嗎?

兩者都不可行。

主題及其記錄對於每個集群都是唯一的。 集群中的任何 Kafka 分區只能存在一個領導分區。

有了這兩條信息,示例場景包括:

  • 生產者切換到一個新的集群,並找到新的領導者,直到舊集群回來
  • 即使以上可能立即發生,或者重試次數最少,消費者也有責任從哪里讀取? 他們無法在任何時候聚合來自多個bootstrap.servers的數據。
  • 因此,現在您遇到了兩個集群始終都需要可用的情況,另一個集群中存在 N 個分區的 N 個消費者線程,以及原始集群中的 M 個線程
  • 同時,生產者重新寫入適當的(更便宜的)集群,因此數據可能會亂序,因為您無法控制哪些消費者線程首先處理哪些數據。
  • 只有在您跟蹤來自更昂貴的集群消費者的消費者滯后之后,您才能合理地停止這些線程並在所有消費者達到零滯后時關閉該集群

另一件要記住的事情是,主題創建/更新/刪除事件不會自動跨集群同步,因此 Kafka Streams 應用程序,尤其是,將無法使用這種方法維護 state。


您可以使用 MirrorMaker 或 Confluent Replicator / Cluster Linking 等工具來幫助完成所有這些,但我個人從未見過客戶端故障轉移部分處理得很好,尤其是當記錄順序和冪等處理很重要時


最終,這就是可用性區域的用途。 據我了解,雲提供商一次丟失多個可用區的可能性非常小。 因此,您需要跨 3 個或更多可用性區域設置一個 Kafka 集群,並為 Kafka 配置“機架感知”以說明其安裝位置。

如果您想在不運行時保持目標/被動集群關閉然后啟動集群,如果您不需要任何歷史記錄並且不關心源集群中的消費者滯后差距.. obv 使用視情況而定。

MM2 或任何類型的異步定向復制要求集群始終處於活動狀態。

Stretch cluster 並不是真正可行的 2 dc 事物的 b/c,無論是 raft 還是 zk,你都需要第三個 dc,這可能是你最昂貴的選擇。

Redpanda 具有將所有日志段卸載到 s3 的能力,然后對它們進行索引以允許它們用於其他集群,因此如果您不斷地將日志段的一個副本寫入具有 s3 接口的備用 DC 存儲陣列,則可能是可口的。 然后,無論何時需要,您只需在目標 dc 中按需啟動一個集群並將其指向 object 商店,您就可以立即開始生產並與您的新客戶一起消費。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM