無伺服器管道:將MySQL事件流傳輸到Knative Services - zhaw

banq發表於2019-08-15

我們最初的想法是利用資料庫觸發機制並編寫可以監聽這些事件並將它們釋出到Kafka匯流排的元件。實際上,我們開始編寫針對PostgreSQL的程式碼來實現這一目標,但後來我們遇到了Debezium專案,該專案基本上解決了同樣的問題,雖然不是在相同的上下文中,但是具有更成熟的程式碼庫和對多個資料庫系統的支援。重新發明輪子是沒有意義的,因此目標變成了如何最好地整合Debezium和Knative。

無伺服器管道:將MySQL事件流傳輸到Knative Services - zhaw經過一些閱讀和實驗,我們最終得到了圖1所示的解決方案。可以看出,它包含一個連線到Kafka Connect服務的MySQL資料庫; 這使用Debezium MySQL外掛Kafka匯流排上產生訊息; Knative的Apache Kafka事件源連線到其清單中指定的Kafka匯流排上的特定主題; 最後,Event Display列印出它從Apache Kafka事件源接收的訊息。
Kafka Connect--一個將外部系統連線到Kafka叢集的框架 - 透過外掛架構支援各種外掛,其中一個是Debezium。Debezium實際上包含多個外掛,每個外掛支援一個資料庫。在我們的例子中,我們使用了MySQL外掛,它透過標準埠與MySQL資料庫通訊,並在資料庫的二進位制日誌(binlog)上執行。binlog本質上是資料庫上發生的所有操作的有序記錄。Debezium聯結器篩選binlog,根據需要進行過濾,並從binlog檔案中的條目生成事件,然後將其傳輸到Kafka主題,為每個資料庫表建立一個新主題。
最後,為了使用新建立的主題中的訊息,我們利用Knative的Apache Kafka事件源,它提供了Knative和Kafka之間的整合,並且可以使用來自一個或多個Kafka主題的訊息。然後,它將訊息轉發給Knative服務(標準FaaS術語中的函式),該服務可以對資料庫更改起作用。在我們的例子中,我們有一個簡單的事件顯示服務,它只是將收到的事件轉儲到輸出。

部署MySQL
為簡單起見,我們將Docker映象用於Debezium提供的預先配置的MySQL伺服器(可在此處找到)並將其作為我們的Kubernetes叢集中的pod部署在新的名稱空間中。配置更改並不是那麼重要 - 必須啟用binlog支援並確保可以遠端訪問資料庫。有關所需配置的更多資訊,請在此處詳細說明。請注意,Debezium並未真正對資料庫託管位置施加約束; 例如,您可以使用自我管理或雲管理的MySQL例項,它可以同時與多個資料庫一起執行。Debezium還支援監控其他資料庫系統,如MongoDBPostgreSQLOracleSQL Server。

部署Kafka和Kafka Connect叢集
下一步是使用Debezium MySQL外掛部署Apache Kafka叢集和Kafka Connect叢集,以便使用MySQL伺服器中的事件。我們使用了Strimzi,它提供了一種簡單的方法來啟動和執行Kafka和Kafka Connect。具體來說,我們按照0.11.2版本的說明在同一名稱空間中部署Kafka和Kafka Connect。
Kafka提供了一個配置設定,用於控制在生產者嘗試寫入不存在的主題時是否可以自動建立主題。在標準的Strimzi Kafka配置中,預設情況下禁用此功能。這意味著Kafka Connect無法建立主題,因此無法監控我們的資料庫例項。為了解決這個問題,我們不得不在Kafka Strimzi清單中設定auto.create.topics.enable選項true。有關在此處向Kafka新增配置引數的更多資訊
在部署Kafka Connect時,我們使用了包含Debezium MySQL聯結器的定製Docker映象

Kafka Connect和Debezium​​​​​​​
如上所述,Kafka Connect使用用於MySQL的Debezium聯結器讀取MySQL資料庫的二進位制日誌 - 這將按照資料庫提交的相同順序記錄所有操作,包括更改表的模式或更改儲存在其中的資料表格。MySQL聯結器為binlog中的每個行級INSERT,DELETE和UPDATE操作生成更改事件。資料庫中每個表的更改事件將釋出到單獨的Kafka主題,另外一個主題用於記錄​​對資料庫模式的更改。
Kafka Connect公開了一個RESTful API,您可以透過它管理要監視的資料庫列表。要監視新資料庫,將/connectors使用JSON格式的必要配置對Kafka Connect的資源發出POST請求。這裡解釋 JSON配置。
此時,我們已準備好告訴Debezium監控我們的MySQL資料庫。我們向Kafka Connect REST API傳送了一個POST請求,其中包含有關資料庫的資訊,並獲得一個HTTP 201響應,指示請求已成功接受。
為了測試配置,我們監視Kafka Connect日誌以檢視它是從我們的資料庫例項接收資料,我們檢視了Kafka Connect建立的Kafka主題,以便在我們手動執行一些SQL INSERT,UPDATE和DELETE時看到正在生成訊息查詢。

使用Kafka事件源為Knative
隨著Kafka Connect / Debezium和Kafka的成立,我們準備將它連線到Knative。在撰寫本文時,我們使用了最新版本的Knative - v0.5,並按照這些說明進行安裝。
為了使用Debezium建立的Kafka主題中的訊息,我們使用了Knative的Apache Kafka事件源,它提供了Knative和Apache Kafka之間的整合。Kafka事件源是一個Knative資源,可以訂閱一個或多個Kafka主題並開始接收訊息。然後,它可以開始將收到的訊息中繼到Knative 服務通道 - 在Knative術語中稱為接收器。可以在此處檢視Kafka事件源的示例清單檔案。
最後,為了對收到的訊息做一些事情,我們建立了Event DisplayKnative服務,列印出它從Kafka事件源接收的訊息。透過這種方式,我們能夠對MySQL資料庫進行更改,從而在Knative上觸發了服務。​​​​​​​
值得注意的是,此解決方案有點過於簡單,僅用於演示目的。Knative支援更復雜的事件管道,可能涉及透過通道連線在一起的多個服務,應該在更真實的世界環境中使用。更多關於Knative事件的資訊

相關文章