Recomenda-se que os usuários do ClickHouse Cloud usem ClickPipes para replicar dados do PostgreSQL para o ClickHouse. Isso oferece suporte nativo a CDC (Change Data Capture) de alto desempenho para PostgreSQL.
MaterializedPostgreSQL cria um snapshot do banco de dados PostgreSQL e carrega as tabelas necessárias. As tabelas necessárias podem incluir qualquer subconjunto de tabelas de qualquer subconjunto de esquemas do banco de dados especificado. Junto com o snapshot, a engine do banco de dados obtém o LSN e, depois que o dump inicial das tabelas é realizado, começa a buscar atualizações do WAL. Depois que o banco de dados é criado, as tabelas adicionadas posteriormente ao banco de dados PostgreSQL não são incluídas automaticamente na replicação. Elas precisam ser adicionadas manualmente com a consulta ATTACH TABLE db.table.
A replicação é implementada com o Protocolo de Replicação Lógica do PostgreSQL, que não permite replicar DDL, mas permite identificar se ocorreram alterações que quebram a replicação (mudanças no tipo de coluna, adição/remoção de colunas). Essas alterações são detectadas e, nesse caso, as tabelas correspondentes deixam de receber atualizações. Nesse caso, você deve usar as consultas ATTACH/ DETACH PERMANENTLY para recarregar completamente a tabela. Se o DDL não quebrar a replicação (por exemplo, ao renomear uma coluna), a tabela continuará recebendo atualizações (a inserção é feita por posição).
Esta engine de banco de dados é experimental. Para usá-la, defina
allow_experimental_database_materialized_postgresql como 1 em seus arquivos de configuração ou use o comando SET:Criar um banco de dados
host:port— endpoint do servidor PostgreSQL.database— nome do banco de dados PostgreSQL.user— usuário do PostgreSQL.password— senha do usuário.
Exemplo de uso
Adição dinâmica de novas tabelas à replicação
MaterializedPostgreSQL é criado, ele não detecta automaticamente novas tabelas no banco de dados PostgreSQL correspondente. Essas tabelas podem ser adicionadas manualmente:
Remoção dinâmica de tabelas da replicação
Esquema do PostgreSQL
- Um esquema para um engine de banco de dados
MaterializedPostgreSQL. Exige o uso da configuraçãomaterialized_postgresql_schema. As tabelas são acessadas apenas pelo nome da tabela:
- Qualquer número de esquemas com um conjunto especificado de tabelas para um engine de banco de dados
MaterializedPostgreSQL. É necessário usar a configuraçãomaterialized_postgresql_tables_list. Cada tabela é especificada junto com seu esquema. As tabelas são acessadas pelo nome do esquema e pelo nome da tabela simultaneamente:
materialized_postgresql_tables_list devem ser especificadas com o nome do esquema.
Requer materialized_postgresql_tables_list_with_schema = 1.
Aviso: neste caso, pontos no nome da tabela não são permitidos.
- Qualquer número de esquemas com o conjunto completo de tabelas para um engine de banco de dados
MaterializedPostgreSQL. Requer o uso da configuraçãomaterialized_postgresql_schema_list.
Requisitos
-
A configuração wal_level deve estar definida como
logical, e o parâmetromax_replication_slotsdeve ter um valor de pelo menos2no arquivo de configuração do PostgreSQL. - Cada tabela replicada deve ter uma das seguintes identidades de réplica:
- chave primária (por padrão)
- índice
Não há suporte à replicação de valores TOAST. O valor padrão do tipo de dado será usado.
Configurações
materialized_postgresql_tables_list
materialized_postgresql_schema
materialized_postgresql_schema_list
materialized_postgresql_max_block_size
- Inteiro positivo.
65536.
materialized_postgresql_replication_slot
materialized_postgresql_snapshot.
materialized_postgresql_snapshot
materialized_postgresql_replication_slot.
materialized_postgresql_tables_list. Para atualizar a lista de tabelas nessa configuração, use a consulta ATTACH TABLE.
materialized_postgresql_use_unique_replication_consumer_identifier
0.
Se definido como 1, permite configurar várias tabelas MaterializedPostgreSQL apontando para a mesma tabela PostgreSQL.
Notas
Failover do slot de replicação lógica
materialized_postgresql_replication_slot, e ele precisa ser exportado com a opção EXPORT SNAPSHOT. O identificador do snapshot precisa ser informado na configuração materialized_postgresql_snapshot.
Observe que isso deve ser usado apenas quando for realmente necessário. Se não houver uma necessidade real disso ou um entendimento claro do motivo, é melhor permitir que o table engine crie e gerencie seu próprio slot de replicação.
Exemplo (de @bchrobot)
-
Configure o slot de replicação no PostgreSQL.
-
Aguarde até que o slot de replicação esteja pronto e, em seguida, inicie uma transação e exporte o identificador de snapshot da transação:
-
No ClickHouse, crie o banco de dados:
-
Encerre a transação do PostgreSQL assim que a replicação para o banco de dados do ClickHouse for confirmada. Verifique se a replicação continua após o failover:
Permissões necessárias
- CREATE PUBLICATION — privilégio para executar a consulta de criação.
- CREATE_REPLICATION_SLOT — privilégio de replicação.
- pg_drop_replication_slot — privilégio de replicação ou superusuário.
-
DROP PUBLICATION — proprietário da publicação (
usernameno próprio engine MaterializedPostgreSQL).
2 e 3 e não precisar dessas permissões. Use as configurações materialized_postgresql_replication_slot e materialized_postgresql_snapshot. Mas com muito cuidado.
Acesso às tabelas:
- pg_publication
- pg_replication_slots
- pg_publication_tables