O Hologres oferece o recurso de binlog para capturar eventos de banco de dados. Utilize esses eventos para replicação e sincronização de dados ou como fluxo de mensagens para consumidores downstream. O consumo de binlogs do Hologres aumenta a reutilização de dados e reduz a latência no processamento de ponta a ponta. Este tópico descreve como assinar binlogs do Hologres e executar operações relacionadas.
Binlog
Assim como bancos de dados tradicionais, como o MySQL, o Hologres suporta binlogs para registrar todos os eventos de alteração de dados. Os binlogs do Hologres permitem implementar replicação e sincronização de dados. No entanto, eles são usados tipicamente apenas para sincronização, enquanto os binlogs de bancos de dados tradicionais também atendem a cenários de alta disponibilidade, como sincronização entre instâncias primárias e réplicas e recuperação de dados. Por isso, suas implementações diferem em vários aspectos fundamentais:
Os binlogs do Hologres não registram operações DDL.
Os binlogs do Hologres são flexíveis e específicos por tabela. Ative-os ou desative-os individualmente por tabela e defina um Time to Live (TTL) diferente para cada uma.
Como data warehouse distribuído em tempo real, o Hologres possui um binlog distribuído.
A consulta aos binlogs do Hologres é simples e direta.
Em cenários de big data, o Flink pode consumir diretamente os binlogs do Hologres. Em comparação com o modelo tradicional de camadas de data warehouse, a combinação do Flink com os binlogs do Hologres viabiliza uma arquitetura totalmente orientada a eventos. Isso permite o processamento em tempo real desde a camada de armazenamento de dados operacionais (ODS) até a camada de dimensão do data warehouse (DWD), e da camada DWD para a camada de serviços de dados (DWS). Essa abordagem suporta governança de dados por meio de camadas, unifica o armazenamento, melhora a reutilização de dados e reduz a latência de processamento de ponta a ponta, oferecendo uma solução completa de data warehouse em tempo real.
Limitações
Observe as seguintes limitações ao assinar binlogs do Hologres:
Somente o Hologres V0.9 ou superior suporta assinatura de binlog. Caso sua instância esteja em uma versão anterior, participe do grupo de suporte online no DingTalk. Para mais detalhes, consulte Como obter mais suporte online?.
Nas versões V0.9 e V0.10 do Hologres, não é possível ativar binlogs para tabelas existentes alterando suas propriedades; recrie a tabela. A partir da V1.1, ative binlogs sob demanda.
Antes das versões V1.3.14 e V1.1.82 do Hologres, apenas um Superuser podia consumir o binlog. O uso de uma conta com menos privilégios resultava no erro
permission denied for table hg_replication_slot_properties. A partir das versões V1.3.14 e V1.1.82, a conta precisa apenas da permissão SELECT na tabela para consumir o binlog com o Flink. Para consumir o binlog via JDBC, a conta deve pertencer à Replication Role.-
O Hologres suporta binlogs no nível de tabela tanto para tabelas orientadas a linhas quanto para tabelas orientadas a colunas. A tabela a seguir lista os métodos de consumo suportados.
Categoria do Flink
Tabela orientada a linhas
Tabela orientada a colunas
Tabela híbrida linha-coluna (Suportado a partir da V1.1)
Blink
Suportado
Suportado
Suportado
Realtime Compute for Apache Flink
Suportado
Suportado
Suportado
Apache Flink
Não suportado
Não suportado
Não suportado
JDBC
Suportado na V1.1 e posteriores
Suportado na V1.1 e posteriores
Suportado na V1.1 e posteriores
O Blink não suporta o tipo de dado
TIMESTAMPao consumir binlogs do Hologres. Utilize o tipoTIMESTAMPTZao criar tabelas no Hologres. Outros tipos especiais, comoSMALLINT, também não são suportados.Não é possível consumir binlogs da tabela pai de uma tabela particionada. Utilize uma tabela filha ou uma tabela regular (não particionada). A partir do Hologres V1.3.24, modifique o TTL do binlog de uma tabela filha sob demanda. Se nenhum TTL de binlog for especificado explicitamente para a tabela filha, ela herdará o TTL da tabela pai. Note que o TTL do binlog não é um temporizador preciso; o sistema não garante a exclusão imediata do binlog após a expiração e realiza a limpeza em algum momento posterior.
Para cargas de trabalho com muitas escritas, ativar binlogs em uma tabela orientada a colunas gera, teoricamente, mais sobrecarga do que em uma tabela orientada a linhas. Portanto, prefira tabelas orientadas a linhas ao ativar binlogs. Se a tabela também for utilizada para consultas OLAP, opte pelo formato de armazenamento híbrido linha-coluna. Para mais informações, consulte Formatos de armazenamento de tabela.
Apenas tabelas internas do Hologres suportam binlogs. Tabelas externas não possuem esse suporte.
Formato e princípios do binlog
Um registro de binlog contém campos de sistema e colunas da tabela do usuário. A tabela a seguir descreve esses campos.
|
Nome do campo |
Tipo |
Descrição |
|
hg_binlog_lsn |
BIGINT |
Campo de sistema do binlog que representa o número de sequência do log (LSN). O valor é monotonicamente crescente, mas não há garantia de continuidade dentro de um mesmo shard. Também não há garantia de unicidade ou ordenação entre shards diferentes. Nota
Para mais informações sobre como os dados do binlog são distribuídos entre os shards, consulte Chave de distribuição. |
|
hg_binlog_event_type |
BIGINT |
Campo de sistema do binlog que indica o tipo de evento de alteração.
|
|
hg_binlog_timestamp_us |
BIGINT |
Campo de sistema do binlog que representa o timestamp do sistema em microssegundos (us). |
|
user_table_column_1 |
Definido pelo usuário |
Uma coluna da tabela do usuário. |
|
... |
... |
... |
|
user_table_column_n |
Definido pelo usuário |
Uma coluna da tabela do usuário. |
Uma operação
UPDATEgera dois registros de binlog: um para o estado da linha antes da atualização e outro para o estado após a atualização. O recurso de assinatura de binlog garante que esses dois registros sejam consecutivos, com o registro de pré-atualização aparecendo primeiro.Ao executar um
UPDATEcom um Conector do Hologres, como Holo Client, Flink Connector ou Data Integration, o conector traduz o eventoBEFORE_UPDATEpara um eventoDELETEe o eventoAFTER_UPDATEpara um eventoINSERT. Consequentemente, os valores2e5aparecerão no campohg_binlog_event_type. No entanto, o conector assegura a consistência eventual dos dados.O campo
hg_binlog_event_typeregistra os eventosBEFORE_UPDATEeAFTER_UPDATEsomente quando uma instruçãoUPDATEé executada usando SQL puro.
O binlog do Hologres pode ser entendido como uma tabela especial orientada a linhas. Ativar binlogs para uma tabela equivale a criar uma nova tabela orientada a linhas onde hg_binlog_lsn é a chave, e as colunas da tabela original, hg_binlog_event_type e hg_binlog_timestamp_us formam conjuntamente o valor. A tabela de binlog possui um esquema fixo ou fortemente tipado. A ordem das colunas do usuário segue a mesma ordem definida no DDL da tabela. Por esse motivo, utilize tabelas orientadas a linhas ou tabelas híbridas linha-coluna para tabelas com binlog ativado, garantindo assim melhor desempenho na leitura do binlog.
Ativação de binlogs
Por padrão, o recurso de binlog vem desativado no Hologres. Para ativá-lo, defina as propriedades de tabela binlog.level e binlog.ttl. Os exemplos a seguir demonstram como ativar binlogs. Para mais informações sobre os parâmetros de criação de tabela, consulte CREATE TABLE.
Teoricamente, ativar binlogs em uma tabela orientada a colunas custa mais do que em uma tabela orientada a linhas. Se a tabela sofrer atualizações frequentes, recomenda-se ativar binlogs em uma tabela orientada a linhas.
-
Sintaxe para V2.1 e posteriores:
Os nomes das propriedades de tabela
binlog.levelebinlog.ttlforam atualizados parabinlog_levelebinlog_ttl.CREATE TABLE test_message_src ( id int PRIMARY KEY, title text NOT NULL, body text ) WITH ( orientation = 'row', clustering_key = 'id', binlog_level = 'replica', binlog_ttl = '86400' -- The TTL of the binlog, in seconds. ); -
Sintaxe suportada em todas as versões:
begin; create table test_message_src( id int primary key, title text not null, body text); call set_table_property('test_message_src', 'orientation', 'row');--Create a row-oriented table named test_message_src. call set_table_property('test_message_src', 'clustering_key', 'id');--Create a clustered index on the id column. call set_table_property('test_message_src', 'binlog.level', 'replica');--Set a table property to enable the binlog feature. call set_table_property('test_message_src', 'binlog.ttl', '86400');--The TTL of the binlog, in seconds. commit;
A tabela a seguir descreve os parâmetros.
|
Parâmetro |
Descrição |
|
|
Especifica se os binlogs devem ser ativados. Valores válidos:
|
|
|
O TTL do binlog, em segundos. Valor padrão: 2592000 (30 dias). |
Ativação de binlogs sob demanda
A partir do Hologres V1.1, é possível ativar ou desativar binlogs e configurar o TTL para atender a diferentes requisitos de retenção. Ative binlogs em tabelas existentes sem a necessidade de recriá-las.
Os recursos a seguir estão disponíveis apenas no Hologres V1.1 e posteriores. Se você utiliza uma versão anterior, consulte Solução de problemas de falhas na preparação de upgrade ou entre em contato conosco pelo grupo do DingTalk do Hologres. Para mais informações, consulte Como obter mais suporte online?.
-
Ativar binlogs
Utilize as instruções a seguir para ativar binlogs em uma tabela existente e definir o TTL do binlog.
-- Set table properties to enable binlogs. begin; call set_table_property('<table_name>', 'binlog.level', 'replica'); commit; -- Set table properties to configure the binlog TTL in seconds. begin; call set_table_property('<table_name>', 'binlog.ttl', '2592000'); commit;table_name é o nome da tabela para a qual você deseja ativar os binlogs.
-
Desativar binlogs
Utilize a instrução a seguir para desativar binlogs em uma tabela.
-- Set table properties to disable binlogs. begin; call set_table_property('<table_name>', 'binlog.level', 'none'); commit;table_name é o nome da tabela para a qual você deseja desativar os binlogs.
-
Modificar o TTL do binlog
A instrução abaixo permite modificar o TTL de uma tabela que já possui binlogs ativados.
NotaA partir do Hologres V1.3.24, é possível definir o TTL do binlog para uma tabela filha de uma tabela particionada. Caso o TTL do binlog não seja definido explicitamente para a tabela filha, ela herdará o TTL do binlog da tabela pai.
call set_table_property('<table_name>', 'binlog.ttl', '8640000'); -- The unit is seconds.table_name é o nome da tabela para a qual você deseja modificar o TTL do binlog.
Consulta de binlogs
Os dados de binlog do Hologres são fortemente tipados. Para consultar os binlogs de uma tabela específica, combine os campos de sistema internos do binlog com as colunas originais da tabela. O Hologres também fornece funções para consultar o binlog mais antigo ou o mais recente, ou ainda buscar informações do binlog por meio de um LSN ou timestamp conhecido.
Consulta por campos internos
Utilize a instrução a seguir para consultar o binlog combinando os campos internos do binlog com os campos originais da tabela.
SELECT hg_binlog_lsn,hg_binlog_event_type,hg_binlog_timestamp_us,* FROM test_message_src;
O código a seguir apresenta um exemplo de resultado.
postgres=# select hg_binlog_lsn, hg_binlog_event_type, hg_binlog_timestamp_us, * from test_message_src ;
hg_binlog_lsn | hg_binlog_event_type | hg_binlog_timestamp_us | id | title | body
---------------+----------------------+------------------------+----+---------+-------------------
1081 | 5 | 1626856018921653 | 1 | title 1 | body 1
1092 | 3 | 1626856054284918 | 1 | title 1 | body 1
1093 | 7 | 1626856054284918 | 1 | title 1 | body after update
1095 | 2 | 1626856059747536 | 1 | title 1 | body after update
(4 rows)
Consulta do binlog mais antigo ou mais recente
Utilize a função hg_get_binlog_cursor para consultar o binlog mais antigo ou mais recente em um shard específico. O código a seguir apresenta a sintaxe.
-- OLDEST: Query the earliest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','OLDEST',<shard_id>);
-- LATEST: Query the latest binlog on this shard.
SELECT * FROM hg_get_binlog_cursor('<table_name>','LATEST',<shard_id>);
O código a seguir mostra um exemplo de uso.
SELECT * FROM hg_get_binlog_cursor('test_message_src','OLDEST',0);
O código a seguir apresenta um exemplo de resultado.
test=# select * from hg_get_binlog_cursor('test_message_src','OLDEST',0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
0 | 152 | 1716204893791755
(1 row)
Consulta de timestamp por LSN
Utilize a função hg_get_binlog_cursor_by_lsn para consultar o timestamp de um binlog. Essa função retorna informações sobre o primeiro registro de binlog cujo LSN seja maior ou igual ao LSN especificado. Se o LSN especificado não existir, o campo hg_binlog_timestamp_us no resultado retornará a hora atual. O código a seguir apresenta a sintaxe.
SELECT * FROM hg_get_binlog_cursor_by_lsn('<table_name>',<lsn>,<shard_id>);--The LSN value must be of the BIGINT type.
O código a seguir mostra um exemplo de uso.
SELECT * FROM hg_get_binlog_cursor_by_lsn('test_message_src',152,0);
O código a seguir apresenta um exemplo de resultado.
test=# select * from hg_get_binlog_cursor_by_lsn('test_message_src',152,0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us
-------------+---------------+------------------------
0 | 152 | 1716204893791755
(1 row)
Consulta de LSN por timestamp
Utilize a função hg_get_binlog_cursor_by_timestamp para consultar o LSN de um binlog. Essa função retorna informações sobre o primeiro registro de binlog com timestamp maior ou igual ao horário especificado. Se o horário especificado for posterior à entrada de binlog mais recente, o campo hg_binlog_timestamp_us no resultado retornará a hora atual, e o campo hg_binlog_lsn retornará o LSN que será atribuído à próxima linha inserida. O código a seguir apresenta a sintaxe.
Se o timestamp fornecido for posterior à hora atual retornada pela função now(), a função lançará uma exceção "get binlog cursor in future time".
SELECT * FROM hg_get_binlog_cursor_by_timestamp('<table_name>',<timestamp>,<shard_id>);
O código a seguir mostra um exemplo de uso.
SELECT *,to_timestamp(hg_binlog_timestamp_us/1000000.0) FROM hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);
O código a seguir apresenta um exemplo de resultado.
test=# select *, to_timestamp(hg_binlog_timestamp_us/1000000.0) from hg_get_binlog_cursor_by_timestamp('test_message_src','2024-05-20 19:34:53.791+08',0);
hg_shard_id | hg_binlog_lsn | hg_binlog_timestamp_us | to_timestamp
-------------+---------------+------------------------+-------------------------------
0 | 152 | 1716204893791755 | 2024-05-20 19:34:53.791755+08
(1 row)
Consumo de binlog em tempo real
Consuma binlogs do Hologres com Flink, Blink e JDBC (incluindo Holo Client). Para mais informações, consulte os tópicos a seguir:
Para consumir binlogs em tempo real com Flink ou Blink, consulte Consumir binlogs do Hologres em tempo real usando Flink ou Blink.
Para consumir binlogs com JDBC, consulte Consumir binlogs do Hologres usando JDBC.
Visualização de tabelas com binlogs ativados
Utilize a instrução SQL a seguir para verificar quais tabelas têm binlogs ativados.
SELECT
*
FROM
hologres.hg_table_properties
WHERE
property_key = 'binlog.level'
AND property_value = 'replica';
Abaixo está um exemplo de resultado. A consulta retorna quatro colunas: table_namespace, table_name, property_key e property_value. Essas colunas fornecem informações sobre todas as tabelas que possuem binlogs ativados.
Visualização do tamanho de armazenamento do binlog
Utilize a função
pg_relation_sizepara obter o tamanho de armazenamento de uma tabela, o que inclui o tamanho de armazenamento do binlog. Para mais informações, consulte Consultar o tamanho de armazenamento de uma tabela.A partir do Hologres V2.1, utilize a função
hologres.hg_relation_sizepara visualizar os detalhes de armazenamento de uma tabela, incluindo dados e binlogs. Para mais informações, consulte Consultar os detalhes de armazenamento de uma tabela.
Desativação de binlogs durante operações DML
Utilize o parâmetro GUC a seguir para impedir que a sessão atual gere binlogs durante operações DML. Defina esse parâmetro no nível da sessão antes de executar uma instrução DML.
-- Enable at the session level.
SET hg_experimental_generate_binlog=off;