阿里雲消息隊列 Kafka 生態集成的實踐與探索

消息隊列 Kafka 簡介

Apache Kafka是一個分佈式流平臺,作爲互聯網領域不可或缺的消息組件,在全球獲得了廣泛的應用。在使用過程中,Kafka一般被作爲消息流轉的核心樞紐,上下游系統通過Kafka實現異步,削峯填谷。在大數據處理和實時數據處理領域Kafka也是不可替代的組件。

Kafka使用非常廣泛,在有些領域使用已經非常成熟,如日誌收集,大數據處理,數據庫等領域。Kafka跟上下游也有標準化的對接模塊,如日誌收集有Flume,Filebeat,Logstash,大數據處理有spark,flink等組件。同時在一些小衆的領域則沒有現成的工具可以直接對接,如對接某個小衆的數據庫,或者用戶自己定製化的系統。這時一般的對接方法是自行開發Kafka生產消費程序對接。

在不同系統對接時通常會遇到以下問題:

  • 公司的不同團隊對同一個系統有對接需求,各自開發重複造輪子,且實現方式不一,升級運維成本高。
  • 各子系統由不同的團隊開發,因此,各系統中的數據在內容和格式上,存在天然的不一致性,需要進行格式處理,以消除各系統數據之間格式的不同。

基於Kafka使用的廣泛度和上下游系統的多樣性考慮,Kafka推出了內置的上下游系統對接框架Kafka Connect。

Kafka Connect 介紹

Kafka Connect是一個用於將數據流輸入和輸出Kafka的框架。下面介紹connector的一些主要概念:

  • Connectors:通過管理task來協調數據流的高級抽象
  • Tasks:如何將數據複製到Kafka或從Kafka複製數據的實現
  • Workers:執行Connector和Task的運行進程
  • Converters:用於在Connect和外部系統發送或接收數據之間轉換數據的代碼
  • Transforms:更改由連接器生成或發送到連接器的每個消息的簡單邏

Connectors

Kafka Connect中的connector定義了數據應該從哪裏複製到哪裏。connector實例是一種邏輯作業,負責管理Kafka與另一個系統之間的數據複製。

connector有一些開源的實現。同時用戶也可以從頭編寫一個新的connector插件,編寫流程一般如下:

Tasks

Task是Connect數據模型中的主要處理數據的角色。每個connector實例協調一組實際複製數據的task。通過允許connector將單個作業分解爲多個task,Kafka Connect提供了內置的對並行性和可伸縮數據複製的支持,只需很少的配置。這些任務沒有存儲任何狀態。任務狀態存儲在Kafka中的特殊主題config.storage.topic和status.storage.topic中。因此,可以在任何時候啓動、停止或重新啓動任務,以提供彈性的、可伸縮的數據管道。

Task再平衡

當connector首次提交到集羣時,workers會重新平衡集羣中的所有connector及其tasks,以便每個worker的工作量大致相同。當connector增加或減少它們所需的task數量,或者更改connector的配置時,也會使用相同的重新平衡過程。當一個worker失敗時,task在活動的worker之間重新平衡。當一個task失敗時,不會觸發再平衡,因爲task失敗被認爲是一個例外情況。因此,失敗的task不會被框架自動重新啓動,應該通過REST API重新啓動。

Converters

在向Kafka寫入或從Kafka讀取數據時,Converter是使Kafka Connect支持特定數據格式所必需的。task使用轉換器將數據格式從字節更改爲連接內部數據格式,反之亦然。

默認提供以下converters:

  • AvroConverter:與Schema Registry一起使用;
  • JsonConverter:適合結構數據;
  • StringConverter:簡單的字符串格式;
  • ByteArrayConverter:提供不進行轉換的“傳遞”選項;

轉換器與連接器本身解耦,以便在連接器之間自然地重用轉換器。

Transforms

Connector可以配置轉換,以便對單個消息進行簡單且輕量的修改。這對於小數據的調整和事件路由十分方便,且可以在connector配置中將多個轉換鏈接在一起。

開源問題

