Debezium SQL Server 커넥터
Debezium SQL Server 커넥터 (camel-debezium-sqlserver)
Debezium SQL Server 컴포넌트는 Kafka나 Kafka Connect 없이도 Debezium Engine으로 SQL Server 데이터베이스의 Change Data Capture(CDC) 이벤트를 라우트로 흘려 보내는 컴포넌트예요. SQL Server의 CDC 기능이 만들어 둔 변경 테이블을 읽는 방식으로 동작하고, 컨슈머 전용이라서 from()으로 CDC 이벤트를 구독하는 방식으로 써요. 오프셋 저장, 스냅샷, 헬스 체크 같은 임베디드 엔진의 동작 방식도 그대로 노출해요.
출처: 문서
본문
Camel 3.0부터 지원
컨슈머만 지원해요
Debezium SQL Server 컴포넌트는 Debezium을 Debezium Engine으로 감싼 래퍼(wrapper)예요. Kafka나 Kafka Connect 없이도 Debezium으로 SQL Server 데이터베이스에서 Change Data Capture를 할 수 있게 해 줘요.
참고 장애 처리 관련 참고: Debezium Embedded Engine 문서에 따르면, 엔진은 소스 오프셋을 적극적으로 기록하고 이 오프셋을 주기적으로 영구 저장소에 플러시해요. 그래서 애플리케이션을 재시작하거나 크래시가 나도 엔진은 마지막으로 기록된 오프셋부터 이어서 처리해요. 정상 동작 중이라면 다운스트림 라우트는 각 이벤트를 정확히 한 번씩 받아요. 하지만 애플리케이션이 크래시로 죽은 경우(우아한 종료 없이) 재시작 직후에 중복 이벤트를 받을 수 있어요. 따라서 다운스트림 라우트는 이런 상황을 충분히 견딜 수 있어야 하고, 필요하면 이벤트를 중복 제거해야 해요.
엔진이 폴링을 시작하기 전에는 consumer 헬스 체크가 설정된 초기 상태를 보고해요(기본값은
DOWN). 커넥터 태스크가 시작되고 엔진이 폴링 페이즈에 들어가면UP으로 보고해요. 이때 아직 변경 이벤트가 하나도 도착하지 않았어도 그래요. 이것이 초기 스냅샷이 끝났다는 뜻은 아니에요.임베디드 엔진이 오류로 멈추면, 예를 들어 커넥터가 데이터베이스에 도달할 수 없거나 오프셋 스토어를 읽을 수 없는 경우에, 엔진은 재시작되지 않아요: 라우트는 시작 상태로 남지만 더 이상 이벤트를 받지 못해요. 이 실패는 consumer exception handler로 보고되고 라우트 헬스 체크를
DOWN으로 바꿔서 readiness probe가 잡을 수 있게 해 줘요.
Maven 사용자는 이 컴포넌트를 쓰려면 pom.xml에 다음 의존성을 추가해야 해요.
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-debezium-sqlserver</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
URI 형식 (URI Format)
debezium-sqlserver:name[?options]
옵션 설정 (Configuring Options)
Camel 컴포넌트는 서로 다른 두 단계로 설정해요:
-
component level
-
endpoint level
컴포넌트 옵션 설정 (Configuring Component Options)
컴포넌트 레벨에서는 엔드포인트들이 이어서 물려받는 일반적이고 공유되는 설정을 해요. 가장 상위의 설정 레벨이죠.
예를 들어 컴포넌트에는 보안 설정, 인증용 자격 증명, 네트워크 연결 URL 같은 것들이 있을 수 있어요.
컴포넌트에 따라 옵션이 몇 개뿐인 것도 있고 아주 많은 것도 있어요. 컴포넌트는 보통 널리 쓰이는 기본값이 미리 설정되어 있어서, 몇 가지 옵션만 설정하거나 아예 하나도 건드리지 않아도 되는 경우가 많아요.
컴포넌트는 다음 방법으로 설정할 수 있어요:
-
the Component DSL.
-
in a configuration file (
application.properties,*.yamlfiles, etc). -
directly in the Java code.
엔드포인트 옵션 설정 (Configuring Endpoint Options)
엔드포인트는 옵션이 많아서 설정에 시간을 더 쓰게 될 거예요. 이 옵션들이 엔드포인트가 원하는 일을 하도록 커스터마이즈해 줘요. 옵션은 엔드포인트가 컨슈머(from)로 쓰이는지, 프로듀서(to)로 쓰이는지, 둘 다인지에 따라 분류되기도 해요.
엔드포인트 설정은 대부분 엔드포인트 URI에 _path_와 query 파라미터로 바로 하는 경우가 많아요. Endpoint DSL과 DataFormat DSL을 쓰면 자바에서 엔드포인트와 데이터 포맷을 _타입 세이프_하게 설정할 수도 있어요.
옵션을 설정할 때 좋은 습관은 Property Placeholders를 사용하는 거예요.
프로퍼티 플레이스홀더는 이런 장점이 있어요:
-
They help prevent using hardcoded urls, port numbers, sensitive information, and other settings.
-
They allow externalizing the configuration from the code.
-
They help the code to become more flexible and reusable.
다음 두 섹션에서 모든 옵션을 나열해요. 먼저 컴포넌트 옵션, 그다음 엔드포인트 옵션 순서예요.
컴포넌트 옵션 (Component Options)
Debezium SQL Server 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)을 지정할 수 있게 해 줘요. | SqlServerConnectorEmbeddedDebeziumConfiguration | |
| 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) | 오프셋 저장소 토픽을 만들 때 사용할 복제 계수(replication factor)예요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. | int | |
| offsetStorageTopic (consumer) | 오프셋을 저장할 Kafka 토픽의 이름이에요. offset.storage가 KafkaOffsetBackingStore로 설정되어 있으면 필수예요. | String | |
| autowiredEnabled (advanced) | 오토와이어링(autowiring)을 활성화할지 여부예요. 레지스트리에서 일치하는 타입의 인스턴스가 딱 하나 있는지 찾아서, 그 인스턴스로 오토와이어링 옵션(옵션이 autowired로 표시되어 있어야 함)을 자동 설정하는 데 쓰여요. JDBC 데이터 소스, JMS 커넥션 팩토리, AWS 클라이언트 등을 자동 설정할 때 사용할 수 있어요. | true | boolean |
| binaryHandlingMode (sqlserver) | 변경 이벤트에서 binary(blob, binary 등) 컬럼을 어떻게 표현할지 정해요. 'bytes'는 binary 데이터를 byte 배열로 표현하고(기본값), 'base64'는 base64 인코딩 문자열로, 'base64-url-safe'는 base64-url-safe 인코딩 문자열로, 'hex'는 hex 인코딩(base16) 문자열로 표현해요. | bytes | String |
| columnExcludeList (sqlserver) | 변경 이벤트에서 제외할 컬럼과 일치하는 정규 표현식이에요. | String | |
| columnIncludeList (sqlserver) | 변경 이벤트에 포함할 컬럼과 일치하는 정규 표현식이에요. | String | |
| columnPropagateSourceType (sqlserver) | 완전한 이름(fully-qualified name)으로 컬럼과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. 일치하면 해당 컬럼의 원래 타입과 원래 길이가 내보낸 변경 레코드의 필드 스키마에 파라미터로 추가돼요. | String | |
| connectionValidationTimeoutMs (sqlserver) | 커넥션 검증이 끝나기까지 기다리는 최대 시간(밀리초)이에요. 기본값은 60초예요. | 1m | long |
| converters (sqlserver) | 기본 컨버터 대신 사용할 커스텀 컨버터의 선택 목록이에요. 컨버터는 '.type' 설정 옵션으로 정의하고 '.' 옵션들로 구성해요. | String | |
| customMetricTags (sqlserver) | 커스텀 메트릭 태그는 키-값 쌍을 받아서 MBean 객체 이름을 커스터마이즈해요. 이 이름은 일반 이름 끝에 덧붙여지고, 각 키는 MBean 객체 이름의 태그가 되며, 그에 대응하는 값이 그 키의 태그 값이 돼요. 예: k1=v1,k2=v2. | String | |
| customSanitizePattern (sqlserver) | 값을 마스킹해야 할 설정 키를 식별하는 정규 표현식이에요. 이 값을 설정하면 Debezium의 기본 비밀번호 마스킹 패턴 대신 이 커스텀 패턴을 사용해요. | .*secret$ | .*password$ |
| databaseHostname (sqlserver) | 데이터베이스 서버의, 이름 확인이 가능한 호스트명이나 IP 주소예요. | String | |
| databaseInstance (sqlserver) | SQL Server 인스턴스 이름이에요. | String | |
| databaseNames (sqlserver) | 커넥터가 변경을 캡처할 데이터베이스들의 이름이에요. | String | |
| databasePassword (sqlserver) | 필수 데이터베이스에 접속할 때 쓸 데이터베이스 사용자의 비밀번호예요. | String | |
| databasePort (sqlserver) | 데이터베이스 서버의 포트예요. | 1433 | int |
| databaseQueryTimeoutMs (sqlserver) | 쿼리 실행을 기다리는 시간(밀리초)이에요. 기본값은 600초(600,000ms)이고, 0이면 제한이 없어요. | 10m | int |
| databaseUser (sqlserver) | 데이터베이스에 접속할 때 쓸 데이터베이스 사용자의 이름이에요. | String | |
| dataQueryMode (sqlserver) | 커넥터가 CDC 데이터를 조회하는 방식을 조절해요. 기본값인 'direct'는 커넥터가 변경 테이블(change tables)을 직접 조회하게 해요. 'function'은 cdc.fn_cdc_get_all_changes# 함수를 호출해서 데이터를 조회한다는 뜻이에요. | direct | String |
| datatypePropagateSourceType (sqlserver) | 데이터베이스 고유의 데이터 타입 이름과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. 일치하면 해당 데이터 타입의 원래 타입과 원래 길이가 내보낸 변경 레코드의 필드 스키마에 파라미터로 추가돼요. | String | |
| decimalHandlingMode (sqlserver) | 변경 이벤트에서 DECIMAL과 NUMERIC 컬럼을 어떻게 표현할지 정해요. 'precise'(기본값)는 java.math.BigDecimal로 값을 표현하고, 변경 이벤트에는 binary 표현과 Kafka Connect의 'org.apache.kafka.connect.data.Decimal' 타입으로 인코딩돼요. 'string'은 값을 문자열로 표현해요. 'double'은 Java의 'double'로 표현하는데, 정밀도는 떨어질 수 있지만 컨슈머에서 훨씬 다루기 쉬워요. | precise | String |
| errorsMaxRetries (sqlserver) | 실패하기 전에 커넥션 오류를 재시도하는 최대 횟수예요(-1 = 제한 없음, 0 = 비활성화, 0 = 재시도 횟수). | -1 | int |
| eventProcessingFailureHandlingMode (sqlserver) | 이벤트 처리 중 실패(즉, 손상된 이벤트를 만났을 때)를 어떻게 다룰지 정해요. 'fail'(기본값)은 문제가 된 이벤트와 그 위치를 알리는 예외를 던져서 커넥터를 멈춰요. 'warn'은 문제가 된 이벤트와 그 위치를 로그로 남기고 그 이벤트를 건너뛰어요. 'ignore'는 문제가 된 이벤트를 그냥 건너뛰어요. | fail | String |
| executorShutdownTimeoutMs (sqlserver) | 태스크 실행자(task executor)가 종료되기를 기다리는 최대 시간(밀리초)이에요. | 4s | long |
| extendedHeadersEnabled (sqlserver) | 다운스트림 처리 시스템에서 CDC 이벤트의 출처를 추적·식별하는 데 꼭 필요한 메타데이터를 담는 Debezium 컨텍스트 헤더를 켜거나 꺼요. | true | boolean |
| guardrailCollectionsLimitAction (sqlserver) | guardrail 컬렉션 한도를 초과했을 때 취할 동작을 정해요. 'warn'(기본값)은 경고 메시지를 로그로 남기고 계속 처리하고, 'fail'은 오류로 커넥터를 멈춰요. | warn | String |
| guardrailCollectionsMax (sqlserver) | 커넥터가 캡처할 수 있는 컬렉션·테이블의 최대 개수예요. 한도를 초과하면 'guardrail.collections.limit.action'에 지정한 동작을 해요. 0으로 설정하면 이 guardrail을 끄는 거예요. | 0 | int |
| heartbeatActionQuery (sqlserver) | 하트비트마다 실행하는 쿼리예요. | String | |
| heartbeatIntervalMs (sqlserver) | 커넥터가 하트비트 토픽으로 하트비트 메시지를 주기적으로 보내는 간격(밀리초)이에요. 0으로 설정하면 하트비트 메시지를 꺼요. 기본값은 꺼져 있어요. | 0ms | int |
| heartbeatTopicsPrefix (sqlserver) | 하트비트 토픽 이름에 쓰는 접두어예요. 기본값은 __debezium-heartbeat예요. | __debezium-heartbeat | String |
| includeSchemaChanges (sqlserver) | 데이터베이스 스키마 변경을 데이터베이스 서버 ID와 같은 이름의 Kafka 토픽에 발행할지 여부예요. 각 스키마 변경은 데이터베이스 이름을 담은 키로 기록되고, 값에는 새 스키마의 논리적 설명과 (있다면) DDL 문이 들어가요. 기본값은 'true'예요. 이는 커넥터가 내부적으로 데이터베이스 스키마 히스토리를 기록하는 방식과는 별개예요. | true | boolean |
| includeSchemaComments (sqlserver) | 커넥터가 테이블·컬럼의 주석을 메타데이터 객체로 파싱할지 여부예요. 참고: 이 옵션을 켜면 메모리 사용량에 영향이 있어요. ColumnImpl 객체의 개수와 크기가 Debezium 커넥터의 메모리 소비를 크게 좌우하는데, 각 객체에 String을 하나 더하는 건 상당히 무거워질 수 있어요. 기본값은 'false'예요. | false | boolean |
| incrementalSnapshotAllowSchemaChanges (sqlserver) | 증분 스냅샷 중 스키마 변경을 감지하고 현재 청크를 다시 골라서 잠금(locking) DDL을 피하게 해 줘요. 기본 키 변경은 지원하지 않고, 증분 스냅샷 중에 수행하면 잘못된 결과를 낼 수 있다는 점에 유의하세요. 또한 스키마 변경이 컬럼 기본값에만 영향을 준다면, binlog 스트림에서 DDL을 처리하기 전까지는 변경을 감지하지 못해요. 이는 스냅샷 이벤트의 값에는 영향을 주지 않지만, 스냅샷 이벤트의 스키마에는 오래된 기본값이 남을 수 있어요. | false | boolean |
| incrementalSnapshotChunkSize (sqlserver) | 증분 스냅샷에서 청크(chunk)의 최대 크기(문서/로우 수)예요. | 1024 | int |
| incrementalSnapshotOptionRecompile (sqlserver) | 증분 스냅샷 과정에서 각 SELECT 문에 OPTION(RECOMPILE)을 추가해요. 파라미터 스니핑(parameter sniffing)을 막아 주지만, 소스 데이터베이스에 CPU 부담을 줄 수 있어요. | false | boolean |
| incrementalSnapshotWatermarkingStrategy (sqlserver) | 증분 스냅샷 동안 워터마킹에 사용할 전략을 지정해요. 'insert_insert'는 open과 close 시그널을 모두 signal data collection에 기록해요(기본값). 'insert_delete'는 open 시그널만 signal data collection에 기록하고, close는 해당 open 시그널을 삭제해요. | INSERT_INSERT | String |
| legacySnapshotMaxThreads (sqlserver) | 켜면 레거시 table-per-thread 병렬 스냅샷 알고리즘을 사용해요. false로 두면(기본값) 테이블을 청크로 나눠서 모든 스냅샷 스레드에 걸쳐 처리하기 때문에 스냅샷 동시성을 더 높일 수 있어요. | false | boolean |
| maxBatchSize (sqlserver) | 소스 레코드 배치 하나의 최대 크기예요. 기본값은 2048이에요. | 2048 | int |
| maxIterationTransactions (sqlserver) | 데이터베이스별로 여러 테이블에서 변경을 스트리밍할 때 커넥터의 메모리 사용량을 줄이는 데 쓸 수 있는 프로퍼티예요. | 500 | int |
| maxQueueSize (sqlserver) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기예요. 기본값은 8192이고, 항상 최대 배치 크기보다 커야 해요. | 8192 | int |
| maxQueueSizeInBytes (sqlserver) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트의 큐 최대 크기(바이트)예요. 기본값은 0이고, 기능이 꺼져 있다는 뜻이에요. | 0 | long |
| memoryManagementSchemasClass (sqlserver) | 스키마 메타데이터용 스토리지 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 하고, 기본값은 인메모리 스토리지용 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String |
| memoryManagementTablesClass (sqlserver) | 테이블 메타데이터용 스토리지 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 하고, 기본값은 인메모리 스토리지용 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String |
| messageKeyColumns (sqlserver) | 메시지 키로 쓸 완전한 이름(fully-qualified)의 테이블과 컬럼(들)과 일치하는 표현식을 세미콜론으로 나열한 목록이에요. 각 표현식은 ':' 패턴과 일치해야 하고, 테이블 이름은 커넥터에 따라 (DB_NAME.TABLE_NAME)이나 (SCHEMA_NAME.TABLE_NAME)으로 정의할 수 있으며, 키 컬럼은 커스텀 키를 나타내는 컬럼의 쉼표 목록이에요. 명시적인 키 설정이 없는 테이블은 테이블의 기본 키 컬럼(들)이 메시지 키로 쓰여요. 예: dbserver1.inventory.orderlines:orderId,orderLineId;dbserver1.inventory.orders:id. | String | |
| notificationEnabledChannels (sqlserver) | 활성화된 알림 채널 이름 목록이에요. | String | |
| notificationSinkTopicName (sqlserver) | 알림용 토픽의 이름이에요. 활성화된 채널 목록에 'sink'가 있으면 필수예요. | String | |
| openlineageIntegrationConfigFilePath (sqlserver) | OpenLineage 파일 설정의 경로예요. 자세한 내용은 https://openlineage.io/docs/client/java/configuration을 참고하세요. | ./openlineage.yml | String |
| openlineageIntegrationDatasetKafkaBootstrapServers (sqlserver) | 입력/출력 네임스페이스로 쓰이는 Kafka 부트스트랩 서버 주소예요. | String | |
| openlineageIntegrationEnabled (sqlserver) | Debezium이 OpenLineage API로 데이터 리니지(data lineage) 메타데이터를 내보내도록 켜요. | false | boolean |
| openlineageIntegrationJobDescription (sqlserver) | Debezium이 내보내는 잡의 설명이에요. | Debezium change data capture job | String |
| openlineageIntegrationJobNamespace (sqlserver) | Debezium이 내보내는 잡의 네임스페이스예요. | String | |
| openlineageIntegrationJobOwners (sqlserver) | Debezium이 내보내는 잡의 소유자(owners)예요. 키-값 쌍을 쉼표로 나열해요. 예: k1=v1,k2=v2. | String | |
| openlineageIntegrationJobTags (sqlserver) | Debezium이 내보내는 잡의 태그예요. 키-값 쌍을 쉼표로 나열해요. 예: k1=v1,k2=v2. | String | |
| pollIntervalMs (sqlserver) | 이벤트가 없는 상태로 받은 뒤 새 변경 이벤트가 나타나기를 기다리는 시간(밀리초)이에요. 기본값은 500 ms예요. | 500ms | long |
| postProcessors (sqlserver) | 포스트 프로세서의 선택 목록이에요. 프로세서는 '.type' 설정 옵션으로 정의하고 '' 옵션들로 구성해요. | String | |
| provideTransactionMetadata (sqlserver) | 이벤트 카운트와 함께 트랜잭션 메타데이터 추출을 켜요. | false | boolean |
| retriableRestartConnectorWaitMs (sqlserver) | 재시도 가능한(retriable) 예외가 발생한 뒤 커넥터를 다시 시작하기 전에 기다리는 시간이에요. 기본값은 10000ms예요. | 10s | long |
| schemaHistoryInternal (sqlserver) | 데이터베이스 스키마 변경을 저장·복구하는 데 쓸 SchemaHistory 클래스 이름이에요. 히스토리 관련 설정 프로퍼티는 'schema.history.internal.' 문자열을 접두사로 써요. | io.debezium.storage.kafka.history.KafkaSchemaHistory | String |
| schemaHistoryInternalFileFilename (sqlserver) | 데이터베이스 스키마 히스토리를 기록하는 데 쓸 파일의 경로예요. | String | |
| schemaHistoryInternalSkipUnparseableDdl (sqlserver) | binlog에서 파싱할 수 없는 DDL 문을 만났을 때 Debezium이 취할 동작을 정해요. 기본으로 커넥터는 동작을 멈추지만, 설정을 바꾸면 파싱할 수 없는 문을 무시할 수 있어요. 건너뛰기를 켜면 Debezium이 메타데이터 변경을 놓칠 수 있어요. | false | boolean |
| schemaHistoryInternalStoreOnlyCapturedDatabasesDdl (sqlserver) | Debezium이 데이터베이스 스키마 히스토리에 어떤 DDL을 저장할지 정해요. 기본(false)은 들어오는 모든 DDL 문을 저장해요. true로 두면 캡처한 스키마/데이터베이스의 테이블을 건드리는 DDL만 저장해요. | false | boolean |
| schemaHistoryInternalStoreOnlyCapturedTablesDdl (sqlserver) | Debezium이 데이터베이스 스키마 히스토리에 어떤 DDL을 저장할지 정해요. 기본(false)은 들어오는 모든 DDL 문을 저장해요. true로 두면 캡처한 테이블을 건드리는 DDL만 저장해요. | false | boolean |
| schemaNameAdjustmentMode (sqlserver) | 커넥터가 사용하는 메시지 컨버터와의 호환성을 위해 스키마 이름을 어떻게 조정할지 정해요. 'avro'는 Avro 타입 이름에 쓸 수 없는 문자를 언더스코어로 바꿔요. 'avro_unicode'는 언더스코어나 Avro 타입 이름에 쓸 수 없는 문자를 _uxxxx 같은 대응하는 유니코드로 바꿔요. 참고: _는 Java의 백슬래시 같은 이스케이프 시퀀스예요. 'none'은 아무 조정도 하지 않아요(기본값). | none | String |
| signalDataCollection (sqlserver) | Debezium에 시그널/커맨드를 보낼 때 쓰는 데이터 컬렉션의 이름이에요. 멀티 파티션 모드 커넥터는 시그널 데이터 컬렉션을 쉼표로 구분해서 여러 개 지정할 수 있어요. 설정하지 않으면 시그널링은 꺼져 있어요. | String | |
| signalEnabledChannels (sqlserver) | 활성화된 채널 이름의 목록이에요. source 채널이 기본으로 활성화돼요. | source | String |
| signalPollIntervalMs (sqlserver) | 등록된 채널에서 새 시그널을 찾는 간격(밀리초)이에요. 기본값은 5초예요. | 5s | long |
| skippedOperations (sqlserver) | 스트리밍 중에 건너뛸 연산을 쉼표로 나열한 목록이에요. 'c'는 insert/create, 'u'는 update, 'd'는 delete, 't'는 truncate를 뜻하고, 'none'은 아무것도 건너뛰지 않는다는 뜻이에요. 기본값으로는 truncate 연산만 건너뛰어요. | t | String |
| snapshotDelayMs (sqlserver) | 스냅샷이 시작되기 전의 지연 시간(밀리초)이에요. 기본값은 0 ms예요. | 0ms | long |
| snapshotFetchSize (sqlserver) | 스냅샷을 수행하는 동안 메모리로 읽어 들일 최대 레코드 수예요. | int | |
| snapshotIncludeCollectionList (sqlserver) | 커넥터를 만들거나 재시작할 때 스냅샷을 꼭 찍어야 할 테이블/컬렉션 목록을 지정하려면 이 설정을 반드시 지정해야 해요. | String | |
| snapshotIsolationMode (sqlserver) | 어떤 트랜잭션 격리 수준을 쓰는지, 그리고 커넥터가 캡처한 테이블을 얼마나 오래 잠그는지 조절해요. 기본값은 'repeatable_read'로, repeatable read 격리 수준을 쓴다는 뜻이에요. 또한 스키마 스냅샷 동안 거는 잠금의 종류는 snapshot.locking.mode 프로퍼티에 따라 달라져요. 'exclusive'를 쓰면 스냅샷 내내 캡처한 모든 테이블에 대해 snapshot.locking.mode 프로퍼티가 지정한 종류의 잠금을 쥐고 있어서(읽기와 업데이트를 막음) 다른 트랜잭션의 접근을 차단해요. 'snapshot'을 지정하면 초기 스냅샷을 SNAPSHOT 격리 수준으로 수행해서 스냅샷 일관성을 보장하고, 테이블·로우 잠금은 걸지 않아요. 'read_committed'를 지정하면 초기 스냅샷을 READ COMMITTED 격리 수준으로 수행해요. 오래 잡는 잠금이 없어서 초기 스냅샷이 다른 트랜잭션의 로우 업데이트를 막지는 않지만, 스냅샷 일관성은 보장되지 않아요. 'read_uncommitted' 모드에서는 테이블·로우 잠금을 걸지 않지만, 커넥터는 스냅샷 일관성을 보장하지 않아요. | repeatable_read | String |
| snapshotLockTimeoutMs (sqlserver) | 스냅샷 시작 시 테이블 잠금을 기다리는 최대 밀리초예요. 이 시간 안에 잠금을 얻지 못하면 스냅샷이 중단돼요. 기본값은 10초예요. | 10s | long |
| snapshotMaxThreads (sqlserver) | 스냅샷을 수행할 때 쓰는 최대 스레드 수예요. 기본값은 1이에요. | 1 | int |
| snapshotMaxThreadsMultiplier (sqlserver) | 테이블당 스냅샷 청크 개수를 늘리는 데 쓰는 계수예요. 기본 동작은 'row_count/snapshot.max.threads'로 로우당 청크 수를 계산해요. 큰 테이블에는 이게 최선이 아닐 수 있는데, multiplier를 쓰면 'row_count/(snapshot.max.threads snapshot.max.threads.multiplier)'로 청크 개수를 늘리도록 공식이 조정돼요. | 1 | int |
| snapshotMode (sqlserver) | 커넥터 시작 시 스냅샷을 실행하는 기준이에요. 다음 스냅샷 옵션 중 하나를 고르세요. 'initial'(기본값): 논리 서버 이름(logical server name)에 대한 오프셋을 찾지 못하면 설정된 테이블의 현재 전체 상태를 캡처하는 스냅샷을 실행하고, 스냅샷이 끝나면 트랜잭션 로그에서 변경을 스트리밍하기 시작해요. 'initial_only': 'initial' 옵션처럼 스냅샷을 수행하지만, 스냅샷이 끝나면 커넥터가 멈추고 트랜잭션 로그에서 변경을 스트리밍하지 않아요. 'schema_only': 논리 서버 이름에 대한 오프셋을 찾지 못하면 테이블 데이터 없이 스키마(테이블 구조)만 캡처하는 스냅샷을 실행하고, 스냅샷이 끝나면 트랜잭션 로그에서 변경을 스트리밍하기 시작해요. | initial | String |
| snapshotModeConfigurationBasedSnapshotData (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 데이터를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean |
| snapshotModeConfigurationBasedSnapshotOnDataError (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 오류가 났을 때 데이터를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean |
| snapshotModeConfigurationBasedSnapshotOnSchemaError (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 오류가 났을 때 스키마를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean |
| snapshotModeConfigurationBasedSnapshotSchema (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 스키마를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean |
| snapshotModeConfigurationBasedStartStream (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 스냅샷 이후에 스트림을 시작할지 말지를 지정할 수 있게 해 줘요. | false | boolean |
| snapshotModeCustomName (sqlserver) | 'snapshot.mode'가 custom으로 설정되어 있으면, 'name()' 메서드가 제공하는 커스텀 구현의 이름을 지정하도록 이 설정을 반드시 지정해야 해요. 구현체는 'Snapshotter' 인터페이스를 구현해야 하고, 앱이 부팅될 때마다 호출돼서 스냅샷을 할지 정해요. | String | |
| snapshotSelectStatementOverrides (sqlserver) | 이 프로퍼티는 완전한 이름(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 (sqlserver) | 초기 스냅샷에서 테이블을 처리하는 순서를 조절해요. descending 값을 주면 테이블을 로우 수 내림차순으로 정렬해요. ascending 값을 주면 로우 수 오름차순으로 정렬해요. disabled(기본값)는 로우 수 정렬을 꺼요. | disabled | String |
| sourceinfoStructMaker (sqlserver) | SourceInfo 스키마와 struct를 돌려주는 SourceInfoStructMaker 클래스의 이름이에요. | io.debezium.connector.sqlserver.SqlServerSourceInfoStructMaker | String |
| statisticsMetricsEnabled (sqlserver) | 레코드 처리 지연 시간 같은 여러 통계와 quantiles 같은 파생 데이터를 수집하게 해요. 기본값으로 통계 수집은 켜져 있어요. | true | boolean |
| streamingDelayMs (sqlserver) | 스냅샷이 끝나고 스트리밍이 시작되기까지의 지연 시간(밀리초)이에요. 기본값은 0 ms예요. | 0ms | long |
| streamingFetchSize (sqlserver) | 스트리밍 중에 각 테이블에서 한 번에 읽을 최대 로우 수를 지정해요. 커넥터는 이 크기의 배치 여러 개로 테이블 내용을 읽어요. 기본값은 0이고, 제한이 없다는 뜻이에요. | 0 | int |
| tableExcludeList (sqlserver) | 모니터링에서 제외할 테이블의 완전한 이름(fully-qualified name)과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. | String | |
| tableIgnoreBuiltin (sqlserver) | 내장(built-in) 테이블을 무시할지 여부를 지정하는 플래그예요. | true | boolean |
| tableIncludeList (sqlserver) | 변경을 캡처할 테이블들이에요. | String | |
| timePrecisionMode (sqlserver) | 시간, 날짜, 타임스탬프는 여러 정밀도로 표현할 수 있어요. 'adaptive'(기본값)는 시간·날짜·타임스탬프 값의 정밀도를 데이터베이스 컬럼의 정밀도에 맞춰요. 'adaptive_time_microseconds'는 'adaptive' 모드와 비슷하지만 TIME 필드는 항상 마이크로초 정밀도를 써요. 'connect'는 데이터베이스 컬럼의 정밀도와 무관하게 항상 밀리초 정밀도의 Kafka Connect 내장 Time·Date·Timestamp 표현으로 표현해요. 'isostring'은 시간·날짜·타임스탬프 값을 UTC 시간대의 ISO-8601 형식 문자열로 표현해요. 'microseconds'는 항상 마이크로초 정밀도로 표현해요. 'nanoseconds'는 항상 나노초 정밀도로 표현해요. | adaptive | String |
| tombstonesOnDelete (sqlserver) | delete 연산을 delete 이벤트와 그 뒤의 tombstone 이벤트로 표현할지(true), delete 이벤트만으로 표현할지(false) 여부예요. tombstone 이벤트를 내보내면(기본 동작) 소스 레코드가 지워졌을 때 Kafka가 해당 키와 관련된 모든 이벤트를 완전히 삭제할 수 있어요. | false | boolean |
| topicNamingStrategy (sqlserver) | 데이터 변경, 스키마 변경, 트랜잭션, 하트비트 이벤트 등의 토픽 이름을 정하는 데 쓸 TopicNamingStrategy 클래스의 이름이에요. | io.debezium.schema.SchemaTopicNamingStrategy | String |
| topicPrefix (sqlserver) | 필수 특정 데이터베이스 서버/클러스터가 변경을 캡처하고 있음을 식별하고 네임스페이스를 제공하는 토픽 접두어예요. 토픽 접두어는 다른 모든 커넥터와 구별되게 유니크해야 해요. 이 커넥터가 내보내는 이벤트를 받는 모든 Kafka 토픽 이름의 접두어로 쓰이기 때문이에요. 영숫자, 하이픈, 점, 언더스코어만 받아들여야 해요. | String | |
| transactionMetadataFactory (sqlserver) | 트랜잭션 컨텍스트와 트랜잭션 struct/스키마를 만드는 클래스예요. | io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory | String |
엔드포인트 옵션 (Endpoint Options)
Debezium SQL Server Connector 엔드포인트는 다음 URI 문법으로 설정해요:
debezium-sqlserver:name
다음 _path_와 query 파라미터를 사용해요:
경로 파라미터 (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) | 오프셋 저장소 토픽을 만들 때 사용할 복제 계수(replication factor)예요. 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 | | binaryHandlingMode (sqlserver) | 변경 이벤트에서 binary(blob, binary 등) 컬럼을 어떻게 표현할지 정해요. 'bytes'는 binary 데이터를 byte 배열로 표현하고(기본값), 'base64'는 base64 인코딩 문자열로, 'base64-url-safe'는 base64-url-safe 인코딩 문자열로, 'hex'는 hex 인코딩(base16) 문자열로 표현해요. | bytes | String | | columnExcludeList (sqlserver) | 변경 이벤트에서 제외할 컬럼과 일치하는 정규 표현식이에요. | | String | | columnIncludeList (sqlserver) | 변경 이벤트에 포함할 컬럼과 일치하는 정규 표현식이에요. | | String | | columnPropagateSourceType (sqlserver) | 완전한 이름(fully-qualified name)으로 컬럼과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. 일치하면 해당 컬럼의 원래 타입과 원래 길이가 내보낸 변경 레코드의 필드 스키마에 파라미터로 추가돼요. | | String | | connectionValidationTimeoutMs (sqlserver) | 커넥션 검증이 끝나기까지 기다리는 최대 시간(밀리초)이에요. 기본값은 60초예요. | 1m | long | | converters (sqlserver) | 기본 컨버터 대신 사용할 커스텀 컨버터의 선택 목록이에요. 컨버터는 '.type' 설정 옵션으로 정의하고 '.' 옵션들로 구성해요. | | String | | customMetricTags (sqlserver) | 커스텀 메트릭 태그는 키-값 쌍을 받아서 MBean 객체 이름을 커스터마이즈해요. 이 이름은 일반 이름 끝에 덧붙여지고, 각 키는 MBean 객체 이름의 태그가 되며, 그에 대응하는 값이 그 키의 태그 값이 돼요. 예: k1=v1,k2=v2. | | String | | customSanitizePattern (sqlserver) | 값을 마스킹해야 할 설정 키를 식별하는 정규 표현식이에요. 이 값을 설정하면 Debezium의 기본 비밀번호 마스킹 패턴 대신 이 커스텀 패턴을 사용해요. | .*secret$|.*password$|.*sasl\.jaas\.config$|.*basic\.auth\.user\.info|.*registry\.auth\.client-secret|.*credentials\.json$|.*connectionstring$|.*connection\.string$ | String | | databaseHostname (sqlserver) | 데이터베이스 서버의, 이름 확인이 가능한 호스트명이나 IP 주소예요. | | String | | databaseInstance (sqlserver) | SQL Server 인스턴스 이름이에요. | | String | | databaseNames (sqlserver) | 커넥터가 변경을 캡처할 데이터베이스들의 이름이에요. | | String | | databasePassword (sqlserver) | 필수 데이터베이스에 접속할 때 쓸 데이터베이스 사용자의 비밀번호예요. | | String | | databasePort (sqlserver) | 데이터베이스 서버의 포트예요. | 1433 | int | | databaseQueryTimeoutMs (sqlserver) | 쿼리 실행을 기다리는 시간(밀리초)이에요. 기본값은 600초(600,000ms)이고, 0이면 제한이 없어요. | 10m | int | | databaseUser (sqlserver) | 데이터베이스에 접속할 때 쓸 데이터베이스 사용자의 이름이에요. | | String | | dataQueryMode (sqlserver) | 커넥터가 CDC 데이터를 조회하는 방식을 조절해요. 기본값인 'direct'는 커넥터가 변경 테이블(change tables)을 직접 조회하게 해요. 'function'은 cdc.fn_cdc_get_all_changes# 함수를 호출해서 데이터를 조회한다는 뜻이에요. | direct | String | | datatypePropagateSourceType (sqlserver) | 데이터베이스 고유의 데이터 타입 이름과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. 일치하면 해당 데이터 타입의 원래 타입과 원래 길이가 내보낸 변경 레코드의 필드 스키마에 파라미터로 추가돼요. | | String | | decimalHandlingMode (sqlserver) | 변경 이벤트에서 DECIMAL과 NUMERIC 컬럼을 어떻게 표현할지 정해요. 'precise'(기본값)는 java.math.BigDecimal로 값을 표현하고, 변경 이벤트에는 binary 표현과 Kafka Connect의 'org.apache.kafka.connect.data.Decimal' 타입으로 인코딩돼요. 'string'은 값을 문자열로 표현해요. 'double'은 Java의 'double'로 표현하는데, 정밀도는 떨어질 수 있지만 컨슈머에서 훨씬 다루기 쉬워요. | precise | String | | errorsMaxRetries (sqlserver) | 실패하기 전에 커넥션 오류를 재시도하는 최대 횟수예요(-1 = 제한 없음, 0 = 비활성화, 0 = 재시도 횟수). | -1 | int | | eventProcessingFailureHandlingMode (sqlserver) | 이벤트 처리 중 실패(즉, 손상된 이벤트를 만났을 때)를 어떻게 다룰지 정해요. 'fail'(기본값)은 문제가 된 이벤트와 그 위치를 알리는 예외를 던져서 커넥터를 멈춰요. 'warn'은 문제가 된 이벤트와 그 위치를 로그로 남기고 그 이벤트를 건너뛰어요. 'ignore'는 문제가 된 이벤트를 그냥 건너뛰어요. | fail | String | | executorShutdownTimeoutMs (sqlserver) | 태스크 실행자(task executor)가 종료되기를 기다리는 최대 시간(밀리초)이에요. | 4s | long | | extendedHeadersEnabled (sqlserver) | 다운스트림 처리 시스템에서 CDC 이벤트의 출처를 추적·식별하는 데 꼭 필요한 메타데이터를 담는 Debezium 컨텍스트 헤더를 켜거나 꺼요. | true | boolean | | guardrailCollectionsLimitAction (sqlserver) | guardrail 컬렉션 한도를 초과했을 때 취할 동작을 정해요. 'warn'(기본값)은 경고 메시지를 로그로 남기고 계속 처리하고, 'fail'은 오류로 커넥터를 멈춰요. | warn | String | | guardrailCollectionsMax (sqlserver) | 커넥터가 캡처할 수 있는 컬렉션·테이블의 최대 개수예요. 한도를 초과하면 'guardrail.collections.limit.action'에 지정한 동작을 해요. 0으로 설정하면 이 guardrail을 끄는 거예요. | 0 | int | | heartbeatActionQuery (sqlserver) | 하트비트마다 실행하는 쿼리예요. | | String | | heartbeatIntervalMs (sqlserver) | 커넥터가 하트비트 토픽으로 하트비트 메시지를 주기적으로 보내는 간격(밀리초)이에요. 0으로 설정하면 하트비트 메시지를 꺼요. 기본값은 꺼져 있어요. | 0ms | int | | heartbeatTopicsPrefix (sqlserver) | 하트비트 토픽 이름에 쓰는 접두어예요. 기본값은 __debezium-heartbeat예요. | __debezium-heartbeat | String | | includeSchemaChanges (sqlserver) | 데이터베이스 스키마 변경을 데이터베이스 서버 ID와 같은 이름의 Kafka 토픽에 발행할지 여부예요. 각 스키마 변경은 데이터베이스 이름을 담은 키로 기록되고, 값에는 새 스키마의 논리적 설명과 (있다면) DDL 문이 들어가요. 기본값은 'true'예요. 이는 커넥터가 내부적으로 데이터베이스 스키마 히스토리를 기록하는 방식과는 별개예요. | true | boolean | | includeSchemaComments (sqlserver) | 커넥터가 테이블·컬럼의 주석을 메타데이터 객체로 파싱할지 여부예요. 참고: 이 옵션을 켜면 메모리 사용량에 영향이 있어요. ColumnImpl 객체의 개수와 크기가 Debezium 커넥터의 메모리 소비를 크게 좌우하는데, 각 객체에 String을 하나 더하는 건 상당히 무거워질 수 있어요. 기본값은 'false'예요. | false | boolean | | incrementalSnapshotAllowSchemaChanges (sqlserver) | 증분 스냅샷 중 스키마 변경을 감지하고 현재 청크를 다시 골라서 잠금(locking) DDL을 피하게 해 줘요. 기본 키 변경은 지원하지 않고, 증분 스냅샷 중에 수행하면 잘못된 결과를 낼 수 있다는 점에 유의하세요. 또한 스키마 변경이 컬럼 기본값에만 영향을 준다면, binlog 스트림에서 DDL을 처리하기 전까지는 변경을 감지하지 못해요. 이는 스냅샷 이벤트의 값에는 영향을 주지 않지만, 스냅샷 이벤트의 스키마에는 오래된 기본값이 남을 수 있어요. | false | boolean | | incrementalSnapshotChunkSize (sqlserver) | 증분 스냅샷에서 청크(chunk)의 최대 크기(문서/로우 수)예요. | 1024 | int | | incrementalSnapshotOptionRecompile (sqlserver) | 증분 스냅샷 과정에서 각 SELECT 문에 OPTION(RECOMPILE)을 추가해요. 파라미터 스니핑(parameter sniffing)을 막아 주지만, 소스 데이터베이스에 CPU 부담을 줄 수 있어요. | false | boolean | | incrementalSnapshotWatermarkingStrategy (sqlserver) | 증분 스냅샷 동안 워터마킹에 사용할 전략을 지정해요. 'insert_insert'는 open과 close 시그널을 모두 signal data collection에 기록해요(기본값). 'insert_delete'는 open 시그널만 signal data collection에 기록하고, close는 해당 open 시그널을 삭제해요. | INSERT_INSERT | String | | legacySnapshotMaxThreads (sqlserver) | 켜면 레거시 table-per-thread 병렬 스냅샷 알고리즘을 사용해요. false로 두면(기본값) 테이블을 청크로 나눠서 모든 스냅샷 스레드에 걸쳐 처리하기 때문에 스냅샷 동시성을 더 높일 수 있어요. | false | boolean | | maxBatchSize (sqlserver) | 소스 레코드 배치 하나의 최대 크기예요. 기본값은 2048이에요. | 2048 | int | | maxIterationTransactions (sqlserver) | 데이터베이스별로 여러 테이블에서 변경을 스트리밍할 때 커넥터의 메모리 사용량을 줄이는 데 쓸 수 있는 프로퍼티예요. | 500 | int | | maxQueueSize (sqlserver) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트 큐의 최대 크기예요. 기본값은 8192이고, 항상 최대 배치 크기보다 커야 해요. | 8192 | int | | maxQueueSizeInBytes (sqlserver) | 데이터베이스 로그에서 읽었지만 아직 기록되거나 전달되지 않은 변경 이벤트의 큐 최대 크기(바이트)예요. 기본값은 0이고, 기능이 꺼져 있다는 뜻이에요. | 0 | long | | memoryManagementSchemasClass (sqlserver) | 스키마 메타데이터용 스토리지 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 하고, 기본값은 인메모리 스토리지용 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String | | memoryManagementTablesClass (sqlserver) | 테이블 메타데이터용 스토리지 구현의 완전한 클래스 이름(fully-qualified class name)이에요. 이 클래스는 io.debezium.relational.TableMappingStorage를 구현해야 하고, 기본값은 인메모리 스토리지용 io.debezium.relational.ConcurrentMapTableMappingStorage예요. | io.debezium.relational.ConcurrentMapTableMappingStorage | String | | messageKeyColumns (sqlserver) | 메시지 키로 쓸 완전한 이름(fully-qualified)의 테이블과 컬럼(들)과 일치하는 표현식을 세미콜론으로 나열한 목록이에요. 각 표현식은 ':' 패턴과 일치해야 하고, 테이블 이름은 커넥터에 따라 (DB_NAME.TABLE_NAME)이나 (SCHEMA_NAME.TABLE_NAME)으로 정의할 수 있으며, 키 컬럼은 커스텀 키를 나타내는 컬럼의 쉼표 목록이에요. 명시적인 키 설정이 없는 테이블은 테이블의 기본 키 컬럼(들)이 메시지 키로 쓰여요. 예: dbserver1.inventory.orderlines:orderId,orderLineId;dbserver1.inventory.orders:id. | | String | | notificationEnabledChannels (sqlserver) | 활성화된 알림 채널 이름 목록이에요. | | String | | notificationSinkTopicName (sqlserver) | 알림용 토픽의 이름이에요. 활성화된 채널 목록에 'sink'가 있으면 필수예요. | | String | | openlineageIntegrationConfigFilePath (sqlserver) | OpenLineage 파일 설정의 경로예요. 자세한 내용은 https://openlineage.io/docs/client/java/configuration을 참고하세요. | ./openlineage.yml | String | | openlineageIntegrationDatasetKafkaBootstrapServers (sqlserver) | 입력/출력 네임스페이스로 쓰이는 Kafka 부트스트랩 서버 주소예요. | | String | | openlineageIntegrationEnabled (sqlserver) | Debezium이 OpenLineage API로 데이터 리니지(data lineage) 메타데이터를 내보내도록 켜요. | false | boolean | | openlineageIntegrationJobDescription (sqlserver) | Debezium이 내보내는 잡의 설명이에요. | Debezium change data capture job | String | | openlineageIntegrationJobNamespace (sqlserver) | Debezium이 내보내는 잡의 네임스페이스예요. | | String | | openlineageIntegrationJobOwners (sqlserver) | Debezium이 내보내는 잡의 소유자(owners)예요. 키-값 쌍을 쉼표로 나열해요. 예: k1=v1,k2=v2. | | String | | openlineageIntegrationJobTags (sqlserver) | Debezium이 내보내는 잡의 태그예요. 키-값 쌍을 쉼표로 나열해요. 예: k1=v1,k2=v2. | | String | | pollIntervalMs (sqlserver) | 이벤트가 없는 상태로 받은 뒤 새 변경 이벤트가 나타나기를 기다리는 시간(밀리초)이에요. 기본값은 500 ms예요. | 500ms | long | | postProcessors (sqlserver) | 포스트 프로세서의 선택 목록이에요. 프로세서는 '.type' 설정 옵션으로 정의하고 '' 옵션들로 구성해요. | | String | | provideTransactionMetadata (sqlserver) | 이벤트 카운트와 함께 트랜잭션 메타데이터 추출을 켜요. | false | boolean | | retriableRestartConnectorWaitMs (sqlserver) | 재시도 가능한(retriable) 예외가 발생한 뒤 커넥터를 다시 시작하기 전에 기다리는 시간이에요. 기본값은 10000ms예요. | 10s | long | | schemaHistoryInternal (sqlserver) | 데이터베이스 스키마 변경을 저장·복구하는 데 쓸 SchemaHistory 클래스 이름이에요. 히스토리 관련 설정 프로퍼티는 'schema.history.internal.' 문자열을 접두사로 써요. | io.debezium.storage.kafka.history.KafkaSchemaHistory | String | | schemaHistoryInternalFileFilename (sqlserver) | 데이터베이스 스키마 히스토리를 기록하는 데 쓸 파일의 경로예요. | | String | | schemaHistoryInternalSkipUnparseableDdl (sqlserver) | binlog에서 파싱할 수 없는 DDL 문을 만났을 때 Debezium이 취할 동작을 정해요. 기본으로 커넥터는 동작을 멈추지만, 설정을 바꾸면 파싱할 수 없는 문을 무시할 수 있어요. 건너뛰기를 켜면 Debezium이 메타데이터 변경을 놓칠 수 있어요. | false | boolean | | schemaHistoryInternalStoreOnlyCapturedDatabasesDdl (sqlserver) | Debezium이 데이터베이스 스키마 히스토리에 어떤 DDL을 저장할지 정해요. 기본(false)은 들어오는 모든 DDL 문을 저장해요. true로 두면 캡처한 스키마/데이터베이스의 테이블을 건드리는 DDL만 저장해요. | false | boolean | | schemaHistoryInternalStoreOnlyCapturedTablesDdl (sqlserver) | Debezium이 데이터베이스 스키마 히스토리에 어떤 DDL을 저장할지 정해요. 기본(false)은 들어오는 모든 DDL 문을 저장해요. true로 두면 캡처한 테이블을 건드리는 DDL만 저장해요. | false | boolean | | schemaNameAdjustmentMode (sqlserver) | 커넥터가 사용하는 메시지 컨버터와의 호환성을 위해 스키마 이름을 어떻게 조정할지 정해요. 'avro'는 Avro 타입 이름에 쓸 수 없는 문자를 언더스코어로 바꿔요. 'avro_unicode'는 언더스코어나 Avro 타입 이름에 쓸 수 없는 문자를 _uxxxx 같은 대응하는 유니코드로 바꿔요. 참고: _는 Java의 백슬래시 같은 이스케이프 시퀀스예요. 'none'은 아무 조정도 하지 않아요(기본값). | none | String | | signalDataCollection (sqlserver) | Debezium에 시그널/커맨드를 보낼 때 쓰는 데이터 컬렉션의 이름이에요. 멀티 파티션 모드 커넥터는 시그널 데이터 컬렉션을 쉼표로 구분해서 여러 개 지정할 수 있어요. 설정하지 않으면 시그널링은 꺼져 있어요. | | String | | signalEnabledChannels (sqlserver) | 활성화된 채널 이름의 목록이에요. source 채널이 기본으로 활성화돼요. | source | String | | signalPollIntervalMs (sqlserver) | 등록된 채널에서 새 시그널을 찾는 간격(밀리초)이에요. 기본값은 5초예요. | 5s | long | | skippedOperations (sqlserver) | 스트리밍 중에 건너뛸 연산을 쉼표로 나열한 목록이에요. 'c'는 insert/create, 'u'는 update, 'd'는 delete, 't'는 truncate를 뜻하고, 'none'은 아무것도 건너뛰지 않는다는 뜻이에요. 기본값으로는 truncate 연산만 건너뛰어요. | t | String | | snapshotDelayMs (sqlserver) | 스냅샷이 시작되기 전의 지연 시간(밀리초)이에요. 기본값은 0 ms예요. | 0ms | long | | snapshotFetchSize (sqlserver) | 스냅샷을 수행하는 동안 메모리로 읽어 들일 최대 레코드 수예요. | | int | | snapshotIncludeCollectionList (sqlserver) | 커넥터를 만들거나 재시작할 때 스냅샷을 꼭 찍어야 할 테이블/컬렉션 목록을 지정하려면 이 설정을 반드시 지정해야 해요. | | String | | snapshotIsolationMode (sqlserver) | 어떤 트랜잭션 격리 수준을 쓰는지, 그리고 커넥터가 캡처한 테이블을 얼마나 오래 잠그는지 조절해요. 기본값은 'repeatable_read'로, repeatable read 격리 수준을 쓴다는 뜻이에요. 또한 스키마 스냅샷 동안 거는 잠금의 종류는 snapshot.locking.mode 프로퍼티에 따라 달라져요. 'exclusive'를 쓰면 스냅샷 내내 캡처한 모든 테이블에 대해 snapshot.locking.mode 프로퍼티가 지정한 종류의 잠금을 쥐고 있어서(읽기와 업데이트를 막음) 다른 트랜잭션의 접근을 차단해요. 'snapshot'을 지정하면 초기 스냅샷을 SNAPSHOT 격리 수준으로 수행해서 스냅샷 일관성을 보장하고, 테이블·로우 잠금은 걸지 않아요. 'read_committed'를 지정하면 초기 스냅샷을 READ COMMITTED 격리 수준으로 수행해요. 오래 잡는 잠금이 없어서 초기 스냅샷이 다른 트랜잭션의 로우 업데이트를 막지는 않지만, 스냅샷 일관성은 보장되지 않아요. 'read_uncommitted' 모드에서는 테이블·로우 잠금을 걸지 않지만, 커넥터는 스냅샷 일관성을 보장하지 않아요. | repeatable_read | String | | snapshotLockTimeoutMs (sqlserver) | 스냅샷 시작 시 테이블 잠금을 기다리는 최대 밀리초예요. 이 시간 안에 잠금을 얻지 못하면 스냅샷이 중단돼요. 기본값은 10초예요. | 10s | long | | snapshotMaxThreads (sqlserver) | 스냅샷을 수행할 때 쓰는 최대 스레드 수예요. 기본값은 1이에요. | 1 | int | | snapshotMaxThreadsMultiplier (sqlserver) | 테이블당 스냅샷 청크 개수를 늘리는 데 쓰는 계수예요. 기본 동작은 'row_count/snapshot.max.threads'로 로우당 청크 수를 계산해요. 큰 테이블에는 이게 최선이 아닐 수 있는데, multiplier를 쓰면 'row_count/(snapshot.max.threads snapshot.max.threads.multiplier)'로 청크 개수를 늘리도록 공식이 조정돼요. | 1 | int | | snapshotMode (sqlserver) | 커넥터 시작 시 스냅샷을 실행하는 기준이에요. 다음 스냅샷 옵션 중 하나를 고르세요. 'initial'(기본값): 논리 서버 이름(logical server name)에 대한 오프셋을 찾지 못하면 설정된 테이블의 현재 전체 상태를 캡처하는 스냅샷을 실행하고, 스냅샷이 끝나면 트랜잭션 로그에서 변경을 스트리밍하기 시작해요. 'initial_only': 'initial' 옵션처럼 스냅샷을 수행하지만, 스냅샷이 끝나면 커넥터가 멈추고 트랜잭션 로그에서 변경을 스트리밍하지 않아요. 'schema_only': 논리 서버 이름에 대한 오프셋을 찾지 못하면 테이블 데이터 없이 스키마(테이블 구조)만 캡처하는 스냅샷을 실행하고, 스냅샷이 끝나면 트랜잭션 로그에서 변경을 스트리밍하기 시작해요. | initial | String | | snapshotModeConfigurationBasedSnapshotData (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 데이터를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean | | snapshotModeConfigurationBasedSnapshotOnDataError (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 오류가 났을 때 데이터를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean | | snapshotModeConfigurationBasedSnapshotOnSchemaError (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 오류가 났을 때 스키마를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean | | snapshotModeConfigurationBasedSnapshotSchema (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 스키마를 스냅샷할지 말지를 지정할 수 있게 해 줘요. | false | boolean | | snapshotModeConfigurationBasedStartStream (sqlserver) | 'snapshot.mode'가 configuration_based로 설정되어 있으면, 스냅샷 이후에 스트림을 시작할지 말지를 지정할 수 있게 해 줘요. | false | boolean | | snapshotModeCustomName (sqlserver) | 'snapshot.mode'가 custom으로 설정되어 있으면, 'name()' 메서드가 제공하는 커스텀 구현의 이름을 지정하도록 이 설정을 반드시 지정해야 해요. 구현체는 'Snapshotter' 인터페이스를 구현해야 하고, 앱이 부팅될 때마다 호출돼서 스냅샷을 할지 정해요. | | String | | snapshotSelectStatementOverrides (sqlserver) | 이 프로퍼티는 완전한 이름(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 (sqlserver) | 초기 스냅샷에서 테이블을 처리하는 순서를 조절해요. descending 값을 주면 테이블을 로우 수 내림차순으로 정렬해요. ascending 값을 주면 로우 수 오름차순으로 정렬해요. disabled(기본값)는 로우 수 정렬을 꺼요. | disabled | String | | sourceinfoStructMaker (sqlserver) | SourceInfo 스키마와 struct를 돌려주는 SourceInfoStructMaker 클래스의 이름이에요. | io.debezium.connector.sqlserver.SqlServerSourceInfoStructMaker | String | | statisticsMetricsEnabled (sqlserver) | 레코드 처리 지연 시간 같은 여러 통계와 quantiles 같은 파생 데이터를 수집하게 해요. 기본값으로 통계 수집은 켜져 있어요. | true | boolean | | streamingDelayMs (sqlserver) | 스냅샷이 끝나고 스트리밍이 시작되기까지의 지연 시간(밀리초)이에요. 기본값은 0 ms예요. | 0ms | long | | streamingFetchSize (sqlserver) | 스트리밍 중에 각 테이블에서 한 번에 읽을 최대 로우 수를 지정해요. 커넥터는 이 크기의 배치 여러 개로 테이블 내용을 읽어요. 기본값은 0이고, 제한이 없다는 뜻이에요. | 0 | int | | tableExcludeList (sqlserver) | 모니터링에서 제외할 테이블의 완전한 이름(fully-qualified name)과 일치하는 정규 표현식을 쉼표로 나열한 목록이에요. | | String | | tableIgnoreBuiltin (sqlserver) | 내장(built-in) 테이블을 무시할지 여부를 지정하는 플래그예요. | true | boolean | | tableIncludeList (sqlserver) | 변경을 캡처할 테이블들이에요. | | String | | timePrecisionMode (sqlserver) | 시간, 날짜, 타임스탬프는 여러 정밀도로 표현할 수 있어요. 'adaptive'(기본값)는 시간·날짜·타임스탬프 값의 정밀도를 데이터베이스 컬럼의 정밀도에 맞춰요. 'adaptive_time_microseconds'는 'adaptive' 모드와 비슷하지만 TIME 필드는 항상 마이크로초 정밀도를 써요. 'connect'는 데이터베이스 컬럼의 정밀도와 무관하게 항상 밀리초 정밀도의 Kafka Connect 내장 Time·Date·Timestamp 표현으로 표현해요. 'isostring'은 시간·날짜·타임스탬프 값을 UTC 시간대의 ISO-8601 형식 문자열로 표현해요. 'microseconds'는 항상 마이크로초 정밀도로 표현해요. 'nanoseconds'는 항상 나노초 정밀도로 표현해요. | adaptive | String | | tombstonesOnDelete (sqlserver) | delete 연산을 delete 이벤트와 그 뒤의 tombstone 이벤트로 표현할지(true), delete 이벤트만으로 표현할지(false) 여부예요. tombstone 이벤트를 내보내면(기본 동작) 소스 레코드가 지워졌을 때 Kafka가 해당 키와 관련된 모든 이벤트를 완전히 삭제할 수 있어요. | false | boolean | | topicNamingStrategy (sqlserver) | 데이터 변경, 스키마 변경, 트랜잭션, 하트비트 이벤트 등의 토픽 이름을 정하는 데 쓸 TopicNamingStrategy 클래스의 이름이에요. | io.debezium.schema.SchemaTopicNamingStrategy | String | | topicPrefix (sqlserver) | 필수 특정 데이터베이스 서버/클러스터가 변경을 캡처하고 있음을 식별하고 네임스페이스를 제공하는 토픽 접두어예요. 토픽 접두어는 다른 모든 커넥터와 구별되게 유니크해야 해요. 이 커넥터가 내보내는 이벤트를 받는 모든 Kafka 토픽 이름의 접두어로 쓰이기 때문이에요. 영숫자, 하이픈, 점, 언더스코어만 받아들여야 해요. | | String | | transactionMetadataFactory (sqlserver) | 트랜잭션 컨텍스트와 트랜잭션 struct/스키마를 만드는 클래스예요. | io.debezium.pipeline.txmetadata.DefaultTransactionMetadataFactory | String |
메시지 헤더 (Message Headers)
Debezium SQL Server 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 |
설정에 대해 더 자세히 알아보려면 임베디드 엔진 프로퍼티와 SQL Server 커넥터 프로퍼티를 참고하세요.
사용법 (Usage)
메시지 바디 (Message body)
메시지 바디가 null이 아니라면(톰브스톤의 경우 null이에요) 이벤트가 발생한 뒤의 로우 상태를 담고 있어요. 두 가지 형식 중 하나예요:
-
Struct -
Map(Struct에서Map으로 가는 내장 Type Converter를 쓰는 경우)
자세한 내용은 아래를 참고하세요.
예제 (Examples)
이벤트 컨슈밍 (Consuming events)
SQL Server 커넥터의 Debezium 이벤트를 받아 보는 기본 라우트예요.
from("debezium-sqlserver: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-sqlserver: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 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-sqlserver: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 타입으로 스키마 정보를 이렇게 얻을 수 있어요:
Java 전용: processor에서 Struct 스키마 접근하기
from("debezium-sqlserver:[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이 어떻게 동작하는지, 그리고 설정이 기대한 동작을 어떻게 반영하는지 이해해야 해요. 특히 장애 처리 부분이 그래요.
더 알아보기 (Learn more)
- Debezium 공식 문서 — Debezium 엔진과 SQL Server 커넥터의 공식 레퍼런스
- Debezium 임베디드 엔진 문서 — 오프셋 관리와 장애 처리 동작의 근거
- Apache Camel Debezium SQL Server 컴포넌트 문서 — 이 번역문의 출처
Debezium 자체의 스냅샷·오프셋·장애 처리 동작은 컴포넌트 설정보다 엔진 문서가 더 상세해요. 프로덕션 배치 전에는 위의 임베디드 엔진 문서를 먼저 확인하세요.