Eventos e streams

A hierarquia de dados no Datastream é:

  • Uma stream, que é composta por uma origem de dados e um destino.
  • Um objeto, que é uma parte de uma stream, como uma tabela de uma base de dados específica.
  • Um evento, que é uma única alteração gerada por um objeto específico, como uma inserção na base de dados.

As streams, os objetos e os eventos têm dados e metadados associados. Estes dados e metadados podem ser usados para diferentes fins.

Acerca dos eventos

Cada evento consiste em três tipos de dados:

  • Dados de eventos: representam a alteração aos dados propriamente ditos do objeto proveniente da origem da stream. Cada evento contém a totalidade da linha que foi alterada.
  • Metadados genéricos: estes metadados aparecem em todos os eventos gerados pelo fluxo de dados, que são usados para ações, como remover dados duplicados no destino.
  • Metadados específicos da origem: estes metadados aparecem em todos os eventos gerados por uma origem de stream específica. Estes metadados variam consoante a origem.

Dados do evento

Os dados de eventos são o payload de cada alteração de um determinado objeto proveniente de uma origem de stream.

Os eventos estão no formato Avro ou JSON.

Quando trabalha com o formato Avro, para cada coluna, o evento contém o índice e o valor da coluna. Usando o índice da coluna, o nome da coluna e o tipo unificado podem ser obtidos a partir do esquema no cabeçalho Avro.

Quando trabalha com o formato JSON, para cada coluna, o evento contém o nome e o valor da coluna.

Os metadados de eventos podem ser usados para recolher informações sobre a origem do evento, bem como para remover dados duplicados no destino e ordenar eventos pelo consumidor a jusante.

As tabelas seguintes listam e descrevem os campos e os tipos de dados para metadados de eventos genéricos e específicos da origem.

Metadados genéricos

Estes metadados são consistentes em streams de todos os tipos.

Campo Tipo Avro Tipo JSON Descrição
stream_name de string de string O nome exclusivo da stream, conforme definido no momento da criação.
read_method de string de string

Indica se os dados foram lidos da origem através de um método de captura de dados de alterações (CDC), como parte do preenchimento histórico, ou como parte de uma tarefa de suplementação criada quando uma transação é revertida durante a replicação de CDC.

Os valores possíveis incluem:

  • oracle-cdc-logminer
  • oracle-backfill
  • oracle-supplementation
  • mysql-cdc-binlog
  • mysql-backfill-incremental
  • mysql-backfill-fulldump
  • postgres-cdc-wal
  • postgresql-backfill
  • salesforce-cdc
  • salesforce-backfill
object de string de string O nome usado para agrupar diferentes tipos de eventos, normalmente o nome da tabela ou do objeto na origem.
schema_key de string de string O identificador exclusivo do esquema unificado do evento.
uuid de string de string Um identificador exclusivo do evento gerado pela stream de dados.
read_timestamp timestamp-millis de string A data/hora (UTC) em que o registo foi lido pelo Datastream (a data/hora da época em milissegundos).
source_timestamp timestamp-millis de string A data/hora (UTC) em que o registo foi alterado na origem (a data/hora de época em milissegundos).
sort_keys {"type": "array", "items": ["string", "long"]} matriz Uma matriz de valores que podem ser usados para ordenar eventos pela ordem em que ocorreram.

Metadados específicos da origem

Estes metadados estão associados a eventos de CDC e preenchimento a partir de uma base de dados de origem. Para ver estes metadados, selecione uma origem no menu pendente que se segue.

Origem Campo Tipo Avro Tipo JSON Descrição
MySQL log_file de string de string O ficheiro de registo a partir do qual o fluxo de dados extrai eventos na replicação de CDC.
MySQL log_position longo longo A posição do registo (desvio) no registo binário do MySQL.
MySQL primary_keys matriz de strings matriz de strings A lista de (um ou mais) nomes de colunas que compõem a chave principal das tabelas. Se a tabela não tiver uma chave primária, este campo está vazio.
MySQL is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
MySQL database de string de string A base de dados associada ao evento.
MySQL table de string de string A tabela associada ao evento.
MySQL change_type de string de string

O tipo de alteração (INSERT, UPDATE-INSERT, UPDATE-DELETE e DELETE) que o evento representa.

Oracle log_file de string de string O ficheiro de registo a partir do qual o fluxo de dados extrai eventos na replicação de CDC.
Oracle scn longo longo A posição do registo (desvio) no registo de transações da Oracle.
Oracle row_id de string de string O row_id da Oracle.
Oracle is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
Oracle database de string de string A base de dados associada ao evento.
Oracle schema de string de string O esquema associado à tabela do evento.
Oracle table de string de string A tabela associada ao evento.
Oracle change_type de string de string

O tipo de alteração (INSERT, UPDATE-INSERT, UPDATE-DELETE e DELETE) que o evento representa.

Oracle tx_id de string de string O ID da transação à qual o evento pertence.
Oracle rs_id de string de string O ID do conjunto de registos. A combinação de rs_id e ssn identifica de forma exclusiva uma linha em V$LOGMNR_CONTENTS. rs_id identifica de forma exclusiva o registo de refazer que gerou a linha.
Oracle ssn longo longo Um número de sequência SQL. Este número é usado com rs_id e identifica de forma exclusiva uma linha em V$LOGMNR_CONTENTS.
PostgreSQL schema de string de string O esquema associado à tabela do evento.
PostgreSQL table de string de string A tabela associada ao evento.
PostgreSQL is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
PostgreSQL change_type de string de string O tipo de alteração (INSERT, UPDATE, DELETE) que o evento representa.
PostgreSQL tx_id de string de string O ID da transação à qual o evento pertence.
PostgreSQL lsn de string de string O número de sequência do registo da entrada atual.
PostgreSQL primary_keys matriz de strings matriz de strings A lista de (um ou mais) nomes de colunas que compõem a chave principal das tabelas. Se a tabela não tiver uma chave primária, este campo está vazio.
SQL Server table de string de string A tabela associada ao evento.
SQL Server database longo longo A base de dados associada ao evento.
SQL Server schema matriz de strings matriz de strings O esquema associado à tabela do evento.
SQL Server is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
SQL Server lsn de string de string O número de sequência do registo do evento.
SQL Server tx_id de string de string O ID da transação à qual o evento pertence.
SQL Server physical_location matriz de números inteiros matriz de números inteiros A localização física do registo do registo descrito por três números inteiros: ID do ficheiro, ID da página e ID do espaço do registo.
SQL Server replication_index matriz de strings matriz de strings A lista de nomes de colunas de um índice que pode identificar exclusivamente uma linha na tabela.
SQL Server change_type de string de string

O tipo de alteração (INSERT, UPDATE, DELETE) que o evento representa.

Salesforce object_name de string de string

O nome do objeto do Salesforce associado ao evento.

Salesforce domain de string de string

O nome do domínio associado ao evento.

Salesforce is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
Salesforce change_type de string de string

O tipo de alteração (INSERT, UPDATE, DELETE) que o evento representa.

Salesforce primary_keys matriz de strings matriz de strings A lista de nomes de colunas que compõem a chave principal das tabelas. Se a tabela não tiver uma chave primária, este campo está vazio.
MongoDB database de string de string A base de dados associada ao evento.
MongoDB collection de string de string A coleção associada ao evento. As coleções são análogas às tabelas em bases de dados relacionais.
MongoDB change_type de string de string O tipo de alteração (CREATE, UPDATE e DELETE) que o evento representa.
MongoDB is_deleted booleano booleano
  • Um valor true indica que a linha foi eliminada na origem.
  • Um valor false significa que a linha não foi eliminada.
MongoDB primary_keys matriz de strings matriz de strings O campo _id que funciona como a chave principal de cada documento numa coleção.

Exemplo de um fluxo de eventos

Este fluxo ilustra os eventos gerados por três operações consecutivas: INSERT, UPDATE e DELETE, numa única linha de uma tabela SAMPLE para uma base de dados de origem.

HORA THIS_IS_MY_PK (int) FIELD1 (nchar nullable) FIELD2 (nchar non-null)>
0 1231535353 foo TLV
1 1231535353 NULL TLV

INSERT (T0)

O payload da mensagem consiste na totalidade da nova linha.

{
  "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",
  }
}

ATUALIZAR (T1)

O payload da mensagem consiste na totalidade da nova linha. Não inclui valores anteriores.

{
  "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",
  }
}

ELIMINAR (T2)

O payload da mensagem consiste na totalidade da nova linha.

{
  "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",
  }
}

Ordenação e consistência

Esta secção aborda a forma como o Datastream processa a ordenação e a consistência.

Encomenda

O fluxo de dados não garante a ordenação, mas cada evento contém a linha completa de dados e a data/hora em que os dados foram escritos na origem. No BigQuery, os eventos fora de ordem são unidos automaticamente na sequência correta. O BigQuery usa os metadados dos eventos e um número de sequência de alterações (CSN) interno para aplicar os eventos à tabela pela ordem correta. No Cloud Storage, os eventos da mesma hora podem abranger mais do que um ficheiro.

Os eventos gerados fora de ordem ocorrem intencionalmente quando os eventos são preenchidos para o preenchimento inicial de dados criado quando a stream é iniciada.

A ordenação pode ser inferida com base na origem.

Origem Descrição
MySQL

Os eventos que fazem parte do preenchimento inicial têm o campo read_method a começar por mysql-backfill. Não existe nenhuma implicação na ordem em que os eventos são recebidos no preenchimento, uma vez que podem ser consumidos em qualquer ordem.

Os eventos que fazem parte da replicação em curso têm o campo read_method definido como mysql-cdc-binlog.

A ordem pode ser inferida pela combinação do campo log_file e do campo log_position que está deslocado do ficheiro de registo. Esta combinação fornece um número único que aumenta gradualmente e identifica a ordem de operação na base de dados.

Oracle

Os eventos que fazem parte do preenchimento inicial têm o campo read_method a começar por oracle-backfill. Não existe nenhuma implicação na ordem em que os eventos são recebidos no preenchimento, uma vez que podem ser consumidos em qualquer ordem.

Os eventos que fazem parte da replicação em curso têm o campo read_method definido como oracle-cdc-logminer.

A ordem pode ser inferida pela combinação do campo rs_id (o ID do conjunto de registos) e do campo ssn (um número de sequência SQL). Esta combinação fornece um número único que aumenta gradualmente e identifica a ordem de operação na base de dados.

PostgreSQL

Os eventos que fazem parte do preenchimento inicial têm o campo read_method a começar por postgresql-backfill. Não existe nenhuma implicação na ordem em que os eventos são recebidos no preenchimento, uma vez que podem ser consumidos em qualquer ordem.

Os eventos que fazem parte da replicação em curso têm o campo read_method definido como postgres-cdc-wal.

A ordem pode ser inferida pela combinação do campo source_timestamp e do campo lsn (número de sequência do registo). Esta combinação fornece um número único que aumenta gradualmente e identifica a ordem de operação na base de dados.

SQL Server

Os eventos que fazem parte do preenchimento inicial têm o campo read_method a começar por sqlserver-backfill. Não existe nenhuma implicação na ordem em que os eventos são recebidos no preenchimento, uma vez que podem ser consumidos em qualquer ordem.

Os eventos que fazem parte da replicação em curso têm o campo read_method definido como sqlserver-cdc.

A ordem pode ser inferida pela combinação do campo source_timestamp e do campo lsn (número de sequência do registo). Esta combinação fornece um número único que aumenta gradualmente e identifica a ordem de operação na base de dados.

Salesforce

A ordem pode ser determinada através da utilização do source_timestamp do registo como chave de ordenação. A data/hora no Salesforce tem uma resolução de um segundo, mas não podem ocorrer dois eventos de alteração para o mesmo registo no mesmo segundo.

MongoDB (pré-visualização)

A ordem pode ser determinada através do campo ts no registo de operações ou do campo clusterTime na stream de alterações do registo. Os campos são exclusivos para cada registo.

Consistência

O Datastream garante que os dados da base de dados de origem são entregues no destino, pelo menos, uma vez. Nenhum evento é perdido, mas existe a possibilidade de eventos duplicados na stream. A janela para eventos duplicados deve ser da ordem dos minutos, e o identificador exclusivo universal (UUID) do evento nos metadados do evento pode ser usado para detetar duplicados.

Quando os ficheiros de registo da base de dados contêm transações não comprometidas, se alguma transação for revertida, a base de dados reflete isto nos ficheiros de registo como operações de linguagem de manipulação de dados (DML) "inversas". Por exemplo, uma operação INSERT revertida tem uma operação DELETE correspondente. O fluxo de dados lê estas operações dos ficheiros de registo.

Acerca das streams

Cada stream tem metadados que descrevem a stream e a origem a partir da qual extrai dados. Estes metadados incluem informações como o nome da stream, os perfis de associação de origem e de destino.

Para ver a definição completa do objeto Stream, consulte a documentação de referência da API.

Estado e estado da stream

Uma stream pode estar num dos seguintes estados:

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

Pode usar os registos para encontrar informações de estado adicionais, como o preenchimento retroativo das tabelas ou o número de linhas processadas. Também pode usar a API FetchStreamErrors para obter erros.

Metadados de objetos disponíveis através da API Discover

A API Discover devolve objetos que representam a estrutura dos objetos definidos na origem de dados ou no destino representado pelo perfil de ligação. Cada objeto tem metadados sobre o próprio objeto, bem como para cada campo de dados que extrai. Estes metadados estão disponíveis através da API discover.

O que se segue?