Kafka connect線下單獨部署時,設計的很不錯了,但作爲一個雲服務提供時,還是存在了不少的問題,主要體現在以下幾點:

  • 與雲服務的集成度不好:雲廠商有不少閉源產品,對於開源產品的雲託管版也會有訪問控制等問題。
  • 佔用Kafka集羣資源:每個connector任務都需要三個內置元信息topic,佔用雲產品資源,對於元信息topic的誤操作也會導致任務異常。
  • 運維管控接口和監控簡單:管控接口沒法控制運行資源粒度,監控缺少connector任務維度的指標。
  • 與雲原生架構結合不好:架構初始設計並非雲原生,任務之間隔離度不夠,負載均衡算法簡單,沒有動態自平衡能力。

基於Kafka connect部署在雲上的種種問題,消息隊列Kafka團隊在兼容原生kafka connect框架的前提下,以雲原生的方式重新實現了Kafka connect模塊。

阿里雲消息隊列 Kafka Connect 解決方案

阿里雲消息隊列Kafka Connect框架介紹

架構設計將控制面和運行面分開,通過數據庫和Etcd進行任務分發和模塊通信。底層運行環境採用K8S集羣,更好的控制了資源的粒度和隔離程度,整體架構圖如下:

該架構在很好的解決了Apache Kafka Connect模塊在雲上遇到的問題:

  • 與雲服務的對接:運行環境部署時默認網絡打通,運行面打通了訪問控制模塊;
  • 佔用Kafka集羣資源:元信息採用數據庫和Etcd存儲,不佔用Kafka topic資源;
  • 運維管控接口增強:增強了資源層面的管控Api,可以精細化的控制每個任務的運行資源;
  • 監控指標增強:任務維度全鏈路運行時metrics收集,監控數據從流入到流出的不同階段的運行情況,出現問題是及時定位問題;
  • 雲原生架構設計:控制面統籌全局資源,實時監測集羣負載,並能夠自動完成負載均衡,失敗重啓,異常漂移等運維操作;

阿里雲Kafka Connect介紹

阿里雲消息隊列Kafka已經支持的Connector類型如下:

涵蓋了數據庫,數據倉庫,數據檢索和報表,告警系統,備份需求這些主流的使用場景。

根據不同場景的實際需求,阿里雲消息隊列Kafka Connect主要兩種實現方式:

1. 通過擴展Kafka Connect框架,完成外部系統與Kafka的直接對接。

2. 對於需要數據處理的任務類型,通過Kafka->函數計算(下簡稱fc)->外部系統的,在fc上可以靈活的定製化處理邏輯。

具體connect的實現方式如下:

數據庫

數據庫之間備份一般不會走kafka,msyql->kafka一般都是爲了將數據分發給下游訂閱,在mysql數據有變更時作出告警或這其他響應,鏈路mysql->kafka->訂閱程序->告警/變更其他系統。

數據倉庫

數據倉庫阿里雲上常用的是maxCompute,任務特點是吞吐量大,也有數據清洗需求,一般流程爲kafka->maxCompute,然後maxCompute內部任務進行數據轉換。也可以在入maxCompute之前進行數據清洗,鏈路一般爲kafka->flink->maxCompute。對於數據轉換簡單或者數據量小的任務,可以使用函數計算替換flink,鏈路爲kafka->fc->maxCompute。

數據檢索和報表

通用的數據檢索和報表一般通過es,數據傳入es前需要做清洗處理,適合的路徑kafka->flink->es/kafka->fc->es。

告警系統

告警系統中使用kafka一般流程 前置模塊->kafka->訂閱程序->告警模塊,這種最好的方式是 前置模塊->kafka->fc->告警。

備份需求

有些數據可能需要定期歸檔,做長期保存,oss是一個不錯的介質,這種場景一般只需要保存原屬數據,所以好的方式可能是kafka->oss。如果數據需要處理,可以通過Kafka->fc->oss鏈路。

阿里雲消息隊列 Kafka 生態規劃

消息隊列Kafka當前支持的connect都採用自研新架構獨立開發,對於主流的使用場景已經有了不錯的覆蓋,但同時也可以看到,Kafka生態發展非常迅猛,Kafka的使用場景也越來越多,開源Kafka connect也在不斷的發展,下一步消息隊列Kafka會對接開源Kafka connect,讓開源Kakfa connect可以無需修改,無縫的運行在自研的架構上。

總結

Kafka在互聯網架構中已經佔據了重要的位置,同時也在積極往上下游拓展,除了Kafka connect,還有Kafka Streams,Ksql,Kafka Rest Proxy等模塊也在不斷完善和成熟,相信在後續的發展中,Kafka在軟件架構中會扮演越來越多的重要角色。

作者:塵輝

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章