개요
Datastream의 데이터 계층 구조는 다음과 같습니다.
- 데이터 소스와 대상으로 구성된 스트림
- 특정 데이터베이스의 테이블과 같이 스트림의 일부인 객체
- 데이터베이스 삽입과 같이 특정 객체에 의해 생성된 단일 변경사항인 이벤트
스트림, 객체, 이벤트에는 데이터와 메타데이터가 연결되어 있습니다. 이 데이터와 메타데이터는 다양한 용도로 사용할 수 있습니다.
이벤트 정보
각 이벤트는 다음 세 가지 유형의 데이터로 구성됩니다.
- 이벤트 데이터: 스트림 소스에서 발생한 객체의 데이터 자체 변경사항을 나타냅니다. 모든 이벤트에는 변경된 행의 전체가 포함됩니다.
- 일반 메타데이터: 이 메타데이터는 Datastream에서 생성한 모든 이벤트에 표시되며 대상의 중복 데이터 삭제와 같은 작업에 사용됩니다.
- 소스별 메타데이터: 이 메타데이터는 특정 스트림 소스에서 생성한 모든 이벤트에 표시됩니다. 이 메타데이터는 소스에 따라 다릅니다.
이벤트 데이터
이벤트 데이터는 스트림 소스에서 발생하는 지정된 객체의 모든 변경사항에 대한 페이로드입니다.
이벤트는 Avro 또는 JSON 형식입니다.
Avro 형식으로 작업할 때는 이벤트에 각 열의 인덱스와 값이 포함됩니다. 열 색인을 사용하여 열 이름과 통합 유형을 Avro 헤더의 스키마에서 가져올 수 있습니다.
JSON 형식으로 작업할 때는 이벤트에 각 열의 열 이름과 값이 포함됩니다.
이벤트 메타데이터는 이벤트의 출처에 대한 정보를 수집하고 대상에서 중복 데이터를 삭제하며 다운스트림 소비자가 이벤트를 정렬하는 데 사용될 수 있습니다.
다음 표에는 일반 및 소스별 이벤트 메타데이터의 필드와 데이터 유형이 나와 있습니다.
일반 메타데이터
이 메타데이터는 모든 유형의 스트림에서 일관됩니다.
필드 | Avro 유형 | JSON 유형 | 설명 |
---|---|---|---|
stream_name |
문자열 | 문자열 | 생성 시 정의된 고유한 스트림 이름입니다. |
read_method |
문자열 | 문자열 | 변경 데이터 캡처(CDC) 메서드를 사용하여 소스에서 데이터를 읽었는지 또는 CDC 복제 중에 트랜잭션이 롤백될 때 생성되는 보완 작업의 일부로 데이터를 읽었는지 여부를 나타냅니다. 가능한 값은 다음과 같습니다.
|
object |
문자열 | 문자열 | 다양한 유형의 이벤트를 그룹화하는 데 사용되는 이름으로, 일반적으로 소스의 테이블 또는 객체의 이름입니다. |
schema_key |
문자열 | 문자열 | 이벤트의 통합 스키마에 대한 고유 식별자입니다. |
uuid |
문자열 | 문자열 | Datastream에서 생성한 이벤트의 고유 식별자입니다. |
read_timestamp |
timestamp-millis | 문자열 | Datastream에서 레코드를 읽은 타임스탬프(UTC)(밀리초 단위의 에포크 타임스탬프)입니다. |
source_timestamp |
timestamp-millis | 문자열 | 소스에서 레코드가 변경된 타임스탬프(UTC)(밀리초 단위의 에포크 타임스탬프)입니다. |
sort_keys |
{"type": "array", "items": ["string", "long"]} |
배열 | 이벤트가 발생한 순서대로 이벤트를 정렬하는 데 사용할 수 있는 값의 배열입니다. |
소스별 메타데이터
이 메타데이터는 소스 데이터베이스의 CDC 및 백필 이벤트와 연결됩니다. 이 메타데이터를 보려면 아래 드롭다운 메뉴에서 소스를 선택하세요.
소스 | 필드 | Avro 유형 | JSON 유형 | 설명 |
---|---|---|---|---|
MySQL | log_file |
문자열 | 문자열 | Datastream이 CDC 복제에서 이벤트를 가져오는 로그 파일입니다. |
MySQL | log_position |
long | long | MySQL 바이너리 로그의 로그 위치(오프셋)입니다. |
MySQL | primary_keys |
문자열 배열 | 문자열 배열 | 테이블 기본 키를 구성하는 하나 이상의 열 이름 목록입니다. 테이블에 기본 키가 없으면 이 필드는 비어 있습니다. |
MySQL | is_deleted |
부울 | 부울 |
|
MySQL | database |
문자열 | 문자열 | 이벤트와 연결된 데이터베이스입니다. |
MySQL | table |
문자열 | 문자열 | 이벤트와 연결된 테이블입니다. |
MySQL | change_type |
문자열 | 문자열 | 이벤트가 나타내는 변경 유형( |
Oracle | log_file |
문자열 | 문자열 | Datastream이 CDC 복제에서 이벤트를 가져오는 로그 파일입니다. |
Oracle | scn |
long | long | Oracle 트랜잭션 로그의 로그 위치(오프셋)입니다. |
Oracle | row_id |
문자열 | 문자열 | Oracle의 row_id입니다. |
Oracle | is_deleted |
부울 | 부울 |
|
Oracle | database |
문자열 | 문자열 | 이벤트와 연결된 데이터베이스입니다. |
Oracle | schema |
문자열 | 문자열 | 이벤트의 테이블과 연결된 스키마입니다. |
Oracle | table |
문자열 | 문자열 | 이벤트와 연결된 테이블입니다. |
Oracle | change_type |
문자열 | 문자열 | 이벤트가 나타내는 변경 유형( |
Oracle | tx_id |
문자열 | 문자열 | 이벤트가 속한 트랜잭션 ID입니다. |
Oracle | rs_id |
문자열 | 문자열 | 레코드 세트 ID입니다. rs_id 와 ssn 의 결합으로 V$LOGMNR_CONTENTS 의 행을 고유하게 식별합니다. rs_id 는 행을 생성한 재실행 레코드를 고유하게 식별합니다. |
Oracle | ssn |
long | long | SQL 시퀀스 번호입니다. 이 번호는 rs_id 와 함께 사용되며 V$LOGMNR_CONTENTS 의 행을 고유하게 식별합니다. |
PostgreSQL | schema |
문자열 | 문자열 | 이벤트의 테이블과 연결된 스키마입니다. |
PostgreSQL | table |
문자열 | 문자열 | 이벤트와 연결된 테이블입니다. |
PostgreSQL | is_deleted |
부울 | 부울 |
|
PostgreSQL | change_type |
문자열 | 문자열 | 이벤트가 나타내는 변경 유형(INSERT , UPDATE , DELETE )입니다.
|
PostgreSQL | tx_id |
문자열 | 문자열 | 이벤트가 속한 트랜잭션 ID입니다. |
PostgreSQL | lsn |
문자열 | 문자열 | 현재 항목의 로그 시퀀스 번호입니다. |
PostgreSQL | primary_keys |
문자열 배열 | 문자열 배열 | 테이블 기본 키를 구성하는 하나 이상의 열 이름 목록입니다. 테이블에 기본 키가 없으면 이 필드는 비어 있습니다. |
SQL Server | table |
문자열 | 문자열 | 이벤트와 연결된 테이블입니다. |
SQL Server | database |
long | long | 이벤트와 연결된 데이터베이스입니다. |
SQL Server | schema |
문자열 배열 | 문자열 배열 | 이벤트의 테이블과 연결된 스키마입니다. |
SQL Server | is_deleted |
부울 | 부울 |
|
SQL Server | lsn |
문자열 | 문자열 | 이벤트의 로그 시퀀스 번호입니다. |
SQL Server | tx_id |
문자열 | 문자열 | 이벤트가 속한 트랜잭션 ID입니다. |
SQL Server | physical_location |
정수 배열 | 정수 배열 | 세 가지 정수(레코드의 파일 ID, 페이지 ID, 슬롯 ID)로 설명되는 로그 레코드의 물리적 위치입니다. |
SQL Server | replication_index |
문자열 배열 | 문자열 배열 | 테이블의 행을 고유하게 식별할 수 있는 색인의 열 이름 목록입니다. |
SQL Server | change_type |
문자열 | 문자열 | 이벤트가 나타내는 변경 유형(`INSERT`, UPDATE, `DELETE`)입니다. |
이벤트 흐름의 예시
이 흐름은 소스 데이터베이스의 SAMPLE
테이블에 포함된 단일 행에 INSERT
, UPDATE
, DELETE
의 세 가지 연속 작업으로 생성된 이벤트를 보여줍니다.
시간 | THIS_IS_MY_PK(정수) | FIELD1(nchar null 허용) | FIELD2(nchar null 아님)> |
---|---|---|---|
0 | 1231535353 | foo | TLV |
1 | 1231535353 | NULL | TLV |
INSERT(T0)
메시지 페이로드는 새 행 전체로 구성됩니다.
{
"stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
"read_method": "oracle-cdc-logminer",
"object": "SAMPLE.TBL",
"uuid": "d7989206-380f-0e81-8056-240501101100",
"read_timestamp": "2019-11-07T07:37:16.808Z",
"source_timestamp": "2019-11-07T02:15:39",
"source_metadata": {
"log_file": ""
"scn": 15869116216871,
"row_id": "AAAPwRAALAAMzMBABD",
"is_deleted": false,
"database": "DB1",
"schema": "ROOT",
"table": "SAMPLE"
"change_type": "INSERT",
"tx_id":
"rs_id": "0x0073c9.000a4e4c.01d0",
"ssn": 67,
},
"payload": {
"THIS_IS_MY_PK": "1231535353",
"FIELD1": "foo",
"FIELD2": "TLV",
}
}
업데이트(T1)
메시지 페이로드는 새 행 전체로 구성됩니다. 이전 값은 포함되지 않습니다.
{
"stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
"read_method": "oracle-cdc-logminer",
"object": "SAMPLE.TBL",
"uuid": "e6067366-1efc-0a10-a084-0d8701101101",
"read_timestamp": "2019-11-07T07:37:18.808Z",
"source_timestamp": "2019-11-07T02:17:39",
"source_metadata": {
"log_file":
"scn": 15869150473224,
"row_id": "AAAGYPAATAAPIC5AAB",
"is_deleted": false,
"database":
"schema": "ROOT",
"table": "SAMPLE"
"change_type": "UPDATE",
"tx_id":
"rs_id": "0x006cf4.00056b26.0010",
"ssn": 0,
},
"payload": {
"THIS_IS_MY_PK": "1231535353",
"FIELD1": null,
"FIELD2": "TLV",
}
}
삭제(T2)
메시지 페이로드는 새 행 전체로 구성됩니다.
{
"stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
"read_method": "oracle-cdc-logminer",
"object": "SAMPLE.TBL",
"uuid": "c504f4bc-0ffc-4a1a-84df-6aba382fa651",
"read_timestamp": "2019-11-07T07:37:20.808Z",
"source_timestamp": "2019-11-07T02:19:39",
"source_metadata": {
"log_file":
"scn": 158691504732555,
"row_id": "AAAGYPAATAAPIC5AAC",
"is_deleted": true,
"database":
"schema": "ROOT",
"table": "SAMPLE"
"change_type": "DELETE",
"tx_id":
"rs_id": "0x006cf4.00056b26.0011",
"ssn": 0,
},
"payload": {
"THIS_IS_MY_PK": "1231535353",
"FIELD1": null,
"FIELD2": "TLV",
}
}
순서 지정 및 일관성
이 섹션에서는 Datastream에서 순서 지정 및 일관성이 처리되는 방법을 설명합니다.
주문
Datastream은 순서를 보장하지 않지만 각 이벤트에 전체 데이터 행과 데이터가 소스에 기록된 타임스탬프가 포함됩니다. BigQuery에서는 잘못된 순서의 이벤트가 올바른 순서로 자동 병합됩니다. BigQuery는 이벤트 메타데이터 및 내부 변경 시퀀스 넘버(CSN)를 사용하여 이벤트를 올바른 순서로 테이블에 적용합니다. Cloud Storage의 경우 동시에 발생하는 이벤트는 파일 두 개 이상에 걸쳐 있을 수 있습니다.
잘못된 순서로 생성되는 이벤트는 스트림이 시작될 때 만드는 데이터의 초기 백필을 위해 이벤트가 백필되는 경우 발생하도록 설계된 것입니다.
소스별로 순서가 추론될 수 있습니다.
소스 | 설명 |
---|---|
MySQL | 초기 백필의 일부인 이벤트는 진행 중인 복제의 일부인 이벤트는
|
Oracle | 초기 백필의 일부인 이벤트는 진행 중인 복제의 일부인 이벤트는
|
PostgreSQL | 초기 백필의 일부인 이벤트는 진행 중인 복제의 일부인 이벤트는
|
SQL Server |
초기 백필의 일부인 이벤트는 진행 중인 복제의 일부인 이벤트는
|
일관성
Datastream은 소스 데이터베이스의 데이터가 적어도 한 번은 대상에 전달되도록 보장합니다. 이벤트가 누락되지는 않지만 스트림에서 이벤트가 중복될 수 있습니다. 중복 이벤트의 기간은 분 단위여야 하며 이벤트 메타데이터에 있는 이벤트의 범용 고유 식별자 (UUID)를 사용하여 중복을 감지할 수 있습니다.
데이터베이스 로그 파일에 커밋되지 않은 트랜잭션이 포함된 경우 트랜잭션이 롤백되면 데이터베이스에서 이를 로그 파일에 '역전' DML 작업으로 반영합니다. 예를 들어 롤백된 INSERT
작업에는 이에 해당하는 DELETE
작업이 있습니다. DataStream이 로그 파일에서 이러한 작업을 읽습니다.
스트림 정보
모든 스트림에는 스트림과 데이터를 가져오는 소스를 모두 설명하는 메타데이터가 있습니다. 이 메타데이터에는 스트림 이름, 소스 및 대상 연결 프로필 등과 같은 정보가 포함됩니다.
Stream 객체의 전체 정의를 보려면 API 참조 문서를 확인하세요.
스트림 상태
스트림은 다음 상태 중 하나일 수 있습니다.
Not started
Starting
Running
Draining
Paused
Failed
Failed permanently
로그를 사용하여 테이블 백필, 처리된 행 수 등과 같은 추가 상태 정보를 찾을 수 있습니다. FetchStreamErrors
API를 사용하여 오류를 검색할 수도 있습니다.
탐색 API를 통해 사용 가능한 객체 메타데이터
탐색 API는 연결 프로필로 표시되는 데이터 소스 또는 대상에 정의된 객체의 구조를 나타내는 객체를 반환합니다. 각 객체에는 객체 자체와 객체가 가져오는 모든 데이터 필드에 대한 메타데이터가 있습니다. 이 메타데이터는 탐색 API를 통해 제공됩니다.