본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Debezium DB2 커넥터

원문 보기 위키 갱신

Debezium DB2 커넥터 (camel-debezium-db2)

Debezium DB2 컴포넌트는 Kafka나 Kafka Connect 없이도 Debezium Engine으로 IBM Db2 데이터베이스의 Change Data Capture(CDC) 이벤트를 라우트로 흘려 보내는 컴포넌트예요. Camel 3.17부터 제공됐고, 컨슈머 전용이라서 from()으로 CDC 이벤트를 구독하는 방식으로 써요. 오프셋 저장, 스냅샷, 헬스 체크 같은 임베디드 엔진의 동작 방식도 그대로 노출해요.

출처: 문서

본문

Camel 3.17부터 지원

컨슈머만 지원해요

Debezium db2 컴포넌트는 Debezium을 Debezium Engine으로 감싼 래퍼(wrapper)예요. Kafka나 Kafka Connect 없이도 Debezium으로 db2 데이터베이스에서 Change Data Capture를 할 수 있게 해 줘요.

참고 장애 처리 관련 참고: Debezium Embedded Engine 문서에 따르면, 엔진은 소스 오프셋을 적극적으로 기록하고 이 오프셋을 주기적으로 영구 저장소에 플러시해요. 그래서 애플리케이션을 재시작하거나 크래시가 나도 엔진은 마지막으로 기록된 오프셋부터 이어서 처리해요. 정상 동작 중이라면 다운스트림 라우트는 각 이벤트를 정확히 한 번씩 받아요. 하지만 애플리케이션이 크래시로 죽은 경우(우아한 종료 없이) 재시작 직후에 중복 이벤트를 받을 수 있어요. 따라서 다운스트림 라우트는 이런 상황을 충분히 견딜 수 있어야 하고, 필요하면 이벤트를 중복 제거해야 해요.

엔진이 폴링을 시작하기 전에는 컨슈머 헬스 체크가 설정된 초기 상태(기본값 DOWN)를 보고해요. 커넥터 태스크가 시작되고 엔진이 폴링 단계에 들어가면, 변경 이벤트가 아직 하나도 도착하지 않았더라도 UP을 보고해요. 이건 초기 스냅샷이 끝났다는 뜻이 아니에요.

임베디드 엔진이 에러로 멈추면(예: 커넥터가 데이터베이스에 도달할 수 없거나 오프셋 저장소를 읽을 수 없을 때) 재시작되지 않아요. 라우트는 시작 상태로 남아 있지만 더 이상 이벤트를 받지 못해요. 장애는 컨슈머 예외 핸들러로 보고되고 라우트 헬스 체크를 DOWN으로 바꿔서, readiness 프로브가 감지할 수 있게 해 줘요.

Maven 사용자라면 이 컴포넌트를 위해 pom.xml에 다음 의존성을 추가해야 해요.

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-debezium-db2</artifactId>
    <version>x.x.x</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI 형식 (URI Format)

debezium-db2:name[?options]

옵션 설정 (Configuring Options)

Camel 컴포넌트는 서로 다른 두 단계로 설정해요:

  • 컴포넌트(component) 레벨

  • 엔드포인트(endpoint) 레벨

컴포넌트 옵션 설정 (Configuring Component Options)

컴포넌트 레벨에서는 엔드포인트들이 이어서 물려받는 일반적이고 공유되는 설정을 해요. 가장 상위의 설정 레벨이죠.

예를 들어 컴포넌트에는 보안 설정, 인증용 자격 증명, 네트워크 연결 URL 같은 것들이 있을 수 있어요.

컴포넌트에 따라 옵션이 몇 개뿐인 것도 있고 아주 많은 것도 있어요. 컴포넌트는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 몇 가지 옵션만 설정하거나 아예 하나도 건드리지 않아도 되는 경우가 많아요.

컴포넌트는 다음 방법으로 설정할 수 있어요:

  • Component DSL.

  • 설정 파일(application.properties, *.yaml 파일 등).

  • Java 코드에서 직접.

엔드포인트 옵션 설정 (Configuring Endpoint Options)

엔드포인트는 옵션이 많아서 설정에 시간을 더 쓰게 될 거예요. 이 옵션들이 엔드포인트가 원하는 일을 하도록 커스터마이즈해 줘요. 옵션은 엔드포인트가 컨슈머(from)로 쓰이는지, 프로듀서(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.

엔드포인트 설정은 대부분 엔드포인트 URI에 _path_와 query 파라미터로 바로 하는 경우가 많아요. Endpoint DSL과 DataFormat DSL을 쓰면 자바에서 엔드포인트와 데이터 포맷을 _타입 세이프_하게 설정할 수도 있어요.

옵션을 설정할 때 좋은 습관은 Property Placeholders를 사용하는 거예요.

프로퍼티 플레이스홀더는 이런 장점이 있어요:

  • URL, 포트 번호, 민감 정보 같은 설정을 코드에 하드코딩하는 걸 막아 줘요.

  • 설정을 코드 밖으로 분리할 수 있게 해 줘요.

  • 코드가 더 유연하고 재사용하기 좋아져요.

다음 두 섹션에서 모든 옵션을 나열해요. 먼저 컴포넌트 옵션, 그다음 엔드포인트 옵션 순서예요.

컴포넌트 옵션 (Component Options)

Debezium DB2 Connector 컴포넌트는 아래 나열된 옵션들을 지원해요.

Name Description Default Type
additionalProperties (common) camel 설정에 바로 넣을 수 없는 debezium 컴포넌트용 추가 프로퍼티예요(예: Debezium 엔진에 필요한 Kafka Connect 프로퍼티 설정, KafkaOffsetBackingStore 설정 같은 것). 프로퍼티에는 additionalProperties. 접두어를 붙여야 해요. 예: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro. additionalProperties. 접두어를 쓰는 멀티 밸류 옵션이에요. Map
bridgeErrorHandler (consumer) 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. false boolean
configuration (consumer) 미리 구성된 설정(Configuration)을 지정할 수 있게 해 줘요. Db2ConnectorEmbeddedDebeziumConfiguration
internalKeyConverter (consumer) 오프셋의 키 데이터를 직렬화하고 역직렬화할 때 사용할 Converter 클래스예요. 기본값은 JSON 컨버터예요. org.apache.kafka.connect.json.JsonConverter String
internalValueConverter (consumer) 오프셋의 값 데이터를 직렬화하고 역직렬화할 때 사용할 Converter 클래스예요. 기본값은 JSON 컨버터예요. org.apache.kafka.connect.json.JsonConverter String
offsetCommitPolicy (consumer) 커밋 정책의 Java 클래스 이름이에요. 처리한 이벤트 수와 마지막 커밋 이후 경과 시간을 기준으로 오프셋 커밋을 언제 트리거할지 정의해요. 이 클래스는 'OffsetCommitPolicy' 인터페이스를 구현해야 하고, 기본값은 시간 간격 기반의 주기적 커밋 정책이에요. String
offsetCommitTimeoutMs (consumer) 레코드를 플러시하고 파티션 오프셋 데이터를 오프셋 저장소에 커밋할 때까지 기다리는 최대 시간(밀리초)이에요. 이 시간을 넘기면 처리를 취소하고, 오프셋 데이터는 나중에 다시 커밋 시도로 돌려 놓아요. 기본값은 5초예요. 5000 long
offsetFlushIntervalMs (consumer) 오프셋 커밋을 시도하는 간격이에요. 기본값은 1분이에요. 60000 long
offsetStorage (consumer) 커넥터 오프셋의 영속화를 담당하는 Java 클래스 이름이에요. org.apache.kafka.connect.storage.FileOffsetBackingStore String
offsetStorageFileName (consumer) 오프셋을 저장할 파일 경로예요. offset.storage가 FileOffsetBackingStore로 설정되어 있으면 필수예요. String
offsetStoragePartitions (consumer) 오프셋 저장소 토픽을 만들 때 사용할 파티션 수예요. offset.storage가 'KafkaOffsetBackingStore'로 설정되어 있으면 필수예요. int
offsetStorageReplicationFactor (consumer) 오프셋 저장소 토픽을 만들 때 사용할 복제 계수예요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. int
offsetStorageTopic (consumer) 오프셋을 저장할 Kafka 토픽의 이름이에요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. String
autowiredEnabled (advanced) 오토와이어링(autowiring)을 활성화할지 여부예요. 레지스트리에서 일치하는 타입의 인스턴스가 딱 하나 있는지 찾아서, 그 인스턴스로 오토와이어링 옵션(옵션이 autowired로 표시되어 있어야 함)을 자동 설정하는 데 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등을 자동 설정할 때 사용할 수 있어요. true boolean
cdcChangeTablesSchema (db2) CDC 변경 테이블(change tables)이 있는 스키마 이름이에요. 기본값은 'ASNCDC'예요. ASNCDC String
cdcControlSchema (db2) CDC 제어 구조(control structures)가 있는 스키마 이름이에요. 기본값은 'ASNCDC'예요. ASNCDC String
columnExcludeList (db2) 변경 이벤트에서 제외할 컬럼과 일치하는 정규 표현식이에요. String
columnIncludeList (db2) 변경 이벤트에 포함할 컬럼과 일치하는 정규 표현식이에요. String
columnPropagateSourceType (db2) 완전한 이름(fully-qualified name)이 일치하는 컬럼의 콤마 구분 정규 표현식 목록이에요. 여기에 해당하는 컬럼은 원래 타입과 원래 길이가 방출되는 변경 레코드의 해당 필드 스키마에 파라미터로 추가돼요. String
connectionValidationTimeoutMs (db2) 연결 검증이 끝나기를 기다리는 최대 시간(밀리초)이에요. 기본값은 60초예요. 1m long
converters (db2) 기본 컨버터 대신 사용할 커스텀 컨버터의 선택 목록이에요. 컨버터는 '.type' 설정 옵션으로 정의하고 '.' 옵션들로 구성해요. String
customMetricTags (db2) 커스텀 메트릭 태그는 키-값 쌍을 받아서 MBean 객체 이름을 커스터마이즈해요. 이 이름은 일반 이름 끝에 덧붙여지고, 각 키는 MBean 객체 이름의 태그가 되며, 그에 대응하는 값이 그 키의 태그 값이 돼요. 예: k1=v1,k2=v2. String
customSanitizePattern (db2) 값을 마스킹할 설정 키를 식별하는 정규 표현식이에요. 설정하면 이 커스텀 패턴이 Debezium의 기본 비밀번호 마스킹 패턴을 대체해요. .*secret$ .*password$
databaseDbname (db2) 커넥터가 변경 사항을 캡처할 데이터베이스의 이름이에요. String
databaseHostname (db2) 데이터베이스 서버의 확인 가능한(resolvable) 호스트 이름이나 IP 주소예요. String
databasePassword (db2) 필수 데이터베이스에 연결할 때 쓸 데이터베이스 사용자의 비밀번호예요. String
databasePort (db2) 데이터베이스 서버의 포트예요. 50000 int
databaseUser (db2) 데이터베이스에 연결할 때 쓸 데이터베이스 사용자의 이름이에요. String
datatypePropagateSourceType (db2) 데이터베이스 고유 데이터 타입 이름과 일치하는 콤마 구분 정규 표현식 목록이에요. 여기에 해당하는 타입은 원래 타입과 원래 길이가 방출되는 변경 레코드의 해당 필드 스키마에 파라미터로 추가돼요. String
db2Platform (db2) 커넥터가 연결된 Db2 구현 플랫폼이 어떤 것인지 알려 줘요. 기본값은 'LUW'로 Windows, UNIX, Linux를 뜻해요. 'Z'를 지정하면 Db2 for z/OS 전용 SQL 문을 쓰게 돼요. LUW String
decimalHandlingMode (db2) DECIMAL과 NUMERIC 컬럼을 변경 이벤트에 어떻게 표현할지 지정해요. 'precise'(기본값)는 java.math.BigDecimal로 값을 표현하고, 변경 이벤트에는 이진 표현과 Kafka Connect의 'org.apache.kafka.connect.data.Decimal' 타입으로 인코딩돼요. 'string'은 값을 문자열로 표현해요. 'double'은 Java의 'double'로 표현하는데, 정밀도는 떨어질 수 있지만 컨슈머에서 훨씬 다루기 쉬워요. precise String
errorsMaxRetries (db2) 실패하기 전에 연결 오류를 재시도하는 최대 횟수예요(-1 = 무제한, 0 = 비활성화, 그 외 = 재시도 횟수). -1 int
eventProcessingFailureHandlingMode (db2) 이벤트 처리 중 실패(예: 깨진 이벤트를 만났을 때)를 어떻게 다룰지 지정해요. 'fail'(기본값)은 문제가 된 이벤트와 그 위치를 알리는 예외를 던져서 커넥터를 멈춰요. 'warn'은 문제가 된 이벤트와 그 위치를 로그로 남기고 이벤트를 건너뛰어요. 'ignore'는 문제가 된 이벤트를 그냥 건너뛰어요. fail String
executorShutdownTimeoutMs (db2) 태스크 익스큐터가 종료되기를 기다리는 최대 시간(밀리초)이에요. 4s long
extendedHeadersEnabled (db2) 다운스트림 처리 시스템에서 CDC 이벤트의 출처를 추적하고 식별하는 데 꼭 필요한 메타데이터를 담은 Debezium 컨텍스트 헤더를 켜거나 끄는 옵션이에요. true boolean
guardrailCollectionsLimitAction (db2) 가드레일 컬렉션 한도를 초과했을 때 취할 동작을 지정해요. 'warn'(기본값)은 경고 메시지를 로그로 남기고 처리를 계속하고, 'fail'은 에러로 커넥터를 멈춰요. warn String
guardrailCollectionsMax (db2) 커넥터가 캡처할 수 있는 컬렉션 또는 테이블의 최대 개수예요. 이 한도를 초과하면 'guardrail.collections.limit.action'에 지정한 동작이 수행돼요. 이 가드레일을 끄려면 0으로 설정하세요. 0 int
heartbeatIntervalMs (db2) 커넥터가 하트비트 토픽으로 하트비트 메시지를 주기적으로 보내는 간격(밀리초)이에요. 하트비트 메시지를 끄려면 0을 쓰세요. 기본적으로 비활성화되어 있어요. 0ms int
heartbeatTopicsPrefix (db2) 하트비트 토픽 이름에 쓰는 접두어예요. 기본값은 __debezium-heartbeat예요. __debezium-heartbeat String
includeSchemaChanges (db2) 커넥터가 데이터베이스 스키마 변경을 데이터베이스 서버 ID와 같은 이름의 Kafka 토픽으로 발행할지 여부예요. 각 스키마 변경은 데이터베이스 이름을 담은 키와, 새 스키마의 논리적 설명(DDL 문이 있으면 포함)을 담은 값으로 기록돼요. 기본값은 'true'예요. 이 설정은 커넥터가 내부적으로 데이터베이스 스키마 이력을 기록하는 방식과는 별개예요. true boolean
incrementalSnapshotChunkSize (db2) 증분 스냅샷(incremental snapshotting)에서 청크 하나의 최대 크기(문서/행 수)예요. 1024 int
incrementalSnapshotWatermarkingStrategy (db2) 증분 스냅샷 중 워터마킹(watermarking)에 쓸 전략을 지정해요. 'insert_insert'는 열림(open) 신호와 닫힘(close) 신호를 둘 다 시그널 데이터 컬렉션에 기록해요(기본값). 'insert_delete'는 열림 신호만 시그널 데이터 컬렉션에 기록하고, 닫힘은 상대하는 열림 신호를 삭제해요. INSERT_INSERT String
legacySnapshotMaxThreads (db2) 켜면 테이블당 스레드(table-per-thread) 방식의 구형 병렬 스냅샷 알고리즘을 써요. false(기본값)이면 테이블을 청크로 쪼개 모든 스냅샷 스레드가 함께 처리해서, 스냅샷 동시성을 더 높일 수 있어요. false boolean
maxBatchSize (db2) 소스 레코드 배치 한 개의 최대 크기예요. 기본값은 2048이에요. 2048 int
maxQueueSize (db2) 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기예요. 기본값은 8192이고, 항상 최대 배치 크기보다 커야 해요. 8192 int
maxQueueSizeInBytes (db2) 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기(바이트)예요. 기본값은 0이고, 이는 이 기능이 꺼져 있다는 뜻이에요. 0 long
memoryManagementSchemasClass (db2) 스키마 메타데이터용 저장소 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 해요. 기본값은 인메모리 저장소인 io.debezium.relational.ConcurrentMapTableMappingStorage예요. io.debezium.relational.ConcurrentMapTableMappingStorage String
memoryManagementTablesClass (db2) 테이블 메타데이터용 저장소 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 해요. 기본값은 인메모리 저장소인 io.debezium.relational.ConcurrentMapTableMappingStorage예요. io.debezium.relational.ConcurrentMapTableMappingStorage String
messageKeyColumns (db2) 완전한 이름(fully-qualified) 테이블과 메시지 키로 쓸 컬럼을 매칭하는 표현식의 세미콜론 구분 목록이에요. 각 표현식은 ':' 패턴과 일치해야 하고, 테이블 이름은 커넥터에 따라 (DB_NAME.TABLE_NAME) 또는 (SCHEMA_NAME.TABLE_NAME)으로 정의할 수 있으며, 키 컬럼은 커스텀 키를 나타내는 콤마 구분 컬럼 목록이에요. 명시적 키 설정이 없는 테이블은 그 테이블의 기본 키(primary key) 컬럼이 메시지 키로 쓰여요. 예: dbserver1.inventory.orderlines:orderId,orderLineId;dbserver1.inventory.orders:id. String
notificationEnabledChannels (db2) 활성화된 알림(notifications) 채널 이름 목록이에요. String
notificationSinkTopicName (db2) 알림을 담을 토픽의 이름이에요. 활성화된 채널 목록에 'sink'가 있으면 필수예요. String
openlineageIntegrationConfigFilePath (db2) OpenLineage 파일 설정 경로예요. 자세한 내용은 https://openlineage.io/docs/client/java/configuration을 보세요. ./openlineage.yml String
openlineageIntegrationDatasetKafkaBootstrapServers (db2) 입력/출력 네임스페이스로 쓰이는 Kafka 부트스트랩 서버 주소예요. String
openlineageIntegrationEnabled (db2) Debezium이 OpenLineage API로 데이터 리니지(data lineage) 메타데이터를 방출하도록 켜요. false boolean
openlineageIntegrationJobDescription (db2) Debezium이 방출하는 작업(job)의 설명이에요. Debezium change data capture job String
openlineageIntegrationJobNamespace (db2) Debezium이 방출하는 작업(job)의 네임스페이스예요. String
openlineageIntegrationJobOwners (db2) Debezium이 방출하는 작업(job)의 소유자(owners)예요. 키-값 쌍의 콤마 구분 목록이에요. 예: k1=v1,k2=v2. String
openlineageIntegrationJobTags (db2) Debezium이 방출하는 작업(job)의 태그예요. 키-값 쌍의 콤마 구분 목록이에요. 예: k1=v1,k2=v2. String
pollIntervalMs (db2) 이벤트가 더 이상 오지 않은 뒤 새 변경 이벤트가 나타나기를 기다리는 시간(밀리초)이에요. 기본값은 500ms예요. 500ms long
postProcessors (db2) 후처리 프로세서(post processors)의 선택 목록이에요. 프로세서는 '.type' 설정 옵션으로 정의하고 '' 옵션들로 구성해요. String
provideTransactionMetadata (db2) 이벤트 카운팅과 함께 트랜잭션 메타데이터 추출을 켜요. false boolean
queryFetchSize (db2) 스트리밍 중 메모리에 적재할 최대 레코드 수예요. '0'을 지정하면 기본 JDBC fetch 크기를 써요. 기본값은 '10000'이에요. 10000 int
retriableRestartConnectorWaitMs (db2) 재시도 가능(retriable) 예외가 발생한 뒤 커넥터를 다시 시작하기 전에 기다리는 시간이에요. 기본값은 10000ms예요. 10s long
schemaHistoryInternal (db2) 데이터베이스 스키마 변경을 저장하고 복구하는 데 쓸 SchemaHistory 클래스 이름이에요. 이 이력의 설정 프로퍼티에는 'schema.history.internal.' 접두어가 붙어요. io.debezium.storage.kafka.history.KafkaSchemaHistory String
schemaHistoryInternalFileFilename (db2) 데이터베이스 스키마 이력을 기록할 파일의 경로예요. String
schemaHistoryInternalSkipUnparseableDdl (db2) binlog에서 파싱할 수 없는 DDL 문을 만났을 때 Debezium이 취할 동작을 제어해요. 기본적으로 커넥터는 동작을 멈추지만, 이 설정을 바꾸면 파싱할 수 없는 문을 무시할 수 있어요. 건너뛰기를 켜면 Debezium이 메타데이터 변경을 놓칠 수 있어요. false boolean
schemaHistoryInternalStoreOnlyCapturedDatabasesDdl (db2) Debezium이 데이터베이스 스키마 이력에 어떤 DDL을 저장할지 제어해요. 기본값(false)은 수신되는 모든 DDL 문을 저장해요. true로 하면 캡처 대상 스키마/데이터베이스의 테이블을 다루는 DDL만 저장해요. false boolean
schemaHistoryInternalStoreOnlyCapturedTablesDdl (db2) Debezium이 데이터베이스 스키마 이력에 어떤 DDL을 저장할지 제어해요. 기본값(false)은 수신되는 모든 DDL 문을 저장해요. true로 하면 캡처 대상 테이블을 다루는 DDL만 저장해요. false boolean
schemaNameAdjustmentMode (db2) 커넥터가 쓰는 메시지 컨버터와의 호환성을 위해 스키마 이름을 어떻게 조정할지 지정해요. 'avro'는 Avro 타입 이름에 쓸 수 없는 문자를 밑줄(underscore)로 바꿔요. 'avro_unicode'는 밑줄이나 Avro 타입 이름에 쓸 수 없는 문자를 _uxxxx 같은 대응 유니코드로 바꿔요. 참고: _는 Java의 백슬래시 같은 이스케이프 시퀀스예요. 'none'은 아무 조정도 하지 않아요(기본값). none String
signalDataCollection (db2) Debezium에 시그널/커맨드를 보내는 데 쓰이는 데이터 컬렉션의 이름이에요. 멀티 파티션 모드 커넥터에서는 시그널 데이터 컬렉션을 콤마 구분 목록으로 여러 개 지정할 수 있어요. 설정하지 않으면 시그널링은 꺼져요. String
signalEnabledChannels (db2) 활성화된 채널 이름 목록이에요. source 채널이 기본으로 켜져 있어요. source String
signalPollIntervalMs (db2) 등록된 채널에서 새 시그널을 찾는 간격(밀리초)이에요. 기본값은 5초예요. 5s long
skippedOperations (db2) 스트리밍 중 건너뛸 연산의 콤마 구분 목록이에요. 'c'는 insert/create, 'u'는 update, 'd'는 delete, 't'는 truncate, 'none'은 아무것도 건너뛰지 않음을 뜻해요. 기본적으로 truncate 연산만 건너뛰어요. t String
snapshotDelayMs (db2) 스냅샷이 시작되기 전의 지연 시간(밀리초)이에요. 기본값은 0ms예요. 0ms long
snapshotFetchSize (db2) 스냅샷을 수행하는 동안 메모리에 적재할 최대 레코드 수예요. int
snapshotIncludeCollectionList (db2) 커넥터를 만들거나 재시작할 때 스냅샷을 찍어야 할 테이블/컬렉션 목록을 지정하려면 반드시 이 설정을 해야 해요. String
snapshotLockTimeoutMs (db2) 스냅샷 시작 시 테이블 락을 기다리는 최대 시간(밀리초)이에요. 이 시간 안에 락을 얻지 못하면 스냅샷이 중단돼요. 기본값은 10초예요. 10s long
snapshotMaxThreadsMultiplier (db2) 테이블당 스냅샷 청크 수를 조절하는 배수예요. 기본 동작은 'row_count/snapshot.max.threads'로 청크당 행 수를 계산해요. 큰 테이블에는 이게 최적이 아닐 수 있어서, 배수를 쓰면 'row_count/(snapshot.max.threads snapshot.max.threads.multiplier)' 공식으로 청크 수를 늘려요. 1 int
snapshotMode (db2) 커넥터 시작 시 스냅샷을 실행하는 기준이에요. 옵션은 이렇습니다: 'initial'(기본값)은 논리 서버 이름에 대한 오프셋이 없을 때만 스냅샷을 실행해요. 'schema_only'는 오프셋이 없을 때 스키마만 스냅샷으로 찍어요. initial String
snapshotModeConfigurationBasedSnapshotData (db2) 'snapshot.mode'가 configuration_based로 설정된 경우, 데이터를 스냅샷으로 찍을지 말지 지정하는 설정이에요. false boolean
snapshotModeConfigurationBasedSnapshotOnDataError (db2) 'snapshot.mode'가 configuration_based로 설정된 경우, 에러가 났을 때 데이터를 스냅샷으로 찍을지 말지 지정하는 설정이에요. false boolean
snapshotModeConfigurationBasedSnapshotOnSchemaError (db2) 'snapshot.mode'가 configuration_based로 설정된 경우, 에러가 났을 때 스키마를 스냅샷으로 찍을지 말지 지정하는 설정이에요. false boolean
snapshotModeConfigurationBasedSnapshotSchema (db2) 'snapshot.mode'가 configuration_based로 설정된 경우, 스키마를 스냅샷으로 찍을지 말지 지정하는 설정이에요. false boolean
snapshotModeConfigurationBasedStartStream (db2) 'snapshot.mode'가 configuration_based로 설정된 경우, 스냅샷 이후 스트리밍을 시작할지 말지 지정하는 설정이에요. false boolean
snapshotModeCustomName (db2) 'snapshot.mode'가 custom으로 설정된 경우, 'name()' 메서드로 제공되는 커스텀 구현의 이름을 지정해야 해요. 이 구현은 'Snapshotter' 인터페이스를 구현해야 하고, 앱이 부팅될 때마다 스냅샷을 찍을지 판단하려고 호출돼요. String
snapshotSelectStatementOverrides (db2) 이 프로퍼티는 완전한 이름(fully-qualified) 테이블(DB_NAME.TABLE_NAME 또는 SCHEMA_NAME.TABLE_NAME, 커넥터에 따라 다름)의 콤마 구분 목록을 담아요. 테이블별 SELECT 문은 추가 설정 프로퍼티로 지정하는데, 각 테이블마다 하나씩, 'snapshot.select.statement.overrides.DB_NAME.TABLE_NAME' 또는 'snapshot.select.statement.overrides.SCHEMA_NAME.TABLE_NAME' 아이디로 식별해요. 이 프로퍼티들의 값은 스냅샷 중 해당 테이블에서 데이터를 읽을 때 쓰는 SELECT 문이에요. 큰 append-only 테이블에서는 이전 스냅샷이 중단된 경우 스냅샷을 (재개) 시작할 지점을 정하는 용도로 쓸 수 있어요. String
snapshotTablesOrderByRowCount (db2) 초기 스냅샷에서 테이블을 처리하는 순서를 제어해요. descending 값은 행 수 내림차순으로, ascending 값은 행 수 오름차순으로 테이블을 정렬해요. disabled(기본값)는 행 수 정렬을 끄는 값이에요. disabled String
sourceinfoStructMaker (db2) SourceInfo 스키마와 struct를 반환하는 SourceInfoStructMaker 클래스의 이름이에요. io.debezium.connector.db2.Db2SourceInfoStructMaker String
statisticsMetricsEnabled (db2) 레코드 처리 지연 시간 같은 각종 통계와, 퀀타일(quantiles) 같은 파생 데이터를 수집하도록 켜는 옵션이에요. 기본적으로 통계 수집은 켜져 있어요. true boolean
streamingDelayMs (db2) 스냅샷이 끝나고 스트리밍이 시작되기까지의 지연 시간(밀리초)이에요. 기본값은 0ms예요. 0ms long
tableExcludeList (db2) 모니터링에서 제외할 테이블의 완전한 이름(fully-qualified)과 일치하는 정규 표현식의 콤마 구분 목록이에요. String
tableIgnoreBuiltin (db2) 내장(built-in) 테이블을 무시할지 지정하는 플래그예요. true boolean
tableIncludeList (db2) 변경을 캡처할 테이블이에요. String
timePrecisionMode (db2) 시간, 날짜, 타임스탬프를 여러 가지 정밀도로 표현할 수 있어요. 'adaptive'(기본값)는 시간·날짜·타임스탬프 값의 정밀도를 데이터베이스 컬럼의 정밀도에 맞춰요. 'adaptive_time_microseconds'는 'adaptive'와 비슷하지만 TIME 필드는 항상 마이크로초 정밀도를 써요. 'connect'는 데이터베이스 컬럼 정밀도와 상관없이 항상 Kafka Connect의 Time, Date, Timestamp 내장 표현(밀리초 정밀도)으로 나타내요. 'isostring'은 시간·날짜·타임스탬프 값을 UTC 시간대의 ISO-8601 형식 문자열로 표현해요. 'microseconds'는 항상 마이크로초 정밀도로, 'nanoseconds'는 항상 나노초 정밀도로 표현해요. adaptive String
tombstonesOnDelete (db2) 삭제 연산을 삭제 이벤트와 그 뒤의 툼스톤(tombstone) 이벤트로 표현할지(true), 삭제 이벤트만으로 표현할지(false) 여부예요. 툼스톤 이벤트를 방출하면(기본 동작) 소스 레코드가 삭제된 뒤 Kafka가 해당 키와 관련된 모든 이벤트를 완전히 삭제할 수 있어요. false boolean
topicNamingStrategy (db2) 데이터 변경, 스키마 변경, 트랜잭션, 하트비트 이벤트 등의 토픽 이름을 정하는 데 쓸 TopicNamingStrategy 클래스의 이름이에요. io.debezium.schema.SchemaTopicNamingStrategy String
topicPrefix (db2) 필수 변경을 캡처하는 특정 데이터베이스 서버/클러스터를 식별하고 네임스페이스를 부여하는 토픽 접두어예요. 이 커넥터가 방출하는 이벤트를 받는 모든 Kafka 토픽 이름의 접두어로 쓰이기 때문에, 다른 모든 커넥터와 구별되는 유일한 값이어야 해요. 영숫자, 하이픈, 점, 밑줄만 허용돼요. String
transactionMetadataFactory (db2) 트랜잭션 컨텍스트와 트랜잭션 struct/스키마를 만드는 클래스예요. io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory String

엔드포인트 옵션 (Endpoint Options)

Debezium DB2 Connector 엔드포인트는 다음 URI 문법으로 설정해요:

debezium-db2:name

다음 _path_와 query 파라미터를 씁니다:

Path 파라미터 (Path Parameters)

Name Description Default Type
name (consumer) 필수 커넥터의 유일한 이름이에요. 같은 이름으로 다시 등록하려고 하면 실패해요. String

쿼리 파라미터 (Query Parameters)

Name Description Default Type
additionalProperties (common) camel 설정에 바로 넣을 수 없는 debezium 컴포넌트용 추가 프로퍼티예요(예: Debezium 엔진에 필요한 Kafka Connect 프로퍼티 설정, KafkaOffsetBackingStore 설정 같은 것). 프로퍼티에는 additionalProperties. 접두어를 붙여야 해요. 예: additionalProperties.transactional.id=12345&additionalProperties.schema.registry.url=http://localhost:8811/avro. additionalProperties. 접두어를 쓰는 멀티 밸류 옵션이에요. Map
internalKeyConverter (consumer) 오프셋의 키 데이터를 직렬화하고 역직렬화할 때 사용할 Converter 클래스예요. 기본값은 JSON 컨버터예요. org.apache.kafka.connect.json.JsonConverter String
internalValueConverter (consumer) 오프셋의 값 데이터를 직렬화하고 역직렬화할 때 사용할 Converter 클래스예요. 기본값은 JSON 컨버터예요. org.apache.kafka.connect.json.JsonConverter String
offsetCommitPolicy (consumer) 커밋 정책의 Java 클래스 이름이에요. 처리한 이벤트 수와 마지막 커밋 이후 경과 시간을 기준으로 오프셋 커밋을 언제 트리거할지 정의해요. 이 클래스는 'OffsetCommitPolicy' 인터페이스를 구현해야 하고, 기본값은 시간 간격 기반의 주기적 커밋 정책이에요. String
offsetCommitTimeoutMs (consumer) 레코드를 플러시하고 파티션 오프셋 데이터를 오프셋 저장소에 커밋할 때까지 기다리는 최대 시간(밀리초)이에요. 이 시간을 넘기면 처리를 취소하고, 오프셋 데이터는 나중에 다시 커밋 시도로 돌려 놓아요. 기본값은 5초예요. 5000 long
offsetFlushIntervalMs (consumer) 오프셋 커밋을 시도하는 간격이에요. 기본값은 1분이에요. 60000 long
offsetStorage (consumer) 커넥터 오프셋의 영속화를 담당하는 Java 클래스 이름이에요. org.apache.kafka.connect.storage.FileOffsetBackingStore String
offsetStorageFileName (consumer) 오프셋을 저장할 파일 경로예요. offset.storage가 FileOffsetBackingStore로 설정되어 있으면 필수예요. String
offsetStoragePartitions (consumer) 오프셋 저장소 토픽을 만들 때 사용할 파티션 수예요. offset.storage가 'KafkaOffsetBackingStore'로 설정되어 있으면 필수예요. int
offsetStorageReplicationFactor (consumer) 오프셋 저장소 토픽을 만들 때 사용할 복제 계수예요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. int
offsetStorageTopic (consumer) 오프셋을 저장할 Kafka 토픽의 이름이에요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. String
bridgeErrorHandler (consumer (advanced)) 컨슈머를 Camel 라우팅 에러 핸들러(Error Handler)에 브리지할 수 있게 해 줘요. 즉, Camel 컨슈머가 들어오는 메시지를 집어 올리는 동안 등에서 예외가 발생하면(가능한 경우), 그 예외를 메시지로 처리해서 라우팅 에러 핸들러가 다루게 돼요. 중요: 이것은 서드파티 컴포넌트가 예외가 던져졌을 때 Camel에 알릴 수 있도록 허용하는 경우에만 가능해요. 일부 컴포넌트는 내부에서만 처리하기 때문에 bridgeErrorHandler를 쓸 수 없어요. 다른 상황에서는 Camel 컴포넌트를 개선해서 서드파티 컴포넌트에 연결(hook)해 이를 가능하게 만들 수도 있어요. 기본으로 컨슈머는 org.apache.camel.spi.ExceptionHandler로 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. false boolean
exceptionHandler (consumer (advanced)) 컨슈머가 커스텀 ExceptionHandler를 쓰게 할 수 있어요. bridgeErrorHandler 옵션이 활성화되어 있으면 이 옵션은 사용되지 않는다는 점에 주의하세요. 기본으로 컨슈머는 예외를 처리하는데, WARN 또는 ERROR 레벨로 로그를 남기고 무시해요. ExceptionHandler
exchangePattern (consumer (advanced))
컨슈머가 교환(exchange)을 만들 때 교환 패턴을 설정해요.

Enum values:

  • InOnly

  • InOut

| | ExchangePattern | | cdcChangeTablesSchema (db2) | CDC 변경 테이블(change tables)이 있는 스키마 이름이에요. 기본값은 'ASNCDC'예요. | ASNCDC | String | | | cdcControlSchema (db2) | CDC 제어 구조(control structures)가 있는 스키마 이름이에요. 기본값은 'ASNCDC'예요. | ASNCDC | String | | | columnExcludeList (db2) | 변경 이벤트에서 제외할 컬럼과 일치하는 정규 표현식이에요. | | String | | | columnIncludeList (db2) | 변경 이벤트에 포함할 컬럼과 일치하는 정규 표현식이에요. | | String | | | columnPropagateSourceType (db2) | 완전한 이름(fully-qualified name)이 일치하는 컬럼의 콤마 구분 정규 표현식 목록이에요. 여기에 해당하는 컬럼은 원래 타입과 원래 길이가 방출되는 변경 레코드의 해당 필드 스키마에 파라미터로 추가돼요. | | String | | | connectionValidationTimeoutMs (db2) | 연결 검증이 끝나기를 기다리는 최대 시간(밀리초)이에요. 기본값은 60초예요. | 1m | long | | | converters (db2) | 기본 컨버터 대신 사용할 커스텀 컨버터의 선택 목록이에요. 컨버터는 '.type' 설정 옵션으로 정의하고 '.' 옵션들로 구성해요. | | String | | | customMetricTags (db2) | 커스텀 메트릭 태그는 키-값 쌍을 받아서 MBean 객체 이름을 커스터마이즈해요. 이 이름은 일반 이름 끝에 덧붙여지고, 각 키는 MBean 객체 이름의 태그가 되며, 그에 대응하는 값이 그 키의 태그 값이 돼요. 예: k1=v1,k2=v2. | | String | | | customSanitizePattern (db2) | 값을 마스킹할 설정 키를 식별하는 정규 표현식이에요. 설정하면 이 커스텀 패턴이 Debezium의 기본 비밀번호 마스킹 패턴을 대체해요. | .*secret$|.*password$|.*sasl\.jaas\.config$|.*basic\.auth\.user\.info|.*registry\.auth\.client-secret|.*credentials\.json$|.*connectionstring$|.*connection\.string$ | String | | | databaseDbname (db2) | 커넥터가 변경 사항을 캡처할 데이터베이스의 이름이에요. | | String | | | databaseHostname (db2) | 데이터베이스 서버의 확인 가능한(resolvable) 호스트 이름이나 IP 주소예요. | | String | | | databasePassword (db2) | 필수 데이터베이스에 연결할 때 쓸 데이터베이스 사용자의 비밀번호예요. | | String | | | databasePort (db2) | 데이터베이스 서버의 포트예요. | 50000 | int | | | databaseUser (db2) | 데이터베이스에 연결할 때 쓸 데이터베이스 사용자의 이름이에요. | | String | | | datatypePropagateSourceType (db2) | 데이터베이스 고유 데이터 타입 이름과 일치하는 콤마 구분 정규 표현식 목록이에요. 여기에 해당하는 타입은 원래 타입과 원래 길이가 방출되는 변경 레코드의 해당 필드 스키마에 파라미터로 추가돼요. | | String | | | db2Platform (db2) | 커넥터가 연결된 Db2 구현 플랫폼이 어떤 것인지 알려 줘요. 기본값은 'LUW'로 Windows, UNIX, Linux를 뜻해요. 'Z'를 지정하면 Db2 for z/OS 전용 SQL 문을 쓰게 돼요. | LUW | String | | | decimalHandlingMode (db2) | DECIMAL과 NUMERIC 컬럼을 변경 이벤트에 어떻게 표현할지 지정해요. 'precise'(기본값)는 java.math.BigDecimal로 값을 표현하고, 변경 이벤트에는 이진 표현과 Kafka Connect의 'org.apache.kafka.connect.data.Decimal' 타입으로 인코딩돼요. 'string'은 값을 문자열로 표현해요. 'double'은 Java의 'double'로 표현하는데, 정밀도는 떨어질 수 있지만 컨슈머에서 훨씬 다루기 쉬워요. | precise | String | | | errorsMaxRetries (db2) | 실패하기 전에 연결 오류를 재시도하는 최대 횟수예요(-1 = 무제한, 0 = 비활성화, 그 외 = 재시도 횟수). | -1 | int | | | eventProcessingFailureHandlingMode (db2) | 이벤트 처리 중 실패(예: 깨진 이벤트를 만났을 때)를 어떻게 다룰지 지정해요. 'fail'(기본값)은 문제가 된 이벤트와 그 위치를 알리는 예외를 던져서 커넥터를 멈춰요. 'warn'은 문제가 된 이벤트와 그 위치를 로그로 남기고 이벤트를 건너뛰어요. 'ignore'는 문제가 된 이벤트를 그냥 건너뛰어요. | fail | String | | | executorShutdownTimeoutMs (db2) | 태스크 익스큐터가 종료되기를 기다리는 최대 시간(밀리초)이에요. | 4s | long | | | extendedHeadersEnabled (db2) | 다운스트림 처리 시스템에서 CDC 이벤트의 출처를 추적하고 식별하는 데 꼭 필요한 메타데이터를 담은 Debezium 컨텍스트 헤더를 켜거나 끄는 옵션이에요. | true | boolean | | | guardrailCollectionsLimitAction (db2) | 가드레일 컬렉션 한도를 초과했을 때 취할 동작을 지정해요. 'warn'(기본값)은 경고 메시지를 로그로 남기고 처리를 계속하고, 'fail'은 에러로 커넥터를 멈춰요. | warn | String | | | guardrailCollectionsMax (db2) | 커넥터가 캡처할 수 있는 컬렉션 또는 테이블의 최대 개수예요. 이 한도를 초과하면 'guardrail.collections.limit.action'에 지정한 동작이 수행돼요. 이 가드레일을 끄려면 0으로 설정하세요. | 0 | int | | | heartbeatIntervalMs (db2) | 커넥터가 하트비트 토픽으로 하트비트 메시지를 주기적으로 보내는 간격(밀리초)이에요. 하트비트 메시지를 끄려면 0을 쓰세요. 기본적으로 비활성화되어 있어요. | 0ms | int | | | heartbeatTopicsPrefix (db2) | 하트비트 토픽 이름에 쓰는 접두어예요. 기본값은 __debezium-heartbeat예요. | __debezium-heartbeat | String | | | includeSchemaChanges (db2) | 커넥터가 데이터베이스 스키마 변경을 데이터베이스 서버 ID와 같은 이름의 Kafka 토픽으로 발행할지 여부예요. 각 스키마 변경은 데이터베이스 이름을 담은 키와, 새 스키마의 논리적 설명(DDL 문이 있으면 포함)을 담은 값으로 기록돼요. 기본값은 'true'예요. 이 설정은 커넥터가 내부적으로 데이터베이스 스키마 이력을 기록하는 방식과는 별개예요. | true | boolean | | | incrementalSnapshotChunkSize (db2) | 증분 스냅샷(incremental snapshotting)에서 청크 하나의 최대 크기(문서/행 수)예요. | 1024 | int | | | incrementalSnapshotWatermarkingStrategy (db2) | 증분 스냅샷 중 워터마킹(watermarking)에 쓸 전략을 지정해요. 'insert_insert'는 열림(open) 신호와 닫힘(close) 신호를 둘 다 시그널 데이터 컬렉션에 기록해요(기본값). 'insert_delete'는 열림 신호만 시그널 데이터 컬렉션에 기록하고, 닫힘은 상대하는 열림 신호를 삭제해요. | INSERT_INSERT | String | | | legacySnapshotMaxThreads (db2) | 켜면 테이블당 스레드(table-per-thread) 방식의 구형 병렬 스냅샷 알고리즘을 써요. false(기본값)이면 테이블을 청크로 쪼개 모든 스냅샷 스레드가 함께 처리해서, 스냅샷 동시성을 더 높일 수 있어요. | false | boolean | | | maxBatchSize (db2) | 소스 레코드 배치 한 개의 최대 크기예요. 기본값은 2048이에요. | 2048 | int | | | maxQueueSize (db2) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기예요. 기본값은 8192이고, 항상 최대 배치 크기보다 커야 해요. | 8192 | int | | | maxQueueSizeInBytes (db2) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기(바이트)예요. 기본값은 0이고, 이는 이 기능이 꺼져 있다는 뜻이에요. | 0 | long | | | memoryManagementSchemasClass (db2) | 스키마 메타데이터용 저장소 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 해요. 기본값은 인메모리 저장소인 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String | | | memoryManagementTablesClass (db2) | 테이블 메타데이터용 저장소 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 해요. 기본값은 인메모리 저장소인 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String | | | messageKeyColumns (db2) | 완전한 이름(fully-qualified) 테이블과 메시지 키로 쓸 컬럼을 매칭하는 표현식의 세미콜론 구분 목록이에요. 각 표현식은 ':' 패턴과 일치해야 하고, 테이블 이름은 커넥터에 따라 (DB_NAME.TABLE_NAME) 또는 (SCHEMA_NAME.TABLE_NAME)으로 정의할 수 있으며, 키 컬럼은 커스텀 키를 나타내는 콤마 구분 컬럼 목록이에요. 명시적 키 설정이 없는 테이블은 그 테이블의 기본 키(primary key) 컬럼이 메시지 키로 쓰여요. 예: dbserver1.inventory.orderlines:orderId,orderLineId;dbserver1.inventory.orders:id. | | String | | | notificationEnabledChannels (db2) | 활성화된 알림(notifications) 채널 이름 목록이에요. | | String | | | notificationSinkTopicName (db2) | 알림을 담을 토픽의 이름이에요. 활성화된 채널 목록에 'sink'가 있으면 필수예요. | | String | | | openlineageIntegrationConfigFilePath (db2) | OpenLineage 파일 설정 경로예요. 자세한 내용은 https://openlineage.io/docs/client/java/configuration을 보세요. | ./openlineage.yml | String | | | openlineageIntegrationDatasetKafkaBootstrapServers (db2) | 입력/출력 네임스페이스로 쓰이는 Kafka 부트스트랩 서버 주소예요. | | String | | | openlineageIntegrationEnabled (db2) | Debezium이 OpenLineage API로 데이터 리니지(data lineage) 메타데이터를 방출하도록 켜요. | false | boolean | | | openlineageIntegrationJobDescription (db2) | Debezium이 방출하는 작업(job)의 설명이에요. | Debezium change data capture job | String | | | openlineageIntegrationJobNamespace (db2) | Debezium이 방출하는 작업(job)의 네임스페이스예요. | | String | | | openlineageIntegrationJobOwners (db2) | Debezium이 방출하는 작업(job)의 소유자(owners)예요. 키-값 쌍의 콤마 구분 목록이에요. 예: k1=v1,k2=v2. | | String | | | openlineageIntegrationJobTags (db2) | Debezium이 방출하는 작업(job)의 태그예요. 키-값 쌍의 콤마 구분 목록이에요. 예: k1=v1,k2=v2. | | String | | | pollIntervalMs (db2) | 이벤트가 더 이상 오지 않은 뒤 새 변경 이벤트가 나타나기를 기다리는 시간(밀리초)이에요. 기본값은 500ms예요. | 500ms | long | | | postProcessors (db2) | 후처리 프로세서(post processors)의 선택 목록이에요. 프로세서는 '.type' 설정 옵션으로 정의하고 '' 옵션들로 구성해요. | | String | | | provideTransactionMetadata (db2) | 이벤트 카운팅과 함께 트랜잭션 메타데이터 추출을 켜요. | false | boolean | | | queryFetchSize (db2) | 스트리밍 중 메모리에 적재할 최대 레코드 수예요. '0'을 지정하면 기본 JDBC fetch 크기를 써요. 기본값은 '10000'이에요. | 10000 | int | | | retriableRestartConnectorWaitMs (db2) | 재시도 가능(retriable) 예외가 발생한 뒤 커넥터를 다시 시작하기 전에 기다리는 시간이에요. 기본값은 10000ms예요. | 10s | long | | | schemaHistoryInternal (db2) | 데이터베이스 스키마 변경을 저장하고 복구하는 데 쓸 SchemaHistory 클래스 이름이에요. 이 이력의 설정 프로퍼티에는 'schema.history.internal.' 접두어가 붙어요. | io.debezium.storage.kafka.history.KafkaSchemaHistory | String | | | schemaHistoryInternalFileFilename (db2) | 데이터베이스 스키마 이력을 기록할 파일의 경로예요. | | String | | | schemaHistoryInternalSkipUnparseableDdl (db2) | binlog에서 파싱할 수 없는 DDL 문을 만났을 때 Debezium이 취할 동작을 제어해요. 기본적으로 커넥터는 동작을 멈추지만, 이 설정을 바꾸면 파싱할 수 없는 문을 무시할 수 있어요. 건너뛰기를 켜면 Debezium이 메타데이터 변경을 놓칠 수 있어요. | false | boolean | | | schemaHistoryInternalStoreOnlyCapturedDatabasesDdl (db2) | Debezium이 데이터베이스 스키마 이력에 어떤 DDL을 저장할지 제어해요. 기본값(false)은 수신되는 모든 DDL 문을 저장해요. true로 하면 캡처 대상 스키마/데이터베이스의 테이블을 다루는 DDL만 저장해요. | false | boolean | | | schemaHistoryInternalStoreOnlyCapturedTablesDdl (db2) | Debezium이 데이터베이스 스키마 이력에 어떤 DDL을 저장할지 제어해요. 기본값(false)은 수신되는 모든 DDL 문을 저장해요. true로 하면 캡처 대상 테이블을 다루는 DDL만 저장해요. | false | boolean | | | schemaNameAdjustmentMode (db2) | 커넥터가 쓰는 메시지 컨버터와의 호환성을 위해 스키마 이름을 어떻게 조정할지 지정해요. 'avro'는 Avro 타입 이름에 쓸 수 없는 문자를 밑줄(underscore)로 바꿔요. 'avro_unicode'는 밑줄이나 Avro 타입 이름에 쓸 수 없는 문자를 _uxxxx 같은 대응 유니코드로 바꿔요. 참고: _는 Java의 백슬래시 같은 이스케이프 시퀀스예요. 'none'은 아무 조정도 하지 않아요(기본값). | none | String | | | signalDataCollection (db2) | Debezium에 시그널/커맨드를 보내는 데 쓰이는 데이터 컬렉션의 이름이에요. 멀티 파티션 모드 커넥터에서는 시그널 데이터 컬렉션을 콤마 구분 목록으로 여러 개 지정할 수 있어요. 설정하지 않으면 시그널링은 꺼져요. | | String | | | signalEnabledChannels (db2) | 활성화된 채널 이름 목록이에요. source 채널이 기본으로 켜져 있어요. | source | String | | | signalPollIntervalMs (db2) | 등록된 채널에서 새 시그널을 찾는 간격(밀리초)이에요. 기본값은 5초예요. | 5s | long | | | skippedOperations (db2) | 스트리밍 중 건너뛸 연산의 콤마 구분 목록이에요. 'c'는 insert/create, 'u'는 update, 'd'는 delete, 't'는 truncate, 'none'은 아무것도 건너뛰지 않음을 뜻해요. 기본적으로 truncate 연산만 건너뛰어요. | t | String | | | snapshotDelayMs (db2) | 스냅샷이 시작되기 전의 지연 시간(밀리초)이에요. 기본값은 0ms예요. | 0ms | long | | | snapshotFetchSize (db2) | 스냅샷을 수행하는 동안 메모리에 적재할 최대 레코드 수예요. | | int | | | snapshotIncludeCollectionList (db2) | 커넥터를 만들거나 재시작할 때 스냅샷을 찍어야 할 테이블/컬렉션 목록을 지정하려면 반드시 이 설정을 해야 해요. | | String | | | snapshotLockTimeoutMs (db2) | 스냅샷 시작 시 테이블 락을 기다리는 최대 시간(밀리초)이에요. 이 시간 안에 락을 얻지 못하면 스냅샷이 중단돼요. 기본값은 10초예요. | 10s | long | | | snapshotMaxThreadsMultiplier (db2) | 테이블당 스냅샷 청크 수를 조절하는 배수예요. 기본 동작은 'row_count/snapshot.max.threads'로 청크당 행 수를 계산해요. 큰 테이블에는 이게 최적이 아닐 수 있어서, 배수를 쓰면 'row_count/(snapshot.max.threads snapshot.max.threads.multiplier)' 공식으로 청크 수를 늘려요. | 1 | int | | | snapshotMode (db2) | 커넥터 시작 시 스냅샷을 실행하는 기준이에요. 옵션은 이렇습니다: 'initial'(기본값)은 논리 서버 이름에 대한 오프셋이 없을 때만 스냅샷을 실행해요. 'schema_only'는 오프셋이 없을 때 스키마만 스냅샷으로 찍어요. | initial | String | | | snapshotModeConfigurationBasedSnapshotData (db2) | 'snapshot.mode'가 configuration_based로 설정된 경우, 데이터를 스냅샷으로 찍을지 말지 지정하는 설정이에요. | false | boolean | | | snapshotModeConfigurationBasedSnapshotOnDataError (db2) | 'snapshot.mode'가 configuration_based로 설정된 경우, 에러가 났을 때 데이터를 스냅샷으로 찍을지 말지 지정하는 설정이에요. | false | boolean | | | snapshotModeConfigurationBasedSnapshotOnSchemaError (db2) | 'snapshot.mode'가 configuration_based로 설정된 경우, 에러가 났을 때 스키마를 스냅샷으로 찍을지 말지 지정하는 설정이에요. | false | boolean | | | snapshotModeConfigurationBasedSnapshotSchema (db2) | 'snapshot.mode'가 configuration_based로 설정된 경우, 스키마를 스냅샷으로 찍을지 말지 지정하는 설정이에요. | false | boolean | | | snapshotModeConfigurationBasedStartStream (db2) | 'snapshot.mode'가 configuration_based로 설정된 경우, 스냅샷 이후 스트리밍을 시작할지 말지 지정하는 설정이에요. | false | boolean | | | snapshotModeCustomName (db2) | 'snapshot.mode'가 custom으로 설정된 경우, 'name()' 메서드로 제공되는 커스텀 구현의 이름을 지정해야 해요. 이 구현은 'Snapshotter' 인터페이스를 구현해야 하고, 앱이 부팅될 때마다 스냅샷을 찍을지 판단하려고 호출돼요. | | String | | | snapshotSelectStatementOverrides (db2) | 이 프로퍼티는 완전한 이름(fully-qualified) 테이블(DB_NAME.TABLE_NAME 또는 SCHEMA_NAME.TABLE_NAME, 커넥터에 따라 다름)의 콤마 구분 목록을 담아요. 테이블별 SELECT 문은 추가 설정 프로퍼티로 지정하는데, 각 테이블마다 하나씩, 'snapshot.select.statement.overrides.DB_NAME.TABLE_NAME' 또는 'snapshot.select.statement.overrides.SCHEMA_NAME.TABLE_NAME' 아이디로 식별해요. 이 프로퍼티들의 값은 스냅샷 중 해당 테이블에서 데이터를 읽을 때 쓰는 SELECT 문이에요. 큰 append-only 테이블에서는 이전 스냅샷이 중단된 경우 스냅샷을 (재개) 시작할 지점을 정하는 용도로 쓸 수 있어요. | | String | | | snapshotTablesOrderByRowCount (db2) | 초기 스냅샷에서 테이블을 처리하는 순서를 제어해요. descending 값은 행 수 내림차순으로, ascending 값은 행 수 오름차순으로 테이블을 정렬해요. disabled(기본값)는 행 수 정렬을 끄는 값이에요. | disabled | String | | | sourceinfoStructMaker (db2) | SourceInfo 스키마와 struct를 반환하는 SourceInfoStructMaker 클래스의 이름이에요. | io.debezium.connector.db2.Db2SourceInfoStructMaker | String | | | statisticsMetricsEnabled (db2) | 레코드 처리 지연 시간 같은 각종 통계와, 퀀타일(quantiles) 같은 파생 데이터를 수집하도록 켜는 옵션이에요. 기본적으로 통계 수집은 켜져 있어요. | true | boolean | | | streamingDelayMs (db2) | 스냅샷이 끝나고 스트리밍이 시작되기까지의 지연 시간(밀리초)이에요. 기본값은 0ms예요. | 0ms | long | | | tableExcludeList (db2) | 모니터링에서 제외할 테이블의 완전한 이름(fully-qualified)과 일치하는 정규 표현식의 콤마 구분 목록이에요. | | String | | | tableIgnoreBuiltin (db2) | 내장(built-in) 테이블을 무시할지 지정하는 플래그예요. | true | boolean | | | tableIncludeList (db2) | 변경을 캡처할 테이블이에요. | | String | | | timePrecisionMode (db2) | 시간, 날짜, 타임스탬프를 여러 가지 정밀도로 표현할 수 있어요. 'adaptive'(기본값)는 시간·날짜·타임스탬프 값의 정밀도를 데이터베이스 컬럼의 정밀도에 맞춰요. 'adaptive_time_microseconds'는 'adaptive'와 비슷하지만 TIME 필드는 항상 마이크로초 정밀도를 써요. 'connect'는 데이터베이스 컬럼 정밀도와 상관없이 항상 Kafka Connect의 Time, Date, Timestamp 내장 표현(밀리초 정밀도)으로 나타내요. 'isostring'은 시간·날짜·타임스탬프 값을 UTC 시간대의 ISO-8601 형식 문자열로 표현해요. 'microseconds'는 항상 마이크로초 정밀도로, 'nanoseconds'는 항상 나노초 정밀도로 표현해요. | adaptive | String | | | tombstonesOnDelete (db2) | 삭제 연산을 삭제 이벤트와 그 뒤의 툼스톤(tombstone) 이벤트로 표현할지(true), 삭제 이벤트만으로 표현할지(false) 여부예요. 툼스톤 이벤트를 방출하면(기본 동작) 소스 레코드가 삭제된 뒤 Kafka가 해당 키와 관련된 모든 이벤트를 완전히 삭제할 수 있어요. | false | boolean | | | topicNamingStrategy (db2) | 데이터 변경, 스키마 변경, 트랜잭션, 하트비트 이벤트 등의 토픽 이름을 정하는 데 쓸 TopicNamingStrategy 클래스의 이름이에요. | io.debezium.schema.SchemaTopicNamingStrategy | String | | | topicPrefix (db2) | 필수 변경을 캡처하는 특정 데이터베이스 서버/클러스터를 식별하고 네임스페이스를 부여하는 토픽 접두어예요. 이 커넥터가 방출하는 이벤트를 받는 모든 Kafka 토픽 이름의 접두어로 쓰이기 때문에, 다른 모든 커넥터와 구별되는 유일한 값이어야 해요. 영숫자, 하이픈, 점, 밑줄만 허용돼요. | | String | | | transactionMetadataFactory (db2) | 트랜잭션 컨텍스트와 트랜잭션 struct/스키마를 만드는 클래스예요. | io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory | String | |

메시지 헤더 (Message Headers)

Debezium DB2 Connector 컴포넌트가 지원하는 메시지 헤더는 아래와 같아요:

Name Description Default Type
CamelDebeziumSourceMetadata (consumer) Constant: HEADER_SOURCE_METADATA 소스 이벤트에 대한 메타데이터예요. 테이블 이름, 데이터베이스 이름, 로그 위치 등이 담기고, 자세한 내용은 Debezium 문서를 참고하세요. Map
CamelDebeziumIdentifier (consumer) Constant: HEADER_IDENTIFIER 커넥터의 식별자예요. 보통 {server-name}.{database-name}.{table-name} 형식이에요. String
CamelDebeziumKey (consumer) Constant: HEADER_KEY 이벤트의 키예요. 보통 테이블의 기본 키(Primary Key)예요. Struct
CamelDebeziumOperation (consumer) Constant: HEADER_OPERATION 있으면 이벤트 연산의 타입이에요. 커넥터의 값은 create(insert)의 c, update의 u, delete의 d, 또는 (초기 동기화의 경우나 스냅샷 이벤트의 경우) read의 r이에요. String
CamelDebeziumTimestamp (consumer) Constant: HEADER_TIMESTAMP 있으면 커넥터가 이벤트를 처리한 시각(JVM의 시스템 시계 기준)이에요. Long
CamelDebeziumBefore (consumer) Constant: HEADER_BEFORE 있으면 이벤트가 발생하기 전의 행 상태를 담고 있어요. Struct
CamelDebeziumDdlSQL (consumer) Constant: HEADER_DDL_SQL 있으면 이벤트의 DDL SQL 텍스트예요. String

설정에 대한 자세한 정보: https://debezium.io/documentation/reference/1.8/operations/embedded.html#engine-properties https://debezium.io/documentation/reference/1.8/connectors/db2.html#connector-properties

사용법 (Usage)

메시지 본문 (Message body)

메시지 본문이 null이 아니면(툼스톤(tombstone)의 경우 null) 이벤트가 발생한 뒤의 행 상태를 담고 있어요. 두 형식 가운데 하나예요:

  • Struct

  • Map (Struct에서 Map으로 변환하는 내장 Type Converter를 쓰는 경우)

자세한 내용은 아래를 보세요.

예시 (Examples)

이벤트 소비 (Consuming events)

db2 커넥터의 Debezium 이벤트를 들을 때 쓸 수 있는 기본 라우트예요:

from("debezium-db2:dbz-test-1?offsetStorageFileName=/usr/offset-file-1.dat&databaseHostname=localhost&databaseUser=debezium&databasePassword=dbz&topicPrefix=my-app-connector&schemaHistoryInternalFileFilename=/usr/history-file-1.dat")
    .log("Event received from Debezium : ${body}")
    .log("    with this identifier ${headers.CamelDebeziumIdentifier}")
    .log("    with these source metadata ${headers.CamelDebeziumSourceMetadata}")
    .log("    the event occurred upon this operation '${headers.CamelDebeziumOperation}'")
    .log("    on this database '${headers.CamelDebeziumSourceMetadata[db]}' and this table '${headers.CamelDebeziumSourceMetadata[table]}'")
    .log("    with the key ${headers.CamelDebeziumKey}")
    .log("    the previous value is ${headers.CamelDebeziumBefore}");
<route>
  <from uri="debezium-db2:dbz-test-1?offsetStorageFileName=/usr/offset-file-1.dat&amp;databaseHostname=localhost&amp;databaseUser=debezium&amp;databasePassword=dbz&amp;topicPrefix=my-app-connector&amp;schemaHistoryInternalFileFilename=/usr/history-file-1.dat"/>
  <log message="Event received from Debezium : ${body}"/>
  <log message="    with this identifier ${headers.CamelDebeziumIdentifier}"/>
  <log message="    with these source metadata ${headers.CamelDebeziumSourceMetadata}"/>
  <log message="    the event occurred upon this operation '${headers.CamelDebeziumOperation}'"/>
  <log message="    on this database '${headers.CamelDebeziumSourceMetadata[db]}' and this table '${headers.CamelDebeziumSourceMetadata[table]}'"/>
  <log message="    with the key ${headers.CamelDebeziumKey}"/>
  <log message="    the previous value is ${headers.CamelDebeziumBefore}"/>
</route>
- route:
    from:
      uri: debezium-db2:dbz-test-1
      parameters:
        offsetStorageFileName: /usr/offset-file-1.dat
        databaseHostname: localhost
        databaseUser: debezium
        databasePassword: dbz
        topicPrefix: my-app-connector
        schemaHistoryInternalFileFilename: /usr/history-file-1.dat
      steps:
        - log:
            message: "Event received from Debezium : ${body}"
        - log:
            message: "    with this identifier ${headers.CamelDebeziumIdentifier}"
        - log:
            message: "    with these source metadata ${headers.CamelDebeziumSourceMetadata}"
        - log:
            message: "    the event occurred upon this operation '${headers.CamelDebeziumOperation}'"
        - log:
            message: "    on this database '${headers.CamelDebeziumSourceMetadata[db]}' and this table '${headers.CamelDebeziumSourceMetadata[table]}'"
        - log:
            message: "    with the key ${headers.CamelDebeziumKey}"
        - log:
            message: "    the previous value is ${headers.CamelDebeziumBefore}"

기본적으로 컴포넌트는 이벤트를 본문과 CamelDebeziumBefore 헤더에 Struct 데이터 타입으로 방출해요. 필요할 때 스키마 정보를 알아볼 수 있게 하기 위해서예요. 하지만 이 컴포넌트에는 기본 출력 타입인 Struct를 Map으로 바꾸는 Type Converter도 들어 있어서, Map 데이터 타입으로 바로 동작하는 것이 많은 Camel의 풍부한 Data Format 타입을 활용할 수 있어요. 쓰는 방법은 두 가지예요: 메시지에 접근할 때 Map.class 타입을 지정하거나(예: exchange.getIn().getBody(Map.class)), 라우트 빌더에서 from 문 뒤에 .convertBodyTo(Map.class)를 추가해서 본문을 항상 Map으로 변환할 수 있어요.

앞에서 스키마 이야기를 했는데, 고급 데이터 변환을 할 때 스키마가 필요해질 수 있어요. 본문을 Map으로 변환하지 않기로 했다면, Struct에서 Schema 타입으로 스키마 정보를 이렇게 얻을 수 있어요:

자바 전용: Kafka Connect Struct의 스키마 정보 접근

from("debezium-db2:[name]?[options]])
    .process(exchange -> {
        final Struct bodyValue = exchange.getIn().getBody(Struct.class);
        final Schema schemaValue = bodyValue.schema();

        log.info("Body value is : {}", bodyValue);
        log.info("With Schema : {}", schemaValue);
        log.info("And fields of : {}", schemaValue.fields());
        log.info("Field name has `{}` type", schemaValue.field("name").schema());
    });

중요 앞서 말했듯이 이 컴포넌트는 Debezium Engine을 얇게 감싼 래퍼예요. 그래서 프로덕션에서 이 컴포넌트를 쓰기 전에 Debezium이 어떻게 동작하는지, 그리고 설정이 기대한 동작에 어떻게 반영되는지 이해해야 해요. 특히 장애 처리(handling failures) 부분이 그래요.

더 알아보기 (Learn more)

Debezium 자체의 스냅샷·오프셋·장애 처리 동작은 컴포넌트 설정보다 엔진 문서가 더 상세해요. 프로덕션 배치 전에는 위의 임베디드 엔진 문서를 먼저 확인하세요.