無伺服器管道:將MySQL事件流傳輸到Knative Services - zhaw
我們最初的想法是利用資料庫觸發機制並編寫可以監聽這些事件並將它們釋出到Kafka匯流排的元件。實際上,我們開始編寫針對PostgreSQL的程式碼來實現這一目標,但後來我們遇到了Debezium專案,該專案基本上解決了同樣的問題,雖然不是在相同的上下文中,但是具有更成熟的程式碼庫和對多個資料庫系統的支援。重新發明輪子是沒有意義的,因此目標變成了如何最好地整合Debezium和Knative。
經過一些閱讀和實驗,我們最終得到了圖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還支援監控其他資料庫系統,如MongoDB,PostgreSQL,Oracle和SQL 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事件的資訊。
相關文章
- 資料傳輸 | 利用 DTLE 將 MySQL 資料同步到 DBLEMySql
- 將本地檔案傳輸到GitHubGithub
- 事件匯流排有個 pipe 管道方法事件
- Knative將是無伺服器的下一代嗎? | TechBeacon伺服器
- 7 Redo Transport Services 日誌傳輸服務
- 執行緒間的協作(3)——管道輸入/輸出流執行緒
- Sqlstream:將MySQL複製事件流化到Apache KafkaMySql事件ApacheKafka
- 如何傳輸檔案到linux伺服器?Linux伺服器
- 將資料從 Visual Basic 傳輸到 ExcelExcel
- 無伺服器Serverless將變革工作流BPM伺服器Server
- 遊戲改變者:Knative無伺服器雲元件遊戲伺服器元件
- 將AWR資料傳輸到另一個系統
- 使用Knative和Python的構建無伺服器事件驅動的應用 - Ron NagarPython伺服器事件
- TCP/IP 通訊傳輸流TCP
- Laravel 管道流原理Laravel
- android上傳圖片到伺服器(使用base64位元組流的形式通過 AsyncHttpClient框架傳輸)Android伺服器HTTPclient框架
- 將檔案從Linux傳輸到Windows(後期利用)LinuxWindows
- sqoop進行將Hive 詞頻統計的結果資料傳輸到Mysql中OOPHiveMySql
- 實戰-將MySQL備份上傳到私有云(3)MySql
- ajax的資料無法傳輸到controller層Controller
- 將Abp預設事件匯流排改造為分散式事件匯流排事件分散式
- Java IO7:管道流、物件流Java物件
- 大手筆!谷歌透過Knative壓賭無伺服器架構谷歌伺服器架構
- debezium-資料實時捕獲和傳輸管道(CDC)
- MySQL 傳輸表空間MySql
- MySQL表空間傳輸MySql
- UDP實現音訊影片流傳輸UDP音訊
- AnyTrans使用教程:將照片從 Mac 傳輸到 iPhone 的方法MaciPhone
- 使用 NodeJS 將檔案或影像上傳到伺服器NodeJS伺服器
- 管道流間的通訊
- 利用華為DTM將事件傳送到Firebase事件
- Transmit教程|如何將Transmit傳輸到新的Mac並匯入資料MITMac
- mysql之 表空間傳輸MySql
- 流媒體傳輸協議之 RTP (上篇)協議
- 流媒體傳輸協議之 RTP(下篇)協議
- 流媒體技術之傳輸協議協議
- USB 控制寫傳輸、控制讀傳輸、無資料控制傳輸都是在什麼場景下?
- netty 管道傳遞Netty