이벤트 및 스트림

개요

Datastream의 데이터 계층 구조는 다음과 같습니다.

  • 데이터 소스와 대상으로 구성된 스트림
  • 특정 데이터베이스의 테이블과 같이 스트림의 일부인 객체
  • 데이터베이스 삽입과 같이 특정 객체에 의해 생성된 단일 변경사항인 이벤트

스트림, 객체, 이벤트에는 이와 관련된 데이터 및 메타데이터가 포함됩니다. 이 데이터와 메타데이터는 서로 다른 용도로 사용될 수 있습니다.

이벤트 정보

각 이벤트는 세 가지 유형의 데이터로 구성됩니다.

  • 이벤트 데이터: 스트림 소스에서 발생한 객체의 데이터 자체 변경사항을 나타냅니다. 모든 이벤트에는 변경된 행 전체가 포함됩니다.
  • 일반 메타데이터: 이 메타데이터는 Datastream에서 생성한 모든 이벤트에 표시되며 대상의 중복 데이터 삭제와 같은 작업에 사용됩니다.
  • 소스별 메타데이터: 이 메타데이터는 특정 스트림 소스에서 생성된 모든 이벤트에 표시됩니다. 이 메타데이터는 소스에 따라 다릅니다.

이벤트 데이터

이벤트 데이터는 스트림 소스에서 발생한 특정 객체의 모든 변경사항의 페이로드입니다.

이벤트는 Avro 또는 JSON 형식입니다. Avro 형식의 경우 이벤트에 각 열의 열 색인 및 값이 포함됩니다. 열 색인을 사용하여 열 이름과 통합 유형을 Avro 헤더의 스키마에서 가져올 수 있습니다.

JSON 형식으로 작업할 때는 이벤트에 각 열의 열 이름과 값이 포함됩니다.

이벤트 메타데이터는 이벤트의 출처에 대한 정보를 수집하고 대상에서 중복 데이터를 삭제하며 다운스트림 소비자가 이벤트를 정렬하는 데 사용될 수 있습니다.

다음 표에서는 일반 및 소스별 이벤트 메타데이터의 필드 및 데이터 유형을 나열하고 설명합니다.

일반 메타데이터

이 메타데이터는 모든 유형의 스트림에서 일관됩니다.

필드 Avro 유형 JSON 유형 설명
stream_name 문자열 문자열 생성 시 정의된 고유한 스트림 이름입니다.
read_method 문자열 문자열

변경 데이터 캡처(CDC) 메서드를 사용하여 소스에서 데이터를 읽었는지 또는 CDC 복제 중에 트랜잭션이 롤백될 때 생성되는 보완 작업의 일부로 데이터를 읽었는지 여부를 나타냅니다.

가능한 값은 다음과 같습니다.

  • oracle-cdc-logminer
  • oracle-backfill
  • oracle-supplementation
  • mysql-cdc-binlog
  • mysql-backfill-incremental
  • mysql-backfill-fulldump
  • postgres-cdc-wal
  • postgresql-backfill
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 부울 부울
  • true 값은 소스에서 행이 삭제되었음을 나타냅니다.
  • false 값은 행이 삭제되지 않았음을 나타냅니다.
MySQL database 문자열 문자열 이벤트와 연결된 데이터베이스입니다.
MySQL table 문자열 문자열 이벤트와 연결된 테이블입니다.
MySQL change_type 문자열 문자열

이벤트가 나타내는 변경 유형(INSERT, UPDATE-INSERT, UPDATE-DELETE, DELETE)

Oracle log_file 문자열 문자열 Datastream이 CDC 복제에서 이벤트를 가져오는 로그 파일입니다.
Oracle scn long long Oracle 트랜잭션 로그의 로그 위치(오프셋)입니다.
Oracle row_id 문자열 문자열 Oracle의 row_id입니다.
Oracle is_deleted 부울 부울
  • true 값은 소스에서 행이 삭제되었음을 나타냅니다.
  • false 값은 행이 삭제되지 않았음을 나타냅니다.
Oracle database 문자열 문자열 이벤트와 연결된 데이터베이스입니다.
Oracle schema 문자열 문자열 이벤트의 테이블과 연결된 스키마입니다.
Oracle table 문자열 문자열 이벤트와 연결된 테이블입니다.
Oracle change_type 문자열 문자열

이벤트가 나타내는 변경 유형(INSERT, UPDATE-INSERT, UPDATE-DELETE, DELETE)

Oracle tx_id 문자열 문자열 이벤트가 속한 트랜잭션 ID입니다.
Oracle rs_id 문자열 문자열 레코드 세트 ID입니다. rs_idssn의 결합으로 V$LOGMNR_CONTENTS의 행을 고유하게 식별합니다. rs_id는 행을 생성한 재실행 레코드를 고유하게 식별합니다.
Oracle ssn long long SQL 시퀀스 번호입니다. 이 번호는 rs_id와 함께 사용되며 V$LOGMNR_CONTENTS의 행을 고유하게 식별합니다.
PostgreSQL schema 문자열 문자열 이벤트의 테이블과 연결된 스키마입니다.
PostgreSQL table 문자열 문자열 이벤트와 연결된 테이블입니다.
PostgreSQL is_deleted 부울 부울
  • true 값은 소스에서 행이 삭제되었음을 나타냅니다.
  • false 값은 행이 삭제되지 않았음을 나타냅니다.
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 부울 부울
  • true 값은 행이 소스에서 삭제되었음을 나타냅니다.
  • false 값은 행이 삭제되지 않았음을 나타냅니다.
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

초기 백필의 일부인 이벤트는 mysql-backfill로 시작하는 read_method 필드를 갖습니다. 순서에 관계없이 소비될 수 있으므로 백필 내에서 이벤트가 수신되는 순서에는 의미가 없습니다.

진행 중인 복제의 일부인 이벤트는 read_method 필드를 mysql-cdc-binlog로 설정합니다.

log_file 필드와 로그 파일에서 오프셋인 log_position 필드를 조합해 순서를 추론할 수 있습니다. 이 조합은 데이터베이스의 작업 순서를 식별하는 고유한 증분 번호를 제공합니다.

Oracle

초기 백필의 일부인 이벤트는 oracle-backfill로 시작하는 read_method 필드를 갖습니다. 순서에 관계없이 소비될 수 있으므로 백필 내에서 이벤트가 수신되는 순서에는 의미가 없습니다.

진행 중인 복제의 일부인 이벤트는 read_method 필드를 oracle-cdc-logminer로 설정합니다.

rs_id(레코드 모음 ID) 필드와 ssn(SQL 시퀀스 번호) 필드의 조합을 통해 순서를 추론할 수 있습니다. 이 조합은 데이터베이스의 작업 순서를 식별하는 고유한 증분 번호를 제공합니다.

PostgreSQL

초기 백필의 일부인 이벤트는 postgresql-backfill로 시작하는 read_method 필드를 갖습니다. 순서에 관계없이 소비될 수 있으므로 백필 내에서 이벤트가 수신되는 순서에는 의미가 없습니다.

진행 중인 복제의 일부인 이벤트는 read_method 필드를 postgres-cdc-wal로 설정합니다.

source_timestamp 필드와 lsn(로그 시퀀스 번호) 필드의 조합을 통해 순서를 추론할 수 있습니다. 이 조합은 데이터베이스의 작업 순서를 식별하는 고유한 증분 번호를 제공합니다.

SQL Server

초기 백필의 일부인 이벤트는 sqlserver-backfill로 시작하는 read_method 필드를 갖습니다. 순서에 관계없이 소비될 수 있으므로 백필 내에서 이벤트가 수신되는 순서에는 의미가 없습니다.

진행 중인 복제의 일부인 이벤트는 read_method 필드를 sqlserver-cdc로 설정합니다.

source_timestamp 필드와 lsn(로그 시퀀스 번호) 필드의 조합을 통해 순서를 추론할 수 있습니다. 이 조합은 데이터베이스의 작업 순서를 식별하는 고유한 증분 번호를 제공합니다.

일관성

Datastream은 소스 데이터베이스의 데이터가 한 번 이상 대상으로 전송되도록 보장합니다. 누락된 이벤트는 없지만 스트림에 중복 이벤트가 발생할 수 있습니다. 중복 이벤트의 기간은 분 단위여야 하며 이벤트 메타데이터에 있는 이벤트의 범용 고유 식별자 (UUID)를 사용하여 중복을 감지할 수 있습니다.

데이터베이스 로그 파일에 커밋되지 않은 트랜잭션이 포함된 경우 트랜잭션이 롤백되면 데이터베이스에서 이를 로그 파일에 '역전' DML 작업으로 반영합니다. 예를 들어 롤백된 INSERT 작업에는 이에 해당하는 DELETE 작업이 있습니다. DataStream이 로그 파일에서 이러한 작업을 읽습니다.

스트림 정보

모든 스트림에는 스트림과 데이터를 가져오는 소스를 모두 설명하는 메타데이터가 있습니다. 이 메타데이터에는 스트림 이름, 소스 및 대상 연결 프로필 등과 같은 정보가 포함됩니다.

스트림 객체의 전체 정의를 보려면 API 참조 문서를 확인하세요.

스트림 상태

스트림은 다음 상태 중 하나일 수 있습니다.

  • Not started
  • Starting
  • Running
  • Draining
  • Paused
  • Failed
  • Failed permanently

로그를 사용하여 테이블 백필, 처리된 행 수 등의 추가 상태 정보를 찾을 수 있습니다. FetchStreamErrors API를 사용하여 오류를 검색할 수도 있습니다.

탐색 API를 통해 사용 가능한 객체 메타데이터

탐색 API는 연결 프로필로 표시되는 데이터 소스 또는 대상에 정의된 객체의 구조를 나타내는 객체를 반환합니다. 각 객체에는 객체 자체와 객체가 가져오는 모든 데이터 필드에 대한 메타데이터가 있습니다. 이 메타데이터는 탐색 API를 통해 제공됩니다.