{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "What is the best CDC tool for real-time analytics in 2026?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The best CDC tool depends on your architecture. Debezium is the gold standard for teams with existing Kafka infrastructure who need to fan out changes to multiple downstream systems. RisingWave is the better choice when you want CDC, real-time processing, and a serving layer in a single SQL-based system, with no Kafka required. Fivetran and Airbyte are designed for batch ELT to data warehouses, not real-time streaming."
}
},
{
"@type": "Question",
"name": "What is change data capture (CDC)?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Change data capture (CDC) is a technique that reads the database transaction log (WAL in PostgreSQL, binlog in MySQL) to capture every insert, update, and delete as it happens. This stream of changes can be delivered to analytics systems, caches, search indexes, or message brokers in near real time, without modifying application code."
}
},
{
"@type": "Question",
"name": "Does Debezium require Kafka?",
"acceptedAnswer": {
"@type": "Answer",
"text": "In its standard form, Debezium publishes CDC events to Apache Kafka. There is a Debezium Server project that can route events to other destinations (AWS Kinesis, Google Pub/Sub, HTTP), but the core deployment model assumes Kafka as the event bus. Teams who want CDC without Kafka typically use RisingWave, which has built-in CDC connectors for PostgreSQL, MySQL, MongoDB, and SQL Server."
}
},
{
"@type": "Question",
"name": "Can you do CDC without Kafka?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. RisingWave connects directly to PostgreSQL, MySQL, MongoDB, or SQL Server using built-in CDC connectors. You define a source in SQL and RisingWave reads the transaction log directly. No Kafka cluster, no Debezium deployment, and no Zookeeper required. Changes are available for querying via materialized views within seconds of being committed to the source database."
}
},
{
"@type": "Question",
"name": "What is the difference between Debezium and RisingWave for CDC?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Debezium is a pure CDC connector: it reads the database transaction log and publishes events to Kafka. It does not process or serve data. RisingWave is an integrated streaming database: it captures changes from the source database, processes them with incremental SQL materialized views, and serves results over the PostgreSQL wire protocol. Debezium is ideal when you have an existing Kafka ecosystem and multiple downstream consumers. RisingWave is ideal when you want one system to handle CDC, transformation, and serving."
}
}
]
}
Every analytics team has a version of the same problem: your production database has the freshest data in the company, but your analytics systems are always behind. The OLAP warehouse runs hourly ETL. The dashboard shows yesterday's numbers. The machine learning pipeline trains on last week's features.
Change data capture is the standard answer. Instead of periodic batch exports, you stream every database change in real time. The question in 2026 is not whether to use CDC, it is which CDC architecture is right for your use case.
The answer has gotten more complicated. The CDC tool market has split. On one side are pure connectors like Debezium that capture changes and publish them to Kafka. On the other side are integrated systems like RisingWave that capture changes and immediately process and serve them inside a single system. Each architecture makes very different trade-offs.
This guide compares the major CDC tools honestly, with a comparison table, concrete scenarios, and a frank assessment of when Debezium is still the right choice.
Why 2026 Is Different
Three things changed the CDC landscape between 2023 and 2026.
AI agents need fresh data. In 2023, most machine learning models were retrained on batch data. By 2026, AI agents query live data sources to make decisions and take actions. A fraud detection agent that acts on 30-minute-old features is less useful than one acting on changes from 30 seconds ago. CDC is the mechanism that keeps AI agents fed with current data.
The lakehouse became the default. Apache Iceberg is now the standard table format for data lakehouses, replacing Parquet files and Hive tables. CDC pipelines need to write to Iceberg, maintain upsert semantics in Iceberg tables, and do so without the small-file problem that plagues naive streaming writes. Not all CDC tools handle this equally.
Operational budgets shrank. The era of "throw infrastructure at it" ended. Teams are actively eliminating tool sprawl. A pipeline that requires Debezium, Kafka, Kafka Connect, Flink, and a serving layer is five systems to operate and monitor. Teams that can replace those five with one or two systems save money and reduce the blast radius when something fails.
These three forces are why the "integrated CDC" architecture has grown so quickly since 2024.
The Two CDC Architectures
Before comparing individual tools, it helps to understand the two fundamentally different architectures.
Architecture 1: CDC to Kafka (the connector model)
The classic CDC architecture treats CDC as a connector problem. A CDC tool reads the database transaction log and publishes events to Apache Kafka. Downstream consumers then read from Kafka topics to do analytics, feed search indexes, update caches, or trigger workflows.
PostgreSQL WAL
|
v
Debezium (CDC connector)
|
v
Apache Kafka (event bus)
|
v
Multiple consumers:
- Flink / Spark (processing)
- Elasticsearch (search)
- ClickHouse / Redshift (analytics)
- Application (notifications)
This architecture is excellent for fan-out: one source of changes reaching many consumers. It is also the most mature: Debezium has been production-hardened for nearly a decade.
The cost is infrastructure complexity. You need Kafka (with Zookeeper or KRaft), Kafka Connect workers, the Debezium connector JAR, schema registry, and then separate systems for processing and serving. Each layer requires configuration, monitoring, and a team member who understands it.
Architecture 2: Integrated CDC (the streaming database model)
The integrated CDC architecture collapses the connector, event bus, processing engine, and serving layer into one system. You connect RisingWave directly to your source database. It reads the transaction log, processes changes with SQL materialized views, and serves results over the PostgreSQL wire protocol.
PostgreSQL WAL
|
v
RisingWave (captures, processes, serves)
- Built-in CDC connector
- Incremental materialized views
- PostgreSQL-compatible serving
|
v
Applications query via SQL
This architecture is excellent when you want to minimize operational footprint and your processing requirements are expressible in SQL. The trade-off: you are committing to RisingWave as your unified CDC, processing, and serving layer. Fan-out to other systems is possible through sinks, but the architecture is designed around a single destination.
CDC Tool Comparison Table
| Tool | Type | License | Latency | Kafka required | Transformation | AI integration | CDC sources |
| Debezium | Pure connector | Apache 2.0 | Sub-second | Yes (standard) | None (WAL events only) | Via downstream consumers | PostgreSQL, MySQL, MongoDB, Oracle, SQL Server, and more |
| RisingWave | Streaming database | Apache 2.0 | Sub-second | No | Full SQL (joins, aggregations, windowing) | MCP server, vector support, openai_embedding() | PostgreSQL, MySQL, MongoDB, SQL Server |
| Airbyte | ELT platform | MIT / ELT-focused | Minutes to hours | No | ELT transformations | Limited | 300+ sources |
| Fivetran | Managed ELT | Commercial | 5-30 minutes | No | dbt transformations | Limited | 300+ connectors |
| AWS DMS | Migration service | Commercial | Seconds to minutes | No | Limited | AWS-only | Most major databases |
| Flink CDC | Processing framework | Apache 2.0 | Sub-second | No (optional) | Full (Java/SQL) | Via ecosystem | PostgreSQL, MySQL, MongoDB, and more |
Latency definitions
"Sub-second" means the time between a database transaction committing and the change being available in the downstream system. For CDC-to-Kafka pipelines (Debezium), sub-second latency applies to Kafka delivery. Processing and serving add additional latency depending on downstream tools. For integrated systems (RisingWave), sub-second latency applies to the materialized view being updated and queryable.
Tool-by-Tool Breakdown
Debezium
Debezium is the de facto standard for open source CDC. It connects to the database transaction log and publishes every change as a structured event to a Kafka topic. The Debezium project supports PostgreSQL, MySQL, MongoDB, Oracle, SQL Server, Db2, and more. It has been deployed in production at scale since 2016.
Genuine strengths: Debezium handles edge cases that are hard to get right: database restarts, failover, DDL changes, partial snapshots, heartbeat events for detecting stuck connectors. The community is large and the documentation is excellent. If you have an unusual database configuration, Debezium probably has a solution or a workaround.
Real limitations: Debezium is a connector, not a processing engine. It delivers events; it does not analyze them. Building a real-time analytics dashboard on top of Debezium requires Kafka, a stream processor (Flink or Spark Streaming), and a serving database. That is three additional systems before a user can run a query.
The standard Debezium deployment also requires Kafka. Kafka is excellent infrastructure, but it has real operational cost: brokers, Zookeeper (or KRaft), topic management, consumer group monitoring, and schema registry. For teams without existing Kafka investment, this is a significant commitment.
When Debezium is the right choice: Any team with existing Kafka infrastructure that needs to fan out database changes to multiple downstream consumers (analytics, search, cache, notifications all at once). The connector-to-Kafka model is purpose-built for this pattern.
Airbyte
Airbyte is an open source ELT platform focused on syncing data between sources and destinations. It has over 300 connectors and a good UI for managing connections. Airbyte supports CDC mode for some database sources, using Debezium internally.
Airbyte is not designed for real-time streaming. It is designed for loading data into data warehouses in near-real-time to batch mode. Sync latency is typically measured in minutes to hours. If your use case is "load PostgreSQL data into Snowflake or BigQuery on a frequent schedule," Airbyte is a reasonable choice. If your use case is sub-second real-time analytics, Airbyte is not the right tool.
Fivetran
Fivetran is a commercial managed ELT platform with a strong reputation for reliability and ease of setup. Connectors are fully managed, highly polished, and SOC 2 certified. Fivetran is widely used for syncing SaaS data (Salesforce, HubSpot, Stripe) into Snowflake or BigQuery.
Like Airbyte, Fivetran is optimized for batch-oriented ELT, not real-time streaming. Sync frequency for most connectors is measured in minutes. It is not a CDC tool for real-time analytics in the sub-second sense. Fivetran is excellent for what it does; it is just not in the same category as Debezium or RisingWave for real-time use cases.
AWS Database Migration Service
AWS DMS is designed primarily for one-time or ongoing database migration within the AWS ecosystem. It supports CDC mode for continuous replication. Latency can be seconds to a few minutes.
AWS DMS works well for migrating to AWS-native services (RDS, Aurora, Redshift, S3). Its transformation capabilities are limited. It requires AWS, which limits portability. Teams looking for a general-purpose CDC solution outside of an AWS-centric architecture typically find better options elsewhere.
Apache Flink with Flink CDC
Flink CDC (the Flink connector for CDC) allows Apache Flink to read directly from database transaction logs without Kafka as an intermediary. Flink then processes those events with its full streaming API: joins, aggregations, pattern matching, windowing.
Flink CDC is a legitimate alternative to the Debezium-plus-Kafka stack for teams that already run Flink. The trade-off is that Flink is a complex system. It requires JVM expertise, careful checkpoint configuration, state backend management (RocksDB for production), and a Flink cluster (JobManager, TaskManagers). The SQL surface area is more limited than RisingWave's PostgreSQL-compatible SQL.
RisingWave
RisingWave is an open source streaming database with built-in CDC connectors. It connects directly to PostgreSQL, MySQL, MongoDB, and SQL Server without Kafka or Debezium. Changes are captured from the transaction log and immediately processed by SQL materialized views. Results are served over the PostgreSQL wire protocol on port 4566, which means any PostgreSQL client (psql, Metabase, Grafana, dbt) connects to RisingWave the same way it connects to a regular database.
RisingWave is Apache 2.0 licensed and available as a managed cloud service (RisingWave Cloud) or self-hosted.
How RisingWave CDC Works End-to-End
Here is a complete CDC pipeline from PostgreSQL to real-time analytics in RisingWave, with no Kafka or Debezium required.
Step 1: Create a CDC source
-- Connect RisingWave to your PostgreSQL database
CREATE SOURCE pg_cdc_source WITH (
connector = 'postgres-cdc',
hostname = 'prod-db.internal',
port = '5432',
username = 'cdc_user',
password = '${PG_PASSWORD}',
database.name = 'ecommerce',
slot.name = 'risingwave_slot'
);
PostgreSQL requires logical replication to be enabled (wal_level = logical) and a replication slot. MySQL CDC works similarly using the binlog.
Step 2: Map upstream tables to RisingWave
-- Map specific tables from the CDC source
CREATE TABLE orders FROM SOURCE pg_cdc_source TABLE 'public.orders' (
id BIGINT PRIMARY KEY,
customer_id BIGINT,
total DECIMAL(12, 2),
status VARCHAR,
created_at TIMESTAMPTZ,
updated_at TIMESTAMPTZ
);
CREATE TABLE order_items FROM SOURCE pg_cdc_source TABLE 'public.order_items' (
id BIGINT PRIMARY KEY,
order_id BIGINT,
product_id BIGINT,
product_name VARCHAR,
quantity INT,
unit_price DECIMAL(10, 2)
);
CREATE TABLE products FROM SOURCE pg_cdc_source TABLE 'public.products' (
id BIGINT PRIMARY KEY,
name VARCHAR,
category VARCHAR,
cost DECIMAL(10, 2)
);
Step 3: Build real-time analytics with materialized views
-- Real-time order revenue by status, updated incrementally
CREATE MATERIALIZED VIEW order_revenue_by_status AS
SELECT
o.status,
COUNT(DISTINCT o.id) AS order_count,
SUM(oi.quantity * oi.unit_price) AS total_revenue,
AVG(oi.quantity * oi.unit_price) AS avg_order_value,
MAX(o.updated_at) AS last_updated
FROM orders o
JOIN order_items oi ON o.id = oi.order_id
GROUP BY o.status;
-- Real-time category-level margin analysis
CREATE MATERIALIZED VIEW category_margins AS
SELECT
p.category,
COUNT(DISTINCT oi.order_id) AS order_count,
SUM(oi.quantity * oi.unit_price) AS revenue,
SUM(oi.quantity * p.cost) AS cost,
SUM(oi.quantity * (oi.unit_price - p.cost)) AS gross_profit
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY p.category;
These materialized views update incrementally. When an order row changes in PostgreSQL, RisingWave processes only the changed rows, not the full table scan. Results are always consistent with committed database state.
Step 4: Query via any PostgreSQL client
# Connect with psql on port 4566
psql -h risingwave-host -p 4566 -U root
-- Dashboards query the materialized view directly
SELECT status, order_count, total_revenue
FROM order_revenue_by_status
ORDER BY total_revenue DESC;
status | order_count | total_revenue
------------+-------------+---------------
completed | 14823 | 2847392.50
processing | 3241 | 612384.00
placed | 1105 | 198432.75
cancelled | 412 | 73210.00
Step 5: Sink to Apache Iceberg for the lakehouse
-- Sink processed results to Apache Iceberg for historical analysis
CREATE SINK category_margins_iceberg FROM category_margins
WITH (
connector = 'iceberg',
type = 'upsert',
database.name = 'analytics',
table.name = 'category_margins',
catalog.type = 'glue',
warehouse.path = 's3://data-lake/warehouse',
s3.region = 'us-east-1',
primary_key = 'category'
);
The complete pipeline: PostgreSQL commits a transaction, RisingWave captures the WAL change, updates the materialized view incrementally, and the updated result is both queryable via SQL and sinking to Iceberg. No Kafka cluster, no Debezium deployment, no Flink job.
Replacing Debezium and Kafka with RisingWave: a Migration Example
Here is a common stack that teams migrate away from:
Before (five-system pipeline):
- PostgreSQL (source)
- Debezium (CDC connector, deployed via Kafka Connect)
- Kafka (event bus, 3+ brokers)
- Apache Flink (stream processing)
- Serving database (ClickHouse or PostgreSQL replica)
After (two-system pipeline):
- PostgreSQL (source, unchanged)
- RisingWave (CDC, processing, serving)
The Debezium configuration that set up a PostgreSQL CDC connector:
{
"name": "pg-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"database.hostname": "prod-db.internal",
"database.port": "5432",
"database.user": "cdc_user",
"database.password": "${PG_PASSWORD}",
"database.dbname": "ecommerce",
"plugin.name": "pgoutput",
"slot.name": "debezium_slot",
"topic.prefix": "ecommerce"
}
}
The Flink SQL that processed Kafka events:
-- Flink SQL (requires Kafka source, separate job submission)
CREATE TABLE kafka_orders (
id BIGINT,
customer_id BIGINT,
total DECIMAL(12, 2),
status STRING,
updated_at TIMESTAMP(3),
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'kafka',
'topic' = 'ecommerce.public.orders',
'properties.bootstrap.servers' = 'kafka:9092',
'format' = 'debezium-json'
);
INSERT INTO serving_db_orders
SELECT id, customer_id, total, status, updated_at
FROM kafka_orders;
The equivalent in RisingWave (one system, one language):
-- RisingWave SQL (entire pipeline)
CREATE SOURCE pg_cdc_source WITH (
connector = 'postgres-cdc',
hostname = 'prod-db.internal',
port = '5432',
username = 'cdc_user',
password = '${PG_PASSWORD}',
database.name = 'ecommerce',
slot.name = 'risingwave_slot'
);
CREATE TABLE orders FROM SOURCE pg_cdc_source TABLE 'public.orders' (
id BIGINT PRIMARY KEY,
customer_id BIGINT,
total DECIMAL(12, 2),
status VARCHAR,
updated_at TIMESTAMPTZ
);
-- Results are immediately queryable; no separate serving DB required
CREATE MATERIALIZED VIEW recent_order_status AS
SELECT id, customer_id, total, status, updated_at
FROM orders
WHERE updated_at > NOW() - INTERVAL '24 hours';
The trade-off is real: if you need to fan out CDC events to Elasticsearch, ClickHouse, and a notification service simultaneously, Kafka is a better message bus than RisingWave's sink connectors. Debezium plus Kafka is built for that pattern.
When Debezium Is Still the Right Choice
This guide is honest: Debezium is the better choice in several scenarios, and pretending otherwise would be misleading.
You have existing Kafka infrastructure. If your team already runs Kafka for event streaming, the incremental cost of adding Debezium as a CDC source is low. You already understand Kafka operations, and your consumers already read from Kafka topics. Replacing this with RisingWave means learning a new system and migrating existing consumers.
You need to fan out to many downstream systems. Kafka excels at the publish-subscribe pattern. One Debezium source can feed dozens of consumers: ClickHouse for analytics, Elasticsearch for search, Redis for caching, a notification service, a data lake. Each consumer reads from the same Kafka topic independently. RisingWave's sink connectors can replicate this to multiple destinations, but the Kafka model is more flexible for arbitrary fan-out.
Your processing is not expressible in SQL. Debezium events consumed by Flink give you access to the full Flink API: Java operators, custom windowing, complex event processing, machine learning integration. If your stream processing requirements go beyond what SQL can express, the Debezium-to-Flink pipeline gives you more raw power.
You rely on Debezium's connector breadth. Debezium supports Oracle, Db2, and other databases that RisingWave does not yet support natively. If your source is Oracle, Debezium is your primary option.
Scenarios: Which Tool for Which Use Case?
| Scenario | Recommended tool | Why |
| Real-time dashboard on PostgreSQL data | RisingWave | No Kafka needed, materialized views serve the dashboard directly |
| Fan-out from MySQL to 5+ consumers | Debezium + Kafka | Pub-sub fan-out is Kafka's core strength |
| CDC to Apache Iceberg with upserts | RisingWave | Built-in Iceberg sink with upsert support |
| Hourly data warehouse sync | Airbyte or Fivetran | These are built for batch ELT to warehouses |
| Oracle source to Kafka | Debezium | RisingWave does not yet support Oracle CDC natively |
| AI agent needing fresh feature data | RisingWave | Materialized views via MCP server, sub-second freshness |
| Migration to AWS services | AWS DMS | Deep AWS integration for migration use cases |
| Complex stateful stream processing with custom Java logic | Debezium + Flink | Flink's Java API is more expressive than SQL |
| PostgreSQL/MySQL/MongoDB CDC without Kafka | RisingWave | Built-in CDC connectors, no broker required |
Key Takeaways
CDC in 2026 is no longer one tool but two architectures: connector-to-Kafka and integrated streaming database. The right choice depends on your existing infrastructure, your downstream consumers, and how much operational complexity you can absorb.
Debezium is battle-tested, Apache-licensed, and the right choice for teams with Kafka investment who need multi-destination fan-out or sources that RisingWave does not yet support.
RisingWave's integrated CDC eliminates the Kafka, Debezium, and separate serving layer for teams that want sub-second freshness, SQL-based processing, and PostgreSQL-compatible serving in one system. It is the right choice when your use case is "capture changes, process them with SQL, serve results to applications and dashboards."
The clearest signal for which architecture you need: if you are asking "how do I fan out this CDC stream to ten different consumers," Kafka is the right answer. If you are asking "how do I build a real-time analytics layer on top of my production database," RisingWave is the right answer.
Try RisingWave CDC today. RisingWave Cloud is free to start, no credit card required. Sign up here.
Join the Slack community to ask questions about CDC architectures and connect with teams who have made the switch.

