SQL 매핑을 사용한 MySQL CDC
Doris 지속 적재는 실험적 기능이며 Doris 4.1.5부터 지원됩니다.
SQL 매핑 동기화는 Job + CDC Stream TVF를 통해 구현되며, 이미 존재하는 Doris 테이블을 대상으로 합니다(INSERT INTO tbl SELECT * FROM cdc_stream(...)). Doris SQL의 표현력을 활용하면 동기화 파이프라인에서 열 매핑, 필터링 및 데이터 변환을 수행할 수 있습니다. 데이터 처리가 필요한 실시간 동기화 시나리오에 적합합니다.
Flink CDC의 읽기 기능을 통합하여 Doris는 MySQL에서 변경 로그(Binlog)를 읽고 소스 테이블에서 대상 테이블로 전체 + 증분 동기화를 수행합니다. Doris가 다운스트림 테이블을 자동으로 만들고 데이터베이스별로 테이블 그룹을 동기화하도록 하려면 MySQL CDC 자동 테이블 생성 동기화를 참조하세요.
적용 시나리오
- MySQL 단일 테이블을 Doris로 지속 동기화하며 대상 테이블 스키마가 이미 계획된 경우
- 동기화 중 열 제거, 열 매핑, 필드 이름 변경 또는 데이터 변환이 필요한 경우
- 엔드투엔드 exactly-once 의미 체계가 필요한 실시간 데이터 통합
사전 요구 사항
| 항목 | 설명 |
|---|---|
| Doris 버전 | 4.1.5 이상 |
| 테이블 유형 | 업스트림 소스 테이블에는 기본 키가 있어야 하며 Doris 대상 테이블은 Unique Key 모델을 사용해야 합니다 |
| 사용자 권한 | Load 권한이 필요합니다 |
| MySQL 구성 | MySQL 측에서 Binlog를 활성화해야 합니다. 구성 가이드를 참조하세요 |
| 의미 체계 보장 | exactly-once 의미 체계를 지원합니다 |
빠른 시작
다음 최소 실행 가능 예제에서는 전체 흐름인 작업 생성과 상태 확인을 보여 줍니다.
1단계: 가져오기 작업 생성
CREATE STREAMING JOB을 사용하여 지속 가져오기 작업을 생성합니다.
CREATE JOB mysql_single_sync
ON STREAMING
DO
INSERT INTO db1.tbl1
SELECT * FROM cdc_stream(
"type" = "mysql",
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306",
"driver_url" = "mysql-connector-java-8.0.25.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root",
"password" = "123456",
"database" = "source_db",
"table" = "source_table",
"offset" = "initial"
)
2단계: 가져오기 상태 확인
select * from jobs("type"="insert") where ExecuteType = "STREAMING";
3단계: 작업 운영
일반적인 작업(일시 중지, 재개, 삭제, Task 보기 등)은 지속 가져오기 개요를 참조하세요.
매개변수 참조
데이터 소스 매개변수
CDC Stream TVF는 다음 MySQL 데이터 소스 매개변수를 지원합니다.
| 매개변수 | 필수 | 기본값 | 설명 |
|---|---|---|---|
type | 예 | - | 데이터 소스 유형입니다. mysql로 설정합니다. |
jdbc_url | 예 | - | MySQL JDBC 연결 문자열입니다. |
driver_url | 예 | - | JDBC 드라이버 jar 경로입니다. 파일 이름, 로컬 절대 경로 또는 HTTP URL을 지원합니다. 자세한 내용은 JDBC Catalog 개요를 참조하세요. |
driver_class | 예 | - | JDBC 드라이버 클래스 이름입니다(예: com.mysql.cj.jdbc.Driver). |
user | 예 | - | 데이터베이스 사용자 이름입니다. |
password | 예 | - | 데이터베이스 비밀번호입니다. |
database | 예 | - | MySQL 데이터베이스 이름입니다. |
table | 예 | - | 동기화할 테이블 이름입니다. 각 SQL Mapping 작업은 하나의 소스 테이블만 지원합니다. |
offset | 예 | - | 시작 오프셋입니다. initial: 전체 및 증분 동기화, snapshot: 전체 동기화만 수행, earliest: 사용 가능한 가장 이른 Binlog 오프셋부터 시작, latest: 작업 시작 후 변경 사항만 동기화합니다. 정확한 JSON 오프셋을 지정할 수도 있습니다(예: {"file":"binlog.000001","pos":"154"} 또는 {"gtids":"<gtid_set>"}). |
snapshot_split_size | 아니요 | 40960 | 행 단위 분할 크기입니다. 전체 동기화 중 테이블이 여러 split으로 나뉩니다. 양의 정수여야 합니다. |
snapshot_parallelism | 아니요 | 1 | 전체 동기화 단계의 병렬 처리 수, 즉 한 번에 Task가 예약하는 최대 split 수입니다. 양의 정수여야 합니다. |
skip_snapshot_backfill | 아니요 | false | 스냅샷 중 Binlog 백필을 건너뛸지 여부입니다. true로 설정하면 at-least-once 의미 체계를 사용합니다. |
server_id | 아니요 | 자동 생성 | MySQL CDC reader의 서버 ID입니다. 5400과 같은 단일 값이나 5400-5408과 같은 폐구간을 지원합니다. 구간 너비는 snapshot_parallelism 이상이어야 합니다. |
ssl_mode | 아니요 | disable | SSL 모드입니다. 유효한 값은 disable, require, verify-ca입니다. |
ssl_rootcert | 조건부 필수 | - | FILE:<file_name> 형식의 CA 인증서 파일입니다. ssl_mode가 verify-ca인 경우 필요합니다. 먼저 CREATE FILE을 사용하여 파일을 업로드하세요. |
include_delete_sign | 아니요 | false | TVF가 __DORIS_DELETE_SIGN__ 열을 추가로 출력할지 여부입니다. 업스트림 DELETE 작업을 Doris 기본 키 테이블의 삭제로 동기화하려면 true로 설정합니다. |
include_delete_sign을 활성화하면 대상 테이블은 Merge-on-Write Unique Key 테이블이어야 하며 INSERT 대상 열 목록과 SELECT 목록 모두에서 __DORIS_DELETE_SIGN__을 명시적으로 매핑해야 합니다.
CREATE JOB mysql_cdc_with_delete
ON STREAMING
DO
INSERT INTO db1.target_table (id, value, __DORIS_DELETE_SIGN__)
SELECT id, value, __DORIS_DELETE_SIGN__
FROM cdc_stream(
"type" = "mysql",
"jdbc_url" = "jdbc:mysql://127.0.0.1:3306",
"driver_url" = "mysql-connector-java-8.0.25.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver",
"user" = "root",
"password" = "123456",
"database" = "source_db",
"table" = "source_table",
"offset" = "initial",
"include_delete_sign" = "true"
);
Job 구성 매개변수
다음 매개변수는 CREATE JOB ... PROPERTIES (...)를 통해 설정합니다.
| 매개변수 | 기본값 | 설명 |
|---|---|---|
max_interval | 10 | 업스트림에 새 데이터가 없을 때의 유휴 예약 간격(초)입니다. 1 이상인 정수여야 합니다. |
compute_group | 현재 세션 또는 사용자 기본 compute group | compute-storage 분리 모드에서만 지원됩니다. 작업이 실행되는 compute group을 지정합니다. 사용자에게 해당 compute group에 대한 USAGE 권한이 있어야 합니다. |
session.<variable_name> | 해당 세션 변수의 기본값 | INSERT 작업의 세션 변수를 설정합니다. 적재 변수는 Insert Into Select를 참조하세요. |
CDC 위치를 재설정하는 데 사용되는 Job Property offset과 ALTER JOB을 통한 전체 제한 사항은 공통 작업 적재 구성 매개변수를 참조하세요. 새 작업의 초기 위치는 cdc_stream(...)에서 설정해야 합니다.
FAQ
Q1: SQL 매핑 동기화와 자동 테이블 생성 동기화의 차이점은 무엇인가요?
- SQL 매핑 동기화: 대상 Doris 테이블을 미리 생성해야 합니다. 열 매핑과 데이터 변환을 지원하며 세밀한 처리가 필요한 시나리오에 적합합니다.
- 자동 테이블 생성 동기화: Doris가 다운스트림 테이블을 자동으로 생성하고 데이터베이스 단위로 전체 동기화합니다. 자세한 내용은 MySQL CDC 자동 테이블 생성 동기화를 참조하세요.
Q2: 기본 키가 아닌 테이블을 대상 테이블로 지원하나요?
업스트림 소스 테이블에는 기본 키가 있어야 하며 Doris 대상 테이블은 현재 Unique Key 모델을 사용해야 합니다.
Q3: 기록된 전체 데이터 없이 증분 데이터만 동기화하려면 어떻게 해야 하나요?
offset 매개변수를 latest로 설정합니다. 작업은 전체 동기화 단계를 건너뛰고 Binlog 증분 데이터만 동기화합니다.
Q4: 전체 동기화가 너무 느릴 때 어떻게 최적화하나요?
전체 동기화 단계의 처리량을 높이려면 다음 두 매개변수를 조정할 수 있습니다.
snapshot_split_size: split당 행 수를 늘립니다.snapshot_parallelism: Task당 예약되는 split의 병렬 처리 수를 늘립니다.
snapshot_parallelism을 조정할 때 server_id 범위도 구성되어 있다면 범위 내 ID 수가 병렬 처리 수보다 적지 않은지 확인하세요.