<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kafka 彙整 - 歐立威科技</title>
	<atom:link href="https://www.omniwaresoft.com.tw/tag/kafka/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.omniwaresoft.com.tw/tag/kafka/</link>
	<description>歐立威科技 Omniwaresoft｜全方位企業級開源軟體解決方案</description>
	<lastBuildDate>Tue, 27 Jan 2026 07:52:13 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.4</generator>

<image>
	<url>https://www.omniwaresoft.com.tw/wp-content/uploads/2022/12/android-icon-192x192-1.png</url>
	<title>Kafka 彙整 - 歐立威科技</title>
	<link>https://www.omniwaresoft.com.tw/tag/kafka/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">242464019</site>	<item>
		<title>Apache Kafka 是什麼？核心元件、優勢、常見使用案例一次看！</title>
		<link>https://www.omniwaresoft.com.tw/product-news/kafka-news/kafka-introduction/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Thu, 28 Mar 2024 03:58:33 +0000</pubDate>
				<category><![CDATA[Kafka 產品訊息]]></category>
		<category><![CDATA[產品資訊]]></category>
		<category><![CDATA[ETL]]></category>
		<category><![CDATA[Kafka]]></category>
		<guid isPermaLink="false">https://www.omniwaresoft.com.tw/?p=40927</guid>

					<description><![CDATA[Kafka 是專為處理大數據而生的分布式資料串流平台，能輕鬆處理每秒數萬次的請求。相較其他消息佇列系統，Kafka 擁有更好的吞吐量，內建的分區機制，和卓越的容錯能力，這使其被應用於各種大數據使用情境，例如即時資料分析、日誌聚合、消息傳遞和支援微服務架構。]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="40927" class="elementor elementor-40927" data-elementor-post-type="post">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-1877a974 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1877a974" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1f44d843" data-id="1f44d843" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-1f4731e9 flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" data-id="1f4731e9" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
												<div class="elementor-text-editor elementor-clearfix">
						
<h2 class="wp-block-heading"><strong>Kafka 是什麼？</strong></h2>

<p>Apache Kafka 是專為處理大數據而生的分布式資料串流平台，能輕鬆處理每秒數萬次的請求（Request）。</p>
<p>相較其他消息佇列系統（Message Queue），Kafka 擁有更好的吞吐量，內建的分區（Partition）機制，和卓越的容錯能力，這使其被應用於各種大數據使用情境，例如即時資料分析、日誌聚合、消息傳遞和支援微服務架構。</p>

<p>本文將深入探討 Kafka 的基本概念、功能、架構和主流使用情境。</p>
<p><img data-recalc-dims="1" class="alignnone size-medium wp-image-45785" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=300%2C150&#038;ssl=1" alt="" width="300" height="150" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?w=2400&amp;ssl=1 2400w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=300%2C150&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=1024%2C512&amp;ssl=1 1024w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=768%2C384&amp;ssl=1 768w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=1536%2C768&amp;ssl=1 1536w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?resize=2048%2C1024&amp;ssl=1 2048w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2026/01/Apache_kafka_wordtype.svg.png?w=2340&amp;ssl=1 2340w" sizes="(max-width: 300px) 100vw, 300px" /></p>

<h2 class="wp-block-heading"><strong>Kafka 解決了什麼問題？</strong></h2>

<p>許多發佈 / 訂閱系統經常在初期作為簡易消息佇列架構。開發者只需架設 Web 伺服器、配合前端網頁、後端程式與資料庫串接，即可滿足大部分使用需求。</p>

<p>隨著 Web 系統使用規模增加，API 呼叫（Request）與資料庫存取頻率也會跟著提高，萬一系統缺乏有效的緩衝機制，資料庫很快就會承受過大的工作負載。</p>

<p>不僅如此，當企業進入擴張期，必然產生用戶行為、業務狀態等資訊分析需求，這時系統就必須追加監控功能等額外應用程式。如果未能妥善規範資料流架構，系統結構將變得複雜、難以追蹤與管理。</p>

<p>為了解決上述困難，開發者可以將前端資料發佈到 Kafka、形成資料暫存區，再藉由後端程式從中訂閱資料。這麼一來，既能減緩資料庫負載，也能達到較不複雜的系統架構。</p>

<h2 class="wp-block-heading"><strong>Kafka 的資料管道（Data Pipeline）工作流程</strong></h2>

<p>綜觀整個資料處理架構，自資料來源導入系統的應用程式可稱作「輸入端」、取用資料的應用程式則稱為「輸出端」；Kafka 位於「輸入端」與「輸出端」之間，</p>

<p>一邊從「輸入端」接收資料，一邊分配資料到「輸出端」，完成後續的資料加工與傳遞作業。</p>

<p>Kafka 作為資料流的「管道」（Pipeline），可以讓資料流通於各類基礎架構、降低元件之間的耦合程度；這種架構有利於日後系統維運，即降低「輸出端」應用程式原始碼修改後，連帶影響其它元件設定值的修改成本。</p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" data-recalc-dims="1" height="627" width="1024" class="wp-image-40943" style="aspect-ratio: 1.6331738437001595; width: 597px; height: auto;" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2024/03/%E6%88%AA%E5%9C%96-2024-03-28-%E4%B8%8A%E5%8D%8811.46.04.png?resize=1024%2C627&#038;ssl=1" alt="Kafka DataPipeline" /></figure></div>
<h2 class="wp-block-heading"><strong>Kafka 4 大核心元件</strong></h2>

<h3 class="wp-block-heading"><strong>一、Events（事件）＆ 消息（Message）</strong></h3>

<p>在 Kafka 中，事件是帶有資料的消息。消息是 Kafka 中的最小資料單元，此概念類似於資料庫的 Row 和 Record。通常一個事件會回傳以下消息： Key、 Value、 Timestamp 以及 Meta Data Header。</p>

<p>以下為一個事件範例：當一位新訪客在網銀上匯款時，此匯款行為就會被視為一個事件，並回傳以下消息（Message）：匯款者姓名、值、時間戳。</p>

<ul class="wp-block-list">
<li>Event key: &#8220;Ethan&#8221;</li>

<li>Event value: &#8220;向 Claire 支付 200 元&#8221;</li>

<li>Event timestamp: &#8220;2023/05/06 3.30pm&#8221;</li>
</ul>

<h3 class="wp-block-heading"><strong>二、Topics（主題） &amp; Partition（分區）</strong></h3>

<p>Kafka 會將每一條資料歸納在事先指定的 Topic 中，即每個 Topic 處理同一類型的資料；當生產者 (Producer) 指定目標 Topic 時，就代表提供了明確的資料分類標示。</p>

<p>Topic（主題）可以被理解為資料庫的資料表或檔案系統的資料夾，每條資料都具有值（Value）、鍵（Key）和標頭（Header）。Topic 作為資料訂閱、發佈的基本單位，不僅可以單純接收生產者發佈的資料，也可以接收一或多個消費者訂閱消息。</p>

<p>一個 Topic 可以區分為多個 Partition，從提交日誌紀錄（Log）的角度理解，每個 Partition 代表了各自紀錄的集合，一但資料發佈到 Kafka Topic，資料就會預設以「僅限追加」（Append-only）的方式加入 Partition 佇列末端，並加上 Offset（偏移值）來標記先後順序與資料傳輸進度。</p>

<p>Kafka 或 Zookeeper 會記錄每個 Partition 最後被訂閱的資料 Offset，因此即使消費端中斷與 Kafka 的連接並再次重新訂閱也不會遺失任何資料。</p>

<p>受到 Partition 結構影響，直接觀察 Kafka Topic 無法確認資料傳輸的具體順序，但如果觀察個別 Partition 就能發現資料按照寫入順序排列。</p>

<p>下圖是一個由 3 個 Partition 組成的 Topic，資料會進入每個 Partition 末端並被賦予 Offset。相同 Topic 所屬的 Partition 可以分布於不同主機，也就是說，Topic 可以跟隨需求、在多個伺服器進行水平擴展。</p>
<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img data-recalc-dims="1" height="636" width="1024" class="wp-image-40946" style="aspect-ratio: 1.610062893081761; width: 574px; height: auto;" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2024/03/%E6%88%AA%E5%9C%96-2024-03-28-%E4%B8%8A%E5%8D%8811.56.17.png?resize=1024%2C636&#038;ssl=1" alt="How partition works" /></figure></div>
<h3 class="wp-block-heading"><strong>三、Producers（生產者）和 Consumer（消費者）</strong></h3>

<p>Kafka 的客戶端系統應用程式主要分為生產者和消費者。</p>

<h4><strong>Producer （生產者）</strong> </h4>

<p>負責產生消息。在發布 / 訂閱系統中，它們被稱為發佈者或寫入端。</p>
<p>生產者會在產生消息後將其寫入特定 Kafka Topic 中。通常生產者並不特別指定消息應寫入哪個 Partition，而是將其平均分佈到 Topic 中所有的 Partition 上。生產者的形式多樣，它可以是運行於網頁伺服器的應用程式、IoT 設備或監控程式等等。</p>

<p>當使用者登入購物網站時，他們的登入資訊、購物喜好以及瀏覽資訊都會作為消息發送到 Kafka Cluster 中。從這個例子可以看出，任何生成消息的實體都可以作為生產者。</p>

<h4><strong>Consumer（消費者）</strong></h4>

<p>負責讀取消息。它們在發佈 / 訂閱系統中可能被稱為訂閱者或讀取者。</p>
<p>消費者能訂閱一到多個 Topic 並依照資料生產的順序進行讀取，此外，他們能藉由消息的 Offset 持續追蹤哪些消息已被讀取完畢。</p>

<p>根據系統架構，一個應用程式可以同時是生產者和消費者。例如：一個資料倉儲能從 Kafka 消費資料，將其整理後的結果再透過 Kafka 提供給 ML 或 AI 應用程式的消費者訂閱。一般來說，資料庫、資料湖泊和資料分析應用程式在 Kafka 中扮演消費者的角色，因為它們需要儲存並分析從 Kafka 接收到的資料。</p>

<p>另外，Kafka 還提供進階的客戶端 API，例如用於資料整合的 Kafka Connect API 以及整理串流的 Kafka Stream，這類進階客戶端會將生產者與消費者做為基石，並打造更高階的應用功能。</p>

<h3 class="wp-block-heading"><strong>四、Broker（代理器） &amp; Cluster（叢集）：</strong></h3>

<p>在 Kafka 中， Broker 可以被理解為組成叢集的單元。</p>
<p>Broker 的主要職責是從生產者接收消息，為消息分配 Offset，並將消息儲存於硬碟系統。此外，Broker 也為消費者提供服務，負責處理 Partition 的串流讀取請求，並從硬碟中檢索並返回相應的消息。根據不同的硬體配置，單個 Broker 每秒能處理數以萬計的讀寫請求。</p>

<p>一個 Kafka Cluster 通常由多個 Broker 組成，開發者能透過每個 Broker 的 ID（Integer）進行識別，從而幫助 Kafka Cluster 實現負載平衡、資料備份和故障轉移等功能。</p>

<p>Kafka 採用 ZooKeeper 來管理 Broker。Zookeeper 是 Kafka Broker 和消費者間的協調接口。ZooKeeper 會在叢集中選出一個 Broker 作為叢集控制者（Controller）。控制者負責執行管理所有叢集和元數據（Meta Data）的訊息，控制者的職責包含：</p>

<ol class="wp-block-list">
<li>管理 Broker 的運行狀態，包括管理 Broker 的自然下線、當機或網路通訊所造成的叢集變動。控制者需要即時更新叢集資訊，並將所發生的變動吿知所有 Broker。</li>

<li>在創建 Topic 或對其進行擴展時，控制者會重新分配 Topic 中 Partition 資料的備份副本（Replica），並且為每個 Partition 選出領頭 Broker；每個 Partition 的領頭 Broker 將主導各自 Partition 的資料讀寫動作。</li>

<li>管理叢集中所有 Replica 和 Partition 的運行狀態，透過監聽運行狀態事件，來做出相應的處置。</li>
</ol>

<h2 class="wp-block-heading"><strong>Kafka 的三個優勢</strong></h2>

<h3 class="wp-block-heading"><strong>一、可擴展性（Scalability）</strong></h3>

<p>Kafka 的可擴展性讓開發者輕鬆管理巨量資料。在 Kafka 中，單一叢集可以橫跨多個資料中心和雲服務基礎架構。</p>

<p>一個 Topic 也能夠將不同 Partition 部署於不同 Broker 上。這種特殊架構讓 Kafka 更容易實現水平擴展，使用者只需在現有的基礎架構中加入新伺服器或資料中心就能處理更多資料。</p>

<p>實務上，開發者能部署單一 Broker 進行概念性驗證，再將其擴展成 3 至  5 台的小型叢集，並隨著服務規模的提升，最後轉移至由數百台 Broker 組成的大型 Kafka 叢集上。</p>

<p>Cluster 在進入正式環境後能在不影響系統可用性的清況下進行擴展，確保即使在某些 Broker 失效的情況下，由多個 Broker 構成的 Cluster 也能持續運行。</p>

<h3 class="wp-block-heading"><strong>二、管理數個生產者和消費者</strong></h3>

<p>Kafka 的分散式架構確保無論生產者向相同或不同 Topic 發送資料，所有消息都能按順序儲存。該特性讓 Kafka 能有效聚合前端系統並長時間儲存消息，從而確保資料結構一致。</p>

<p>舉例來說，一個由數個微服務構成的網站，允許每個微服務將 Page View 事件以一致的格式寫入相同的 Kafka Topic。消費端即可從單一串流取得所有應用程式的 Page View 狀態，而不需要為每個應用建立個別 Topic。</p>

<p>除了能夠管理複數生產者，單一 Kafka 串流也能被多個消費者同時讀取，數個消費者也能組成消費者群組（Consumer Group） 並行從不同 Partition 讀取消息，共享串流並提高吞吐量。</p>

<h3 class="wp-block-heading"><strong>三、基於磁碟保存資料</strong></h3>

<p>Kafka 不僅能管理多個消費者，還能將消息長時間保存。這代表消費者不必即時處理串流資料。因為消息能留存於磁碟。</p>

<p>Kafka 允許消費者根據不同業務需求為資料保存期限配置合適的策略。透過長時間保留消息，即使是處理速度較慢或由消息吞吐量激增而導致進度落後的消費者，也能保證保不丟失任何數據。</p>

<p>此外，這一機制允許消費者在進行必要的維護時短暫下線，不需擔心遺漏生產者產出的消息。因為在消費者終止運行後，消息仍會保存於 Kafka，只需重啟就能繼續接收串流中的數據。</p>

<h2 class="wp-block-heading"><strong>Kafka 的四個使用案例</strong></h2>

<h3 class="wp-block-heading"><strong>一、行為追蹤</strong></h3>

<p>Kafka 的設計初衷是為了追蹤使用者行為。使用者於前端系統完成的任何行為，都會產生大量資料，包含被動資料（例如：Page View、 Search Result、Click 事件等等），或其他更複雜的行為（例如：帳號註冊事件）。</p>

<p>這些事件會被發佈到專門的 Kafka Topic 上，隨後被後端應用程式消費，並應用於監控、分析、報表製作、個人化推薦系統等領域。</p>

<p>例如，電商平台可以將使用者行為事件發送到 Kafka，然後使用 <a href="https://www.omniwaresoft.com.tw/product-news/elastic-news/elk-logstash/" target="_blank" rel="noopener">Logstash</a> 從 Kafka 消費這些事件，並將其轉發到 <a href="https://www.omniwaresoft.com.tw/techcolumn/elastic-techcolumn/elasticsearch-basic-concept/" target="_blank" rel="noopener">Elasticsearch</a> 中進行索引和儲存。接著，可以使用 <a href="https://www.omniwaresoft.com.tw/product-news/elastic-news/elk-kibana/" target="_blank" rel="noopener">Kibana</a> 來視覺化和分析這些使用者行為資料，例如：使用者訪問路徑、熱門商品、轉化率等，從而更好地了解使用者行為，並優化產品和服務。</p>

<p><strong>行為追蹤應用場景</strong></p>

<p>電商平台即時追蹤訪客活動。每個訪客觸發的事件，例如：Page View、Add to Cart、Purchase、Search Result 等，都可以作為事件並發佈到特定的 Kafka Topic。這些事件隨後被消費者訂閱，並能夠用於推薦、個人化折扣、報告和詐欺檢測。</p>

<h3 class="wp-block-heading"><strong>二、消息傳遞</strong></h3>

<p>Kafka 允許應用程式向使用者傳遞消息（如：電子郵件）時，無需擔心資料格式或消息是否已確實送出。</p>

<p>開發者只需透過 Kafka 就能夠讀取所有送出的消息，並統一管理，例如：將消息整理成常見格式、將收集的大量消息於一次通知時同時傳送或利用開發者偏好的方式傳送。</p>

<p><strong>消息傳遞應用場景</strong></p>

<p>使用微服務架構的叫車系統透過 Kafka 在不同程式間傳送消息，例如：當客戶預訂叫車行程時，行程預訂程式可透過 Kafka 向司機匹配程式發送一條消息，然後司機匹配程式再匹配到附近司機後迅速回傳消息，而這些消息傳遞都是即時進行的。</p>

<h3 class="wp-block-heading"><strong>三、量測值與日誌</strong></h3>

<p>Kafka 也能追蹤系統量測值與監控系統日誌，當生產者將消息發佈到 Kafka Topic 後，這些消息會在 Kafka Cluster 上被聚合，集中存放於文件伺服器或 HDFS，方便後續存取。</p>

<p>這些消息能被監控或告警系統消費，也同時適用於離線系統（如 Hadoop）執行長期趨勢分析的任務，例如：成長率預估。此外，Kafka 也允許將日誌檔案寫入 Elasticsearch 這類日誌搜尋系統或資安分析應用程式。</p>

<p>在使用 Kafka 處理日誌和量測值時，安全性非常重要。<a href="https://www.omniwaresoft.com.tw/hashicorp-vault/" target="_blank" rel="noopener">HashiCorp Vault</a> 可以幫助您保護 Kafka 的安全性，例如：使用 Vault 來管理 Kafka 的連線憑證，例如使用者名稱、密碼、SASL / Kerberos 金鑰等，並提供動態 secrets 生成和租用功能，降低安全風險。此外，Vault 還可以加密 Kafka 的資料，確保日誌和量測值的機密性。</p>

<p><strong>量測值與日誌應用場景</strong></p>

<p>雲端供應商利用 Kafka 聚合和監控來自各服務的運營指標。例如：由數百台伺服器回傳的 CPU 使用率、記憶體使用率、請求次數、錯誤率等指標可以發佈到 Kafka 上，再將其應用於即時視覺化、偵測告警事件以及檢測異常情況。</p>

<h3 class="wp-block-heading"><strong>四、即時資料處理</strong></h3>

<p>許多系統需要在接收消息後立即處理，Kafka 能以極低的延遲時間（ 5 毫秒內）將消息從生產者傳送到消費者，這對以下領域至關重要：</p>

<ul class="wp-block-list">
<li>金融機構：使用 Kafka 即時收集和處理支付及金融交易，一但檢測詐欺交易就立即終止，或即時更新報價單。</li>
</ul>

<ul class="wp-block-list">
<li>物聯網（IOT）：通過預測性維護（Predictive Maintenance）模型持續分析設備回傳資料；當模型檢測到帶有故障風險的異常資訊時，即可觸發系統警告。</li>
</ul>

<ul class="wp-block-list">
<li>物流業：利用監控程式追蹤貨船航行位置以提供即時的到貨進度。</li>
</ul>

<p>例如，金融機構可以使用 Kafka 和 <a href="https://www.omniwaresoft.com.tw/edb/" target="_blank" rel="noopener">EDB PostgreSQL</a> 來構建實時交易處理系統。Kafka 可以用於接收和處理大量的交易資料，EDB PostgreSQL 可以用於儲存和分析這些資料。通過 Kafka 和 EDB PostgreSQL 的整合，可以實現交易的即時監控、風險管理和欺詐檢測。</p>

<p><strong>即時資料處理應用場景</strong></p>

<p>金融業透過 Kafka 實現即時交易處理。每筆客戶交易資料都會作為事件發佈到 Kafka Topic 上供消費端應用程式讀取，這些資料會被用於分析、追蹤並偵測金融市場活動。</p>
<hr class="wp-block-separator has-alpha-channel-opacity" />
<p><strong>歐立威科技致力成為全方位開源軟體解決方案與資料分析專業建置商，我們提供 Kafka 平台的規劃部署、架構整合、教育訓練與技術服務，幫助客戶利用 Kafka 打造良好的資料流架構，讓他們專注於發展核心業務。如果想要獲得更多資訊，歡迎與<a href="https://www.omniwaresoft.com.tw/contact/">我們聯繫</a>。</strong></p>
<hr />
<p> </p>
							</div>
										</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-cc79495 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="cc79495" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d497674" data-id="d497674" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-b319f1a flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-html" data-id="b319f1a" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<div style="text-align: left;">加入歐立威 LINE 好友，了解更多產品資訊<BR><BR>
  <a href="https://lin.ee/VCvhQSK" style="display: inline-block;" target="_blank"> 
    <img data-recalc-dims="1" width="1170" src="https://i0.wp.com/scdn.line-apps.com/n/line_add_friends/btn/zh-Hant.png?fit=1170%2C36&#038;ssl=1" alt="加入好友" height="36" border="0">
  </a>
</div>				</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">40927</post-id>	</item>
		<item>
		<title>運用 Kafka 實現 CDC 資料同步 &#8211; 以 MongoDB 為例</title>
		<link>https://www.omniwaresoft.com.tw/techcolumn/kafka-techcolumn/using-kafka-for-cdc-with-mongodb/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Thu, 27 Oct 2022 08:09:08 +0000</pubDate>
				<category><![CDATA[Kafka 技術專欄]]></category>
		<category><![CDATA[MongoDB 技術專欄]]></category>
		<category><![CDATA[CDC]]></category>
		<category><![CDATA[Kafka]]></category>
		<category><![CDATA[MongoDB]]></category>
		<guid isPermaLink="false">http://www.omniwaresoft.com.tw/?p=18311</guid>

					<description><![CDATA[本文以透過 MongoDB Kafka Connector 實現 MongoDB 集群間的資料同步為例，開源的 Kafka Connect 外掛程式有 Debezium MongoDB Connector 和 MongoDB Kafka Connector 。本文旨在提供讀者自行架設簡易測試環境的步驟作為參考，並用以驗證資料庫間的資料串流功能。]]></description>
										<content:encoded><![CDATA[<h2><strong>前言</strong></h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>關於 CDC 技術的簡介及<a href="https://www.omniwaresoft.com.tw/product-news/kafka-news/kafka-introduction/" target="_blank" rel="noopener"> Kafka</a> 如何用在 CDC，可以參考文章<a href="https://www.omniwaresoft.com.tw/product-news/kafka-news/what-is-cdc/" target="_blank" rel="noreferrer noopener">「淺談 Change Data Capture (CDC) 及重要性，它如何實現資料同步？」</a>的介紹。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我們會以透過 MongoDB Kafka Connector 實現 MongoDB 集群間的資料同步為例，開源的 Kafka Connect 外掛程式有 Debezium MongoDB Connector 和 MongoDB Kafka Connector 等，下表作簡單比較：</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:table --></p>
<figure>
<table>
<thead>
<tr>
<th data-align="center">工具</th>
<th data-align="center">Debezium MongoDB Connector</th>
<th data-align="center">MongoDB Kafka Connector</th>
</tr>
</thead>
<tbody>
<tr>
<td data-align="center">支援性</td>
<td data-align="center">僅提供來源端連接器驅動程式</td>
<td data-align="center">提供來源端及目的端連接器驅動程式</td>
</tr>
<tr>
<td data-align="center">同步機制</td>
<td data-align="center">Oplog Mode (~v1.9) Change Streams Mode (v1.8+)</td>
<td data-align="center">Change Streams Mode</td>
</tr>
<tr>
<td data-align="center">接收端 CDC 資料處理</td>
<td data-align="center">需搭配 MongoDB Kafka Connector 提供的 Debezium CDC Handler</td>
<td data-align="center">MongoDB CDC Handler</td>
</tr>
<tr>
<td data-align="center">作用 MongoDB 節點</td>
<td data-align="center">僅支援單一節點 Replica Set/Sharded Cluster</td>
<td data-align="center">支援多節點 Replica Set/Sharded Cluster</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>本文旨在提供讀者自行架設簡易測試環境的步驟作為參考，並用以驗證資料庫間的資料串流功能。以下內容將著重在說明如何建置 Kafka 服務及設定資料同步的工作。 </p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>你需要準備</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>一台已安裝 Linux 穩定發行版本的 VM 或實體機器，本文使用 CentOS 7。 建議配置：
<ul>
<li style="list-style-type: none;">
<ul>
<li>vCPUs: 4 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>RAM: 8 GB 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Disk: 500 GB 以上</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Linux 基本操作知識</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>來源端及目的端 MongoDB 集群（含連線資訊、具 <code>ChangeStreams</code> 讀取及相關表格讀寫等權限可供 Connector 工作使用的連線帳密）
<ul>
<li style="list-style-type: none;">
<ul>
<li>需為 Replica Set 或是 Sharded Cluster</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>來源端 MongoDB 表格（含資料），本文假設為 <code>mydb</code> database 下的 <code>mycoll</code> 表格</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- wp:list-item --></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>MongoDB 集群的連線工具，如 MongoDB Compass 或 terminal</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>環境架構</h2>
<p><img data-recalc-dims="1" loading="lazy" class="alignnone  wp-image-34921" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=507%2C142&#038;ssl=1" alt="mongodb-kafka-architecture" width="507" height="142" srcset="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=300%2C84&amp;ssl=1 300w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=1024%2C287&amp;ssl=1 1024w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=768%2C215&amp;ssl=1 768w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?resize=1536%2C431&amp;ssl=1 1536w, https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2022/10/mongodb-kafka-architecture.jpg?w=2000&amp;ssl=1 2000w" sizes="(max-width: 507px) 100vw, 507px" /></p>
<p><!-- /wp:heading --></p>
<p><!-- wp:image {"align":"center","width":594,"height":166} --></p>
<p><!-- /wp:image --></p>
<p><!-- wp:paragraph {"align":"center"} --></p>
<p><strong>Kafka 架構示意圖</strong></p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>我們在同一台機器上安裝單節點 Kafka 及 Kafka Connect，並在 Kafka Connect 中加入 MongoDB Kafka Connector 外掛程式。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">MongoDB 的 CDC 機制 (Change Streams)</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>MongoDB 的 Change Streams 功能就像資料庫的實時脈搏，它可以捕捉資料庫中發生的任何變化，並將這些變化傳遞給其他系統。</p>
<p data-sourcepos="5:1-5:24"><strong>Change Streams 如何運作？</strong></p>
<p data-sourcepos="7:1-7:86">Change Streams 會監控 MongoDB 的操作日誌 (oplog)，並將資料的異動 (例如新增、修改、刪除) 轉換成異動事件 (Change Event)。</p>
<p data-sourcepos="9:1-9:60"><strong>當 MongoDB 資料庫發生變化時，Change Streams 會捕捉這些變化，並將其傳遞給 Kafka。</strong></p>
<p data-sourcepos="11:1-11:13">更具體地說，整個流程如下：</p>
<ol data-sourcepos="13:1-17:0">
<li data-sourcepos="13:1-13:83"><strong>資料庫異動：</strong> 當來源端的 MongoDB 資料表格發生異動時，例如新增、修改或刪除文件，MongoDB 會產生新的異動事件，並記錄在 oplog 中。</li>
<li data-sourcepos="14:1-14:63"><strong>捕捉異動事件：</strong> Source Connector 會持續監控 oplog，捕捉這些異動事件，並將其集結成批次。</li>
<li data-sourcepos="15:1-15:81"><strong>發送至 Kafka：</strong> Source Connector 會將批次的異動事件發送到 Kafka Broker，並寫入指定的 Kafka Topic。</li>
<li data-sourcepos="16:1-17:0"><strong>同步至目標系統：</strong> Sink Connector 會從 Kafka Broker 讀取指定 Topic 中的資料，並根據異動事件的內容，將新的文件寫入目的端 MongoDB 的指定表格，或執行其他同步操作。</li>
</ol>
<p data-sourcepos="18:1-18:23"> </p>
<p><!-- /wp:list-item --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">Kafka 服務相關元件和名詞介紹</h3>
<p data-sourcepos="3:1-3:74">在 Kafka 的訊息旅程中，許多幕後推手扮演著重要的角色，確保訊息能順利地從生產者傳遞到消費者。以下介紹 Kafka 服務中幾個關鍵的元件和名詞：</p>
<p data-sourcepos="5:1-5:8"><strong>協調者：</strong></p>
<ul data-sourcepos="7:1-8:0">
<li data-sourcepos="7:1-8:0"><strong>ZooKeeper：</strong> 如同一位經驗豐富的指揮家，ZooKeeper 負責協調 Kafka 各服務節點的狀態管理和工作分配，確保整個系統的穩定運行。在 Kafka 2.8.0 以後的版本，Kafka 引入了 KRaft 模式，可以脫離 ZooKeeper 運作，更加輕量化和高效。</li>
</ul>
<p data-sourcepos="9:1-9:10"><strong>訊息的歸宿：</strong></p>
<ul data-sourcepos="11:1-14:0">
<li data-sourcepos="11:1-11:58"><strong>Broker：</strong> Kafka 的節點，如同一個個郵局，負責處理對 Topic 寫入或讀取資料的請求。</li>
<li data-sourcepos="12:1-12:45"><strong>Topic：</strong> 存放資料的容器，如同郵局中的郵箱，用於存放不同類型的訊息。</li>
<li data-sourcepos="13:1-14:0"><strong>Partition：</strong> Topic 的分割，如同將郵箱分成多個隔層，讓 Consumer 可以同時拉取不同 Partition 中的資料，提升處理效率。</li>
</ul>
<p data-sourcepos="15:1-15:15"><strong>訊息的生產者和消費者：</strong></p>
<ul data-sourcepos="17:1-19:0">
<li data-sourcepos="17:1-17:62"><strong>Producer：</strong> 將資料送往 Kafka Broker 寫入的資料製造者，如同寄件人，將訊息投遞到郵箱。</li>
<li data-sourcepos="18:1-19:0"><strong>Consumer / Consumer Groups：</strong> Topic 訊息的消費者，如同收件人，從郵箱中取出訊息。同一個 Topic 可能有很多個消費者，因此以群組形式存在，確保每個訊息都能被消費。</li>
</ul>
<p data-sourcepos="20:1-20:14"><strong>訊息旅程的可靠保障：</strong></p>
<ul data-sourcepos="22:1-23:0">
<li data-sourcepos="22:1-23:0"><strong>Leader / Followers：</strong> Kafka 通常以多節點集群的形式運作，集群中會有一個主要節點作為主節點 (Leader)，其他節點則為副節點 (Followers)，從主節點同步狀態及資料，確保訊息的可靠性和容錯能力。</li>
</ul>
<p data-sourcepos="24:1-24:12"><strong>資料同步的橋樑：</strong></p>
<ul data-sourcepos="26:1-31:0">
<li data-sourcepos="26:1-26:61"><strong>Kafka Connect：</strong> 負責 Connector 的管理，如同一位聯絡員，負責協調資料的同步工作。</li>
<li data-sourcepos="27:1-27:83"><strong>plugin：</strong> 供 Kafka Connect 使用的外掛驅動程式，如同不同的轉接頭，讓 Kafka Connect 可以連接到不同的資料庫或系統。</li>
<li data-sourcepos="28:1-28:100"><strong>Connector：</strong> 與外部資料環境及 Kafka 對接，用來進行指定讀/寫資料工作的單位，如同一位搬運工，負責將資料從來源系統搬運到 Kafka，或從 Kafka 搬運到目標系統。</li>
<li data-sourcepos="29:1-31:0"><strong>Worker / Worker Task：</strong> 一個 Sink Connector 下依據 Topic partition 數目可以有一或多個 process 平行執行 Connector 設定中定義的工作，如同多位搬運工同時工作，提升資料同步的效率。</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>操作步驟</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">一、下載 Apache Kafka</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;https://downloads.apache.org/kafka/3.3.1/kafka_2.13-3.3.1.tgztar&gt; -zvf kafka_2.13-3.3.1.tgzcd kafka_2.13-3.3.1</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">二、啟動 Kafka 服務</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-server-start.sh</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka 預設使用 port 9092。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">三、啟動 Kafka Connect 服務</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka Connect 分有 standalone (預設使用 <code>./config/connect-standalone.properties</code> 中的設定) 及 distributed (預設使用 <code>./config/connect-distributed.properties</code> 中的設定)。差異在於 distributed 版本支援分散儲存 topic 中的資料，一般建議使用 distributed 版本</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>在啟動 Kafka Connect 之前，我們需要先安裝 MongoDB Kafka Connector 外掛，在啟動 Kafka Connect 服務時才會讀取到該外掛程式的存在。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>開啟 <code>connect-distributed.properties</code>，往下滾動至最底部，找到 <code>plugin.path</code> 一行，修改為您要放置外掛檔案的路徑位置。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>vi ./config/connect-distributed.properties</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>下載外掛程式並移至 <code>.properties</code> 中指定 <code>plugin.path</code> 即可，這邊假設為 <code>kafka_2.13-3.3.1/plugins</code>。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;https://search.maven.org/remotecontent?filepath=org/mongodb/kafka/mongo-kafka-connect/1.8.0/mongo-kafka-connect-1.8.0-all.jarmkdir&gt; -p pluginscp mongo-kafka-connect-1.8.0-all.jar plugins</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>再來啟動 Kafka Connect，預設使用 port 8083</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/connect-distributed.sh</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>可以透過以下指令查看已安裝的 Kafka connector plugins，此時應該要看得到 <code>MongoSourceConnector</code> 及 <code>MongoSinkConnector</code>。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;http://localhost:8083/connector-plugins&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">四、新增 Source Connector</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka Connect 提供 REST API 管理執行中的 connector 工作，包含新增 connector、查看 connector 設定內容、變更 connector 設定內容、刪除 connector 等。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>在新增 connector 時透過 API 傳入的設定為 json 格式，為方便可以將設定存為檔案再由指令呼叫設定檔內容。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>以下提供 source connector 範例及常用設定表列說明。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>mongo-src-connector.json
{   
"name": "mongo-src-connector",    
"config": {        
"connector.class": "com.mongodb.kafka.connect.MongoSourceConnector",
"connection.uri": "mongodb://admin:password@mymongosrc1:27017,mymongosrc2:27017,mymongosrc3:27017", 
"database": "mydb", 
"collection": "mycoll",        
"topic.prefix": "src",        
"copy.existing": true,       
"key.converter": "org.apache.kafka.connect.json.JsonConverter",        "key.converter.schemas.enable": "false",       
"value.converter": "org.apache.kafka.connect.json.JsonConverter",        "value.converter.schemas.enable": "false",        
"tasks.max": "1"    }
}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:table {"className":"is-style-regular"} --></p>
<figure>
<table>
<thead>
<tr>
<th data-align="center">設定參數</th>
<th data-align="center">說明</th>
</tr>
</thead>
<tbody>
<tr>
<td data-align="center">name</td>
<td data-align="center">用以辨別此 Connector 工作的名稱</td>
</tr>
<tr>
<td data-align="center">connector.class</td>
<td data-align="center">Kafka connector plugin 的 class 名稱</td>
</tr>
<tr>
<td data-align="center">connection.uri</td>
<td data-align="center">MongoDB 集群連線字串密碼若包含特殊符號如@，需要轉換為 <a href="https://zh.wikipedia.org/zh-tw/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81" target="_blank" rel="noreferrer noopener">URL Encoding</a></td>
</tr>
<tr>
<td data-align="center">database</td>
<td data-align="center">指定監聽異動的 database 名稱未指定 database 及 collection 時監聽範圍為整個集群</td>
</tr>
<tr>
<td data-align="center">collection</td>
<td data-align="center">指定監聽異動的 collection 名稱，此參數只支援單一 collection未指定 collection 時監聽範圍為整個指定 database</td>
</tr>
<tr>
<td data-align="center">topic.prefix</td>
<td data-align="center">指定目標 kafka topic 的前綴字串</td>
</tr>
<tr>
<td data-align="center">topic.suffix</td>
<td data-align="center">指定目標 kafka topic 的後綴字串</td>
</tr>
<tr>
<td data-align="center">copy.existing</td>
<td data-align="center">設定是否複製 collection 內既有資料，預設為 false</td>
</tr>
<tr>
<td data-align="center">task.max</td>
<td data-align="center">此 Connector 可以使用的 Worker Task 上限，預設為 1</td>
</tr>
</tbody>
</table>
</figure>
<p><!-- /wp:table --></p>
<p><!-- wp:paragraph --></p>
<p>我們需要先建立 Kafka Topic，才能讓 Connector 透過 Broker 寫入</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic src.mydb.mycoll --replication-factor 3 --partition 1</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p><strong>｜</strong>replication-factor: 一共會有幾份相同的 topic，建議 production 設定為 3</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>確認剛才建立的 topic 資訊</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic src.mydb.mycoll</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>之後便可透過以下指令啟動 Source Connector</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X POST &lt;http://localhost:8083/connectors&gt; -H "Accept:application/json" -H "Content-Type:application/json" -d @mongo-src-connector.json</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">五、觀察 Kafka Topic 內容</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>我們先來確認 Source Connector 有正常啟動（無錯誤訊息且狀態為 RUNNING），以及表格資料是否如預期寫入 Kafka topic。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">六、檢查 Connector 狀態</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>curl &lt;http://localhost:8083/connectors/mongo-src-connector/status&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">七、列出所有 Kafka topics</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">八、查看 Kafka topic 內資料</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic src.mydb.mycoll</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">九、新增 Sink Connector</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:code --></p>
<pre><code>mongo-sink-connector.json
{   
"name": "mongo-sink-connector",   
"config": {        
"connector.class": "com.mongodb.kafka.connect.MongoSinkConnector",        
"connection.uri": "mongodb://admin:password@mymongosink1:27017,mymongosink2:27017,mymongosink3:27017",
"topics": "src.mydb.mycoll",        
"database": "sinkdb",        
"collection": "sinkcoll",        
"key.converter": "org.apache.kafka.connect.json.JsonConverter",        "key.converter.schemas.enable": "false",        
"value.converter": "org.apache.kafka.connect.json.JsonConverter",        "value.converter.schemas.enable": "false",        
"change.data.capture.handler": "com.mongodb.kafka.connect.sink.cdc.mongodb.ChangeStreamHandler",        
"tasks.max": "1"    }
}</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>接著便可透過以下指令啟動 Sink Connector</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X POST &lt;http://localhost:8083/connectors&gt; -H "Accept:application/json" -H "Content-Type:application/json" -d @mongo-sink-connector.json</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;">十、觀察結果</h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>在確認 Sink Connector 正常啟動後，同步工作至此已經架設完成。您可以參考以下指令，在先前建立的 connector 工作持續運作的狀態下，連線到來源端 MongoDB 進行操作。透過另一個連線，在目的端 MongoDB 表格結果是否與來源端一致。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>連線至 MongoDB</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>mongosh mongodb://admin:password@mymongosink1:27017,mymongosink2:27017,mymongosink3:27017</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:list --></p>
<ul>
<li style="list-style-type: none;">
<ul><!-- wp:list-item --></ul>
</li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格新增一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>use mydb
db.mycoll.insertOne({ name: "TestField" });</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true,
  insertedId: ObjectId("63686963a37df5cdbf7fec9d") }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格 <code>sinkdb.sinkcoll</code> 會看到新增了一筆連 <code>ObjectId</code> 都與來源端一模一樣的資料</strong></p>
</blockquote>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格更新一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>db.mycoll.updateOne({name: "TestField"}, {$set:{newField: true}});</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0 }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格會看到這筆資料多了一個欄位 <code>newField</code></strong></p>
</blockquote>
<ul>
<li style="list-style-type: none;">
<ul>
<li>自來源端表格刪除一筆資料</li>
</ul>
</li>
</ul>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:code --></p>
<pre><code>db.mycoll.deleteOne({name: "TestField", newField: true})</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:paragraph --></p>
<p>Output:</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>{ acknowledged: true, deletedCount: 1 }</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:quote --></p>
<blockquote>
<p><!-- wp:paragraph --></p>
<p><strong>在目標資料庫的表格會看到這筆資料也跟著被刪除</strong></p>
<p><!-- /wp:paragraph --></p>
</blockquote>
<p><!-- /wp:quote --></p>
<p><!-- wp:paragraph --></p>
<p>收尾</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:paragraph --></p>
<p>如果要結束測試，一樣可以透過 curl 呼叫 API 來停止 connector 工作。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:code --></p>
<pre><code>curl -X DELETE &lt;http://localhost:8083/connectors/mongo-src-connector&gt;
curl -X DELETE &lt;http://localhost:8083/connectors/mongo-sink-connector&gt;</code></pre>
<p><!-- /wp:code --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<h2>結語</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>本文中我們示範了如何自行架設 Kafka 環境，以及簡單驗證資料庫間利用 CDC 機制同步資料的功能。透過開源的 CDC 同步方案，我們可以更有效地進行巨量資料庫間資料的複製與轉移，並確保資料的一致性。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"fontSize":"medium"} --></p>
<p>參考資料：<a href="https://www.mongodb.com/docs/kafka-connector/current/" target="_blank" rel="noopener">MongoDB Kafka Connector 官方文件</a></p>
<p><!-- /wp:heading --></p>
<p><!-- wp:list {"ordered":true} --></p>
<ol>
<li style="list-style-type: none;">
<ol><!-- wp:list-item --></ol>
</li>
</ol>
<p>有興趣歡迎 <a href="https://www.omniwaresoft.com.tw/contact/" target="_blank" rel="noopener">聯繫我們</a>，或加入 <a href="https://lin.ee/VCvhQSK" target="_blank" rel="noopener">歐立威 LINE 好友</a>，了解更多產品資訊！</p>
<p><!-- /wp:list-item --></p>
<p><!-- /wp:list --></p>
<p><!-- wp:separator {"opacity":"css","className":"is-style-wide"} --></p>
<hr />
<p><!-- /wp:separator --></p>
<p><!-- wp:block {"ref":34920} /--></p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">18311</post-id>	</item>
		<item>
		<title>開啟資料整合微服務化 – 淺談 Change Data Capture (CDC) 及重要性，它如何實現資料同步？</title>
		<link>https://www.omniwaresoft.com.tw/techcolumn/kafka-techcolumn/what-is-cdc/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Wed, 03 Aug 2022 06:55:27 +0000</pubDate>
				<category><![CDATA[Kafka 技術專欄]]></category>
		<category><![CDATA[CDC]]></category>
		<category><![CDATA[Debezium]]></category>
		<category><![CDATA[Kafka]]></category>
		<guid isPermaLink="false">http://www.omniwaresoft.com.tw/?p=17788</guid>

					<description><![CDATA[CDC 的原文是 Change Data Capture，常被稱為「異動資料擷取」，在資料庫的領域裡，它是一組軟體設計模式，目的是在資料庫發生變更異動時，能夠時序式地記錄追蹤狀態和變動內容，然後達到資料同步的效果，甚至再應用到資料轉移、資料庫備份、災難復原的場合。]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="17788" class="elementor elementor-17788" data-elementor-post-type="post">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-471061fd elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="471061fd" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7e15f9eb" data-id="7e15f9eb" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-219411df flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" data-id="219411df" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
												<div class="elementor-text-editor elementor-clearfix">
						<h2>CDC 是什麼？</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>在資料庫領域中，<strong>CDC（Change Data Capture）</strong>是一種設計模式，能在資料異動時，依時序記錄狀態與內容，用以實現資料同步，也常應用於資料轉移、備份與災難復原等情境。</p>
<p>在資料倉儲環境中，企業整合異質資料來源時，需追蹤資料異動並記錄狀態，協助後續的梳理與應用，這正是資訊部門的日常核心工作之一。</p>
<p>以金融或製造業為例，作業流程持續優化的同時，還需降低對核心系統的衝擊，才能因應數位轉型下，大數據與商務分析的挑戰。</p>
<p>雖然資料同步是目標，但實作方式與工具不只一種。資訊部門須考量資料庫支援度、系統負載、同步即時性等條件，選出最適合的技術路徑。</p>
<p>當越來越多資料庫導入進階 CDC 功能，也讓企業意識到需要尋找更高效的資料同步解決方案。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>CDC 怎麼做？三種方法與挑戰</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p data-start="34" data-end="104">為了實現  CDC 功能，必須先能監控資料庫，並確保每筆交易都具備完整的日期與時間記錄。</p>
<p data-start="106" data-end="147">在介紹 CDC 的推薦方案之前，先來看看常見的<span data-start="130" data-end="140">資料同步方式</span>與挑戰：</p>
<h3><strong style="text-transform: initial;" data-start="152" data-end="163">1、應用程式層紀錄</strong></h3>
<ul data-start="288" data-end="400">
<li><span style="text-transform: initial;">作法：由應用程式或小型腳本自行記錄交易日誌，方便後續查詢與比對。</span></li>
<li><span style="text-transform: initial;">優點：高度客製化、彈性強。</span></li>
<li><span style="text-transform: initial;">缺點：需求一旦變動，就必須修改程式碼，維護成本高</span></li>
</ul>
<h3 style="text-transform: initial; display: inline !important;" data-start="264" data-end="284"><strong data-start="264" data-end="282">2、資料庫 Trigger 機制</strong></h3>
<ul>
<li><span style="text-transform: initial;">作法：</span><span style="text-transform: initial;">在資料表發生異動時，自動觸發記錄。</span></li>
<li>優點：可即時捕捉資料變化。</li>
<li>缺點：屬於侵入式作法，容易造成大量交易記錄，占用儲存與運算資源；若 Trigger 未正確啟用，會增加同步流程複雜度。</li>
</ul>
<div>
<h3 style="text-transform: initial; display: inline !important;" data-start="405" data-end="418"><strong data-start="405" data-end="416">3、資料庫日誌擷取<br /></strong></h3>
<ul>
<li><span style="text-transform: initial;">作法：直接從資料庫日誌（如 Postgres 的 WAL、 MySQL 的 BinLog 、MongoDB 的 oplog）擷取異動資料。</span></li>
<li><span style="text-transform: initial;">優點：相對可靠，可完整掌握特定時序的異動。</span></li>
<li><span style="text-transform: initial;">缺點：不同資料庫的日誌管理方式差異大，例如初始日誌所需資源、透過 redo log 訪查的配套機制，都需額外評估。</span></li>
</ul>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading --></p>
<h2>透過開源方案實現 CDC</h2>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>那企業在評估數據整合時，下一步該怎麼開始？</p>
<p>可以先從商業版資料庫提供的解決方案開始考量，例如 Oracle GoldenGate 和 Greenplum Streaming Server 都支援 CDC 功能，並提供相應的配套機制。</p>
<p>若企業在移植前已充分評估各項需求，並具備開源工具的導入經驗，想以開源方案作為橋接，那麼 Kafka 搭配 Debezium 會是值得考慮的選項。</p>
<p>此外，<a href="https://www.omniwaresoft.com.tw/edb/" target="_blank" rel="noopener">EDB</a> 也提供 PostgreSQL 的 CDC 解決方案，可以與 Debezium 和 Kafka 無縫整合，提供更強大的功能和更可靠的性能。</p>
<p><!-- /wp:paragraph --></p>
<p><!-- wp:heading {"level":3,"style":{"typography":{"fontSize":18}}} --></p>
<h3 style="font-size: 18px;"><span style="color: #000000;"><a style="color: #000000;" href="https://www.omniwaresoft.com.tw/product-news/kafka-news/kafka-introduction/" target="_blank" rel="noopener">KAFKA</a> </span></h3>
<p><!-- /wp:heading --></p>
<p><!-- wp:paragraph --></p>
<p>Kafka 是一套開源的事件串流平台，提供大規模的訊息佇列服務。</p>
<p>憑藉分散式架構，它每分鐘可處理數十億條串流事件，有效支援即時資料處理平台的建置。<span style="text-transform: initial;">由於具備以下功能特性，Kafka 也非常適合用於 CDC 的基礎服務場景：</span></p>
<ul>
<li><span style="text-transform: initial;">支援 Key-Value 時序式的連續資料</span></li>
<li><span style="text-transform: initial;">Pull-based 拉取資料來源後可引導至後端資料庫</span></li>
<li style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">支援橫向延展擴充以避免單節點錯誤的威脅</li>
</ul>
<div>
<section class="elementor-section elementor-top-section elementor-element elementor-element-471061fd elementor-section-boxed elementor-section-height-default elementor-section-height-default" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); --flex-direction: initial; --flex-wrap: initial; --justify-content: initial; --align-items: initial; --align-content: initial; --gap: initial; --flex-basis: initial; --flex-grow: initial; --flex-shrink: initial; --order: initial; --align-self: initial; align-self: auto; flex: 0 1 auto; order: 0; --widgets-spacing: 20px 20px; --widgets-spacing-row: 20px; --widgets-spacing-column: 20px;" data-particle_enable="false" data-particle-mobile-disabled="false" data-id="471061fd" data-element_type="section">
<div class="elementor-container elementor-column-gap-thegem" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">
<div class="elementor-row" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">
<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7e15f9eb" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); --flex-direction: initial; --flex-wrap: initial; --justify-content: initial; --align-items: initial; --align-content: initial; --gap: initial; --flex-basis: initial; --flex-grow: initial; --flex-shrink: initial; --order: initial; --align-self: initial; align-self: auto; flex: 0 1 auto; order: 0; --widgets-spacing: 20px 20px; --widgets-spacing-row: 20px; --widgets-spacing-column: 20px; width: 909px;" data-id="7e15f9eb" data-element_type="column">
<div class="elementor-widget-wrap elementor-element-populated" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); width: 909px;">
<div class="elementor-element elementor-element-219411df flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); --flex-direction: initial; --flex-wrap: initial; --justify-content: initial; --align-items: initial; --align-content: initial; --gap: initial; --flex-basis: initial; --flex-grow: initial; --flex-shrink: initial; --order: initial; --align-self: initial; align-self: auto; flex: 0 1 auto; order: 0; place-content: normal; align-items: normal; flex-flow: row; gap: normal; --widgets-spacing: 20px 20px; --widgets-spacing-row: 20px; --widgets-spacing-column: 20px; width: 867px;" data-id="219411df" data-element_type="widget" data-widget_type="text-editor.default">
<div class="elementor-widget-container" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); transition: background 0.3s, border 0.3s, border-radius 0.3s, box-shadow 0.3s, transform 0.4s;">
<div class="elementor-text-editor elementor-clearfix" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">
<div style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));"><span class="highlight" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">K8s 旨在幫助開發者建構大型服務時，有效管理成百上千台主機上容器間的通訊。</span></p>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); font-size: 18px;"><span style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">Kafka 還可以與</span><span style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));"> </span><a style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); text-transform: initial;" href="https://www.omniwaresoft.com.tw/elastic/" target="_blank" rel="noopener" data-wplink-edit="true">ELK Stack</a><span style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); text-transform: initial;"> 整合，實現 CDC 資料的實時監控和分析。</span></p>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">例如，可以利用 Logstash 從 Kafka 消費 CDC 事件，並將資料轉發至 Elasticsearch 進行索引與儲存。<span style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); text-transform: initial;">接著，透過 Kibana 對這些 CDC 資料進行視覺化與分析，像是資料變更趨勢、異常偵測與報表製作等。</span></p>
<p><span style="color: #ff0000;">推薦閲讀：</span><a href="https://www.omniwaresoft.com.tw/techcolumn/kafka-techcolumn/using-kafka-for-cdc-with-mongodb/" target="_blank" rel="noopener">運用 Kafka 實現 CDC 資料同步 – 以 MongoDB 為例</a></p>
<h3 class="wp-block-heading" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0))); font-size: 18px;"><span id="Debezium_%E8%B3%87%E6%96%99%E6%B5%81%E8%BC%B8%E5%87%BA%E9%96%8B%E6%BA%90%E5%B7%A5%E5%85%B7" class="ez-toc-section" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));"></span><span style="color: #000000;">Debezium </span></h3>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">Debezium 是一個專門處理 CDC 功能的開源軟體專案，支援多種資料庫來源，包括 Oracle、SQL Server、MySQL、PostgreSQL、MongoDB 等。透過這些連結器（Connector），Debezium 能即時串接並擷取前端資料來源的變動資料。</p>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">擷取到的資料會被傳送至 Kafka 集群，形成事件流，並可依需求導入或調度至後端系統，如 Greenplum、Elasticsearch、MongoDB 等，以實現資料同步與整合。</p>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">在使用 Debezium 和 Kafka 進行 CDC 時，安全性非常重要。<a style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));" href="https://www.omniwaresoft.com.tw/hashicorp-vault/" target="_blank" rel="noopener">HashiCorp Vault</a> 可以幫助您保護 CDC 資料的安全性，</p>
<p style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));">像是使用 Vault 來管理資料庫連線憑證，並加密 CDC 資料流，就能達到防止敏感資料洩露的效果。</p>
<h2 class="wp-block-heading" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));"><span id="%E7%B5%90%E8%AA%9E" class="ez-toc-section" style="--_font-size: calc(8/(8 - 0)*1rem); --_line-height: clamp(1.1,-0.16666 * calc(8/(8 - 0)) + 1 + 2 * 0.3 + -1 * -0.16666,2 * 0.3 + 1); --_fluid-font-size: clamp(1rem * calc(9/(9 - 0)),calc((8/(8 - 0)/57.5*-22.5 - 9/(9 - 0)/57.5*-22.5 + 9/(9 - 0))*1rem + (8/(8 - 0)/57.5 - 9/(9 - 0)/57.5)*100vw),1rem * calc(8/(8 - 0)));"></span>結語</h2>
<p data-start="53" data-end="105">強化後的 CDC 功能，不僅讓資料同步與數據遷移更加簡單高效，也為資料整合的微服務化開啟了新的可能。</p>
<p data-start="107" data-end="205">借助 Kafka 與 Debezium 等開源工具，我們可以實際嘗試並驗證這些創新應用。隨著基於這些工具的商業產品生態持續擴展，也反映出企業對 CDC 與資料整合解決方案的投入與重視日益增加。</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>							</div>
										</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-e090586 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="e090586" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-323db87" data-id="323db87" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-6dc1998 flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-html" data-id="6dc1998" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<div style="text-align: left;">加入歐立威 LINE 好友，了解更多產品資訊<BR><BR>
  <a href="https://lin.ee/VCvhQSK" style="display: inline-block;" target="_blank"> 
    <img data-recalc-dims="1" width="1170" src="https://i0.wp.com/scdn.line-apps.com/n/line_add_friends/btn/zh-Hant.png?fit=1170%2C36&#038;ssl=1" alt="加入好友" height="36" border="0">
  </a>
</div>				</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">17788</post-id>	</item>
		<item>
		<title>《歐立威科技 2021 系列研討會》10/20 &#124; Kafka+Debezium CDC &#8211; 實時資料分析的前哨戰</title>
		<link>https://www.omniwaresoft.com.tw/all-events/kafka-event/kafka-debezium-webinar-211020/</link>
		
		<dc:creator><![CDATA[Omni]]></dc:creator>
		<pubDate>Mon, 04 Oct 2021 10:46:18 +0000</pubDate>
				<category><![CDATA[Kafka 活動]]></category>
		<category><![CDATA[Debezium]]></category>
		<category><![CDATA[Kafka]]></category>
		<category><![CDATA[Webinar]]></category>
		<guid isPermaLink="false">http://www.omniwaresoft.com.tw/?p=16163</guid>

					<description><![CDATA[透過 Kafka + Debezium 將交易型資料庫的更新資料快速傳輸到目的端供資料分析使用，甚至可供機器學習及 AI 做使用。讓資料流在管道中暢行無阻，讓資料分析猶如水龍頭般打開即用。]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="16163" class="elementor elementor-16163" data-elementor-post-type="post">
						<section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-3380dc20 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="3380dc20" data-element_type="section">
						<div class="elementor-container elementor-column-gap-thegem"><div class="elementor-row">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5ed7c93b" data-id="5ed7c93b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
						<div class="elementor-element elementor-element-23711b7d flex-horizontal-align-default flex-horizontal-align-tablet-default flex-horizontal-align-mobile-default flex-vertical-align-default flex-vertical-align-tablet-default flex-vertical-align-mobile-default elementor-widget elementor-widget-text-editor" data-id="23711b7d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
												<div class="elementor-text-editor elementor-clearfix">
						<p></p>
<p></p>
<p></p>
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex"><p></p>
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%"><p></p>
<figure class="wp-block-gallery aligncenter has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex"><p></p>
<figure class="wp-block-image size-full"><img data-recalc-dims="1" src="https://i0.wp.com/www.omniwaresoft.com.tw/wp-content/uploads/2021/10/2021-%E4%B8%8B%E5%8D%8A%E5%B9%B4-%E7%B7%9A%E4%B8%8A%E7%A0%94%E8%A8%8E%E6%9C%83cover-photo.jpg?w=1170&#038;ssl=1" alt="Debezium Webinar" class="wp-image-16160"></figure>
<p></p></figure>
<p></p></div>
<p></p></div>
<p></p>
<p></p>
<p>《免費報名》填寫回饋問卷再拿咖啡兌換券！</p>
<p></p>
<p></p>
<h2 class="wp-block-heading" style="font-size:24px"><strong>活動介紹:</strong></h2>
<p></p>
<p></p>
<p>傳統的資料流處理方式主要是透過批次的方式，從資料來源端匯出到目的端，在經過一定時間區間的資料累積後，將資料以日、月、年等時間段的批次一併匯出到資料倉儲或者資料湖。</p>
<p></p>
<p></p>
<p>以往或許因為資料分析的需求密度並不高，針對特定主題的 BI 分析最多也只需要日報表的程度，因此批次資料的處理方式已經可以滿足大部分的資料整合、分析需求。</p>
<p></p>
<p></p>
<p>然而面對資料更新頻率的高速增長，有許多資料分析場景要求更即時的用戶行為分析、客製化的商品推薦，為進一步提升 BI 的質與量，以串流的方式更快速處理資料的想法於焉而生。</p>
<p></p>
<p></p>
<p>但是對於許多熟悉關聯式資料庫及批次資料處理的企業來說，要如何實現這樣的轉變卻是模糊的。</p>
<p></p>
<p></p>
<p>Kafka + Debezium 正是在這樣的環境下誕生的解決方案，毋須將過去所熟悉的資料庫(MySQL、PostgreSQL、Oracle&#8230;)一把丟棄，而是透過 Kafka 及 Debezium CDC 的串流資料處理技術。將交易型資料庫的更新資料快速傳輸到目的端供資料分析使用，甚至可供機器學習及 AI 做使用。&nbsp;</p>
<p></p>
<p></p>
<p>本次研討會將分享如何透過 Kafka + Debezium，讓資料流在管道中暢行無阻，讓資料分析猶如水龍頭般打開即用。</p>
<p></p>
<p></p>
<h2 class="wp-block-heading" style="font-size:24px"><strong>活動議程:</strong></h2>
<p></p>
<p></p>
<figure class="wp-block-table">
<table>
<tbody>
<tr>
<td>
<p>時間</p>
</td>
<td>
<p>議程</p>
</td>
<td>
<p>講師</p>
</td>
</tr>
<tr>
<td>
<p>10:55~11:00</p>
</td>
<td>
<p>來賓報到</p>
</td>
<td>
<p>&#8211;</p>
</td>
</tr>
<tr>
<td>
<p>11:00~11:05</p>
</td>
<td>
<p>Opening</p>
</td>
<td>
<p>歐立威科技</p>
<p>技術顧問 Meso</p>
</td>
</tr>
<tr>
<td>
<p>11:05~12:00</p>
</td>
<td>Kafka+Debezium CDC &#8211; 實時資料分析的前哨戰</td>
<td>
<p>歐立威科技</p>
<p>技術顧問&nbsp;Meso</p>
</td>
</tr>
</tbody>
</table>
</figure>
<p></p>
<p></p>
<p>本活動完全免費並在線上進行，歡迎對 Kafka, Debezium&nbsp;有興趣的朋友參與，報名成功後會議連結會寄至報名信箱，請留意！**請以公司信箱報名以加速審核**</p>
<p></p>
<p></p>
<div class="wp-block-button aligncenter is-style-fill"><a class="wp-block-button__link has-vivid-green-cyan-background-color has-background wp-element-button" href="https://lihi1.com/MBCev/omnipost" target="_blank" rel="noreferrer noopener">立刻報名 <strong>&gt;&gt;</strong></a></div>
<p></p>
<p></p>
<p></p>							</div>
										</div>
				</div>
					</div>
		</div>
					</div></div>
		</section>
				</div>
		]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">16163</post-id>	</item>
	</channel>
</rss>
