2025년 1월 6일 작성
ksqlDB - Kafka 기반의 Streaming Database
ksqlDB는 streaming data를 실시간으로 처리하고 분석할 수 있는 Kafka 기반 event streaming database입니다.
ksqlDB : Kafka Event Streaming Database
- ksqlDB는 Apache Kafka를 위해 특별히 설계된 database로, streaming data를 실시간으로 처리하고 분석할 수 있는 event streaming database입니다.
- Confluent에서 만든 streaming processing tool입니다.
- SQL과 유사한 문법을 사용하여 Kafka의 streaming data를 쉽게 처리할 수 있게 해줍니다.
- ksqlDB는 Kafka 생태계의 주된 제품인 Kafka Streams와 Kafka Connect를 활용하여 만들어졌으며, 따라서 동작도 해당 제품들의 원리를 따릅니다.
- ksqlDB의 주 동작은 SQL을 변환하여 Kafka Streams와 Kafka Connect의 기능을 사용해 사용자가 원하는 결과를 만드는 것입니다.
- ksqlDB는 실시간 data processing, streaming 분석, Event 기반 application 개발 등의 다양한 용도로 활용할 수 있습니다.
- 특히 microservice architecture에서 event 중심의 data 처리가 필요한 경우에 유용하게 사용됩니다.
ksqlDB의 특징
- Stream 처리 중심 설계 : 실시간으로 흐르는 data를 지속적으로 처리할 수 있습니다.
- event 시간 기반의 Window 처리를 지원하여 시계열 분석이 가능합니다.
- Stream과 Table이라는 두 가지 주요 추상화를 제공합니다.
- SQL 기반 Interface : 기존 SQL 개발자들이 쉽게 적응할 수 있는 친숙한 문법을 제공합니다.
- 복잡한 stream 처리 logic을 간단한 SQL문으로 표현할 수 있습니다.
- SELECT, CREATE, INSERT 등 표준 SQL 명령어를 지원합니다.
- 확장성과 신뢰성 : Kafka의 분산 architecture를 기반으로 하여 높은 확장성을 제공합니다.
- 장애 발생 시에도 data 손실 없이 처리할 수 있는 내결함성을 갖추고 있습니다.
- 수평적 확장이 용이하여 대규모 data 처리가 가능합니다.
- 실시간 처리 기능 : millisecond 단위의 지연 시간으로 data를 처리할 수 있습니다.
- Push query를 통해 실시간 update를 구독할 수 있습니다.
- streaming ETL, 실시간 monitoring 등 다양한 usecase를 지원합니다.
- 통합 개발 환경 : REST API를 통한 programming 성격의 접근이 가능합니다.
- 다양한 data 포맷(JSON, Avro, Protobuf 등)을 지원합니다.
- 내장된 connector를 통해 외부 system과의 통합이 용이합니다.
- 상태 관리 : 지속적인 query 처리를 위한 상태 저장소를 제공합니다.
- 분산 환경에서도 일관된 상태 관리가 가능합니다.
- 장애 복구 시 상태를 자동으로 복구할 수 있습니다.
ksqlDB의 주요 개념
-
KSQL : ksqlDB에서 사용하는 SQL style의 query 언어입니다.
- Stream : Kafka topic의 message stream을 나타내며, 실시간으로 data가 추가되는 무한한 sequence입니다.
- stream은 data의 흐름을 나타내며, 이를 통해 실시간으로 data를 처리하고 분석할 수 있습니다.
- ksqlDB에서 data는 Stream 단위로 처리됩니다.
- Table : Stream의 상태를 나타내는 View입니다.
- stream의 data를 table 형태로 변환하여 상태를 유지하고, 이력을 추적할 수 있습니다.
- table은 stream의 data를 query하여 실시간으로 조회하거나 분석할 수 있습니다.
- Persistent Query : 한 번 실행되면 종료하지 않고 지속적으로 실행되는 영구 query입니다.
- 새로운 data가 들어올 때마다 자동으로 처리하여 결과를 update합니다.
CREATE STREAM AS SELECT
또는CREATE TABLE AS SELECT
문으로 생성됩니다.
- Push & Pull Query : ksqlDB에서 제공하는 두 가지 유형의 query 방식입니다.
- Push Query는 실시간으로 update되는 결과를 지속적으로 받아보는 query입니다.
- Pull Query는 특정 시점의 현재 상태만을 조회하는 일회성 query입니다.
- Windowing : 시간을 기준으로 data를 grouping하여 처리하는 기능입니다.
- Tumbling Window는 고정된 시간 간격으로 data를 분할합니다.
- Hopping Window는 일정 시간 간격으로 이동하면서 겹치는 구간을 처리합니다.
- Session Window는 event 발생 시간을 기준으로 session 단위로 처리합니다.
- Connector : 외부 system과 ksqlDB를 연결하는 component입니다.
- Source Connector는 외부 system의 data를 ksqlDB로 가져옵니다.
- Sink Connector는 ksqlDB의 처리 결과를 외부 system으로 내보냅니다.
- Materialized View : stream 처리 결과를 저장하고 유지하는 특별한 형태의 table입니다.
- 실시간으로 update되며, 빠른 조회가 가능합니다.
- 주로 집계(group by)나 Join 연산의 결과를 caching하는 용도로 사용됩니다.
- Schema Registry : data의 schema 정보를 중앙에서 관리하는 system입니다.
- schema version 관리와 호환성 검사를 제공합니다.
- Avro, Protobuf, JSON Schema 등의 형식을 지원합니다.
KSQL과 SQL의 차이점
특징 | KSQL | SQL |
---|---|---|
Data 모델 | Stream(무한 Sequence)과 Table 중심 | Table 중심의 관계형 모델 |
처리 방식 | 연속적인 실시간 처리 (Continuous Processing) | 요청 시점의 일회성 처리 (Request-Response) |
Query 실행 | 지속적으로 실행되며 결과가 계속 update됨 | 한 번 실행되고 결과가 즉시 반환됨 |
시간 개념 | event 시간과 처리 시간을 모두 고려함 | query 실행 시점의 현재 상태만 고려함 |
Join 연산 | Stream-Stream, Stream-Table, Table-Table Join 지원 | Table-Table Join만 지원 |
Window 처리 | 시간 기반 Window 연산 기본 제공 | Window 함수는 제한적으로 제공 |
상태 관리 | 분산 상태 저장소 필수 | Transaction 기반 상태 관리 |
확장성 | 수평적 확장 용이 (Kafka 기반) | 수직적 확장 중심 |
Data 보존 | event 기록 영구 보존 가능 | 최신 상태만 유지 |
Transaction | 제한적인 Transaction 지원 | ACID Transaction 완벽 지원 |
사용 사례 | 실시간 분석, event 처리, streaming ETL | business data 관리, 보고서 생성, OLTP/OLAP |
Schema | schema 진화 지원 | 엄격한 schema 제약 |
ksqlDB Architecture Component
---
title: ksqlDB Architecture Summary
---
flowchart TB
subgraph ksqldb["ksqlDB Cluster"]
direction TB
server["ksqlDB Server"]
streams["Kafka Streams"]
state["State Store"]
server --> streams
streams --> state
end
subgraph kafka["Apache Kafka Cluster"]
topics["Kafka Topics"]
cmd["Command Topic"]
log["Processing Log"]
end
subgraph external["External Systems"]
source["Source Systems"]
sink["Sink Systems"]
end
pull["Pull Query"]
push["Push Query"]
source --> kafka
kafka --> sink
kafka <--> ksqldb
pull --> server
push --> server
- ksqlDB server : ksqlDB의 핵심 실행 engine입니다.
- REST API endpoint를 제공하여 query 실행과 stream 처리를 담당합니다.
- 여러 server를 cluster로 구성하여 고가용성과 확장성을 제공합니다.
- Kafka Streams : ksqlDB의 기반이 되는 stream processing engine입니다.
- 상태 저장소(State Store)를 관리하고 stream processing logic을 실행합니다.
- 장애 복구와 scaling을 자동으로 처리합니다.
- Apache Kafka : event storage로 활용됩니다.
- topic을 통해 data를 영구 저장하고 streaming합니다.
- source connector와 sink connector를 통해 외부 system과 통합됩니다.
- Command Topic : ksqlDB query와 application 상태를 저장합니다.
- cluster 내 server 간 동기화에 사용됩니다.
- DDL 명령어와 persistent query 정보를 보관합니다.
- Processing Log : stream 처리 중 발생하는 오류와 예외를 기록합니다.
- debugging과 monitoring에 활용됩니다.
- Kafka topic에 저장되어 추후 분석이 가능합니다.
- Pull/Push Query : data를 조회하는 질의문입니다.
- Pull Query : 특정 시점의 상태를 조회하는 요청-응답 방식의 query입니다.
- Push Query : 지속적으로 결과를 streaming하는 실시간 query입니다.
---
title: Component 간 관계 및 상세 설명
---
flowchart TB
client["Client Applications"]
subgraph ksqldb["ksqlDB Cluster"]
subgraph servers["ksqlDB Servers"]
server1["Server Node 1<br/>(SQL Query 처리, Stream 처리 관리)"]
server2["Server Node 2<br/>(고가용성을 위한 복제 Node)"]
server3["Server Node N<br/>(필요에 따라 수평적 확장 가능)"]
server1 -.- server2 -.- server3
end
subgraph processing["Stream Processing Layer"]
streams["Kafka Streams<br/>(실시간 Stream Processing Engine)"]
state["Local State Store<br/>(집계, Join 상태 저장)"]
changelog["Changelog Topics<br/>(상태 변경 기록)"]
end
rest_api["REST API Layer<br/>(HTTP Endpoint)"]
end
subgraph kafka["Apache Kafka Cluster"]
topics["Data Topics<br/>(Stream, Table data 저장)"]
cmd["Command Topic<br/>(DDL/DML 명령 저장 및 복제)"]
log["Processing Log Topic<br/>(처리 기록 및 Monitoring data)"]
internal["Internal Topics<br/>(System 내부 data 저장)"]
end
subgraph registry["Schema Registry"]
schema["Schema Storage<br/>(Avro, Protobuf, JSON Schema)"]
validation["Schema Validation<br/>(호환성 검사)"]
end
subgraph queries["Query Types"]
pull["Pull Queries<br/>(현재 상태 조회)"]
push["Push Queries<br/>(연속적 결과 구독)"]
end
subgraph external["External Systems"]
source["Source Systems<br/>(Producer : DB, Sensor, Application 등)"]
sink["Sink Systems<br/>(Consumer : DB, Dashboard, 알림 등)"]
end
source -->|"원본 data<br/>(JSON, Avro, Protobuf)"| topics
source -.->|"schema 등록/조회"| schema
topics -->|"처리된 data<br/>(Stream/Table)"| sink
sink -.->|"Schema 조회"| schema
streams -->|"처리 결과<br/>(집계, 변환된 data)"| topics
topics -->|"원본 data<br/>(Stream/Table)"| streams
streams -.->|"schema 검증"| validation
streams -->|"상태 data<br/>(집계 값, Window 결과)"| state
state -->|"저장된 상태<br/>(조회/갱신)"| streams
state -->|"상태 변경 event"| changelog
changelog -->|"상태 backup data"| internal
internal -->|"상태 복구 data"| state
cmd -->|"SQL 명령<br/>(CREATE, INSERT 등)"| servers
servers -->|"처리 현황 및 Error"| log
servers -->|"실행 계획<br/>(Topology)"| streams
servers -.->|"Schema 관리"| schema
pull & push & client <--> rest_api
client <--> rest_api
rest_api <--> servers