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.
materialized_postgresql_use_extended_date_and_time_types
date e timestamp/timestamptz do PostgreSQL para Date32 e DateTime64 do ClickHouse, que abrangem o intervalo de valores mais amplo desses tipos no PostgreSQL. Padrão: 1.
Se definido como 0, os tipos mais limitados Date e DateTime são usados em vez deles (valores fora do intervalo deles ou com precisão de subsegundos não podem ser representados).
Essa configuração controla apenas os tipos de coluna escolhidos pela inferência de tipos quando as tabelas aninhadas são criadas, portanto deve ser especificada no momento de CREATE DATABASE. Ela não pode ser alterada depois com ALTER DATABASE ... MODIFY SETTING (as tabelas aninhadas já criadas mantêm seus tipos de coluna fixos, e essa alteração é rejeitada); para mudá-la, recrie o banco de dados. Ela não se aplica ao motor de tabela MaterializedPostgreSQL, em que os tipos de coluna são declarados explicitamente.
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
Backup e restauração
MaterializedPostgreSQL. Os dados de cada tabela replicada ficam armazenados em uma tabela aninhada ReplacingMergeTree, portanto BACKUP DATABASE captura esses dados ao delegar para a tabela aninhada.
MaterializedPostgreSQL no mesmo local não é suportada. Um objeto MaterializedPostgreSQL restaurado começa imediatamente a replicar a partir da origem PostgreSQL ativa, portanto restaurar o snapshot do backup sobre ele misturaria o snapshot com o estado remoto atual. Por isso, o RESTORE é bloqueado por segurança nesse caso. Em vez disso, restaure os dados capturados em tabelas ReplacingMergeTree comuns:
-
Em um backup de banco de dados, a definição armazenada de cada tabela já é a
ReplacingMergeTreeaninhada sintética (não a engineMaterializedPostgreSQL), portanto cada tabela pode ser restaurada diretamente em uma nova tabela, que ainda não exista: -
Para um backup de tabela
MaterializedPostgreSQLisolada, a definição armazenada é a própria engineMaterializedPostgreSQL. Crie antes uma tabelaReplacingMergeTreecom a mesma estrutura da tabela aninhada (incluindo as colunas_signe_version) e restaure nela: