Rollbacks de transações são replicados para o ClickHouse?
Posso manter os dados no ClickHouse por mais tempo do que no meu Postgres de origem?
Como posso enriquecer os dados à medida que fluem do Postgres para o ClickHouse?
Posso replicar de várias instâncias do Postgres para um ou mais serviços do ClickHouse?
Como a ociosidade afeta meu ClickPipe de CDC do Postgres?
Como o ClickPipes for Postgres lida com colunas TOAST?
Como o ClickPipes for Postgres lida com colunas geradas?
As tabelas precisam ter chaves primárias para fazer parte do Postgres CDC?
- Chave primária: A abordagem mais simples é definir uma chave primária na tabela. Isso fornece um identificador único para cada linha, o que é essencial para rastrear atualizações e exclusões. Nesse caso, você pode manter a REPLICA IDENTITY como
DEFAULT(o comportamento padrão). - Identidade de réplica: Se uma tabela não tiver chave primária, você pode definir uma identidade de réplica. A identidade de réplica pode ser definida como
FULL, o que significa que a linha inteira será usada para identificar alterações. Como alternativa, você pode configurá-la para usar um índice único, caso exista um na tabela, e então definir a REPLICA IDENTITY comoUSING INDEX index_name. Para definir a identidade de réplica comoFULL, você pode usar o seguinte comando SQL:
REPLICA IDENTITY FULL também permite a replicação de colunas TOAST inalteradas. Mais sobre isso aqui.
Observe que usar REPLICA IDENTITY FULL pode ter implicações de desempenho e também acelerar o crescimento do WAL, especialmente em tabelas sem chave primária e com atualizações ou exclusões frequentes, pois exige que mais dados sejam registrados em log a cada alteração. Se você tiver alguma dúvida ou precisar de ajuda para configurar chaves primárias ou identidades de réplica para suas tabelas, entre em contato com nossa equipe de suporte para obter orientação.
É importante observar que, se não houver uma chave primária nem uma identidade de réplica definida, o ClickPipes não conseguirá replicar alterações dessa tabela, e você poderá encontrar erros durante o processo de replicação. Portanto, é recomendável revisar os esquemas das suas tabelas e garantir que eles atendam a esses requisitos antes de configurar seu ClickPipe.
Há suporte para tabelas particionadas como parte do Postgres CDC?
Posso conectar bancos de dados Postgres que não têm IP público ou estão em redes privadas?
Como lidar com UPDATEs e DELETEs?
_peerdb_) no ClickHouse. O mecanismo de tabela ReplacingMergeTree executa periodicamente a desduplicação em segundo plano com base na chave de ordenação (colunas de ORDER BY), mantendo apenas a linha com a versão _peerdb_ mais recente.
Os DELETEs do Postgres são propagados como novas linhas marcadas como excluídas (usando a coluna _peerdb_is_deleted). Como o processo de desduplicação é assíncrono, talvez você veja duplicatas temporariamente. Para resolver isso, é necessário tratar a desduplicação na camada de consulta.
Observe também que, por padrão, o Postgres não envia os valores de colunas que não fazem parte da chave primária nem da identidade de réplica durante operações de DELETE. Se você quiser capturar os dados completos da linha durante DELETEs, pode definir a REPLICA IDENTITY como FULL.
Para mais detalhes, consulte:
- Boas práticas do mecanismo de tabela ReplacingMergeTree
- Blog sobre o funcionamento interno do CDC de Postgres para ClickHouse
Posso atualizar colunas de chave primária no PostgreSQL?
Há suporte para alterações de esquema?
Quais são os custos do ClickPipes for Postgres CDC?
O tamanho do meu slot de replicação está aumentando ou não diminuindo; qual pode ser o problema?
-
Picos repentinos de atividade no banco de dados
- Grandes atualizações em lote, inserts em massa ou mudanças significativas no esquema podem gerar rapidamente uma grande quantidade de dados de WAL.
- O slot de replicação manterá esses registros de WAL até que sejam consumidos, causando um aumento temporário no tamanho.
-
Transações de longa duração
- Uma transação aberta força o Postgres a manter todos os segmentos de WAL gerados desde o início da transação, o que pode aumentar drasticamente o tamanho do slot.
- Defina
statement_timeouteidle_in_transaction_session_timeoutcom valores razoáveis para evitar que transações permaneçam abertas indefinidamente:Use esta consulta para identificar transações anormalmente longas.
-
Operações de manutenção ou utilitárias (por exemplo,
pg_repack)- Ferramentas como
pg_repackpodem reescrever tabelas inteiras, gerando grandes volumes de dados de WAL em pouco tempo. - Programe essas operações para períodos de menor tráfego ou monitore de perto o uso de WAL enquanto elas estiverem em execução.
- Ferramentas como
-
VACUUM e VACUUM ANALYZE
- Embora sejam necessários para a saúde do banco de dados, esses procedimentos podem gerar tráfego adicional de WAL, especialmente se fizerem varredura em tabelas grandes.
- Considere usar parâmetros de ajuste do autovacuum ou programar operações manuais de VACUUM fora dos horários de pico.
-
O consumidor de replicação não está lendo o slot ativamente
- Se o seu pipeline de CDC (por exemplo, ClickPipes) ou outro consumidor de replicação parar, ficar pausado ou falhar, os dados de WAL se acumularão no slot.
- Garanta que seu pipeline esteja em execução contínua e verifique os logs em busca de erros de conectividade ou authentication.
Como os tipos de dados do Postgres são mapeados para o ClickHouse?
Posso definir meu próprio mapeamento de tipos de dados ao replicar dados do Postgres para o ClickHouse?
Como as colunas json e jsonb são replicadas do Postgres?
json e jsonb são replicadas como tipo String no ClickHouse devido a incompatibilidades com o tipo JSON nativo. Por exemplo:
- O PostgreSQL permite qualquer valor JSON válido no nível superior (strings, números, arrays), enquanto o tipo JSON do ClickHouse oferece suporte apenas a objetos.
- Chaves que contêm pontos (por exemplo, “app.kubernetes.io/name”) também são interpretadas como caminhos aninhados pelo tipo JSON do ClickHouse, o que pode alterar a estrutura dos dados.
O que acontece com os inserts quando um mirror é pausado?
- Para a sincronização, se ela for cancelada no meio do processo, o confirmed_flush_lsn no Postgres não é avançado, então a próxima sincronização começará da mesma posição da que foi abortada, garantindo a consistência dos dados.
- Para a normalização, a ordem de insert do ReplacingMergeTree lida com a desduplicação.
A criação de ClickPipe pode ser automatizada ou feita por meio da API ou da CLI?
Como acelerar a carga inicial?
snapshot number of tables in parallel ou especificar uma coluna de particionamento personalizada e indexada para tabelas grandes.
Como devo delimitar o escopo das minhas publicações ao configurar a replicação?
REPLICA IDENTITY FULL. Se houver tabelas sem chave primária, criar uma publicação para todas as tabelas fará com que as operações DELETE e UPDATE falhem nessas tabelas.
Para identificar tabelas sem chaves primárias no seu banco de dados, você pode usar esta consulta:
-
Excluir do ClickPipes as tabelas sem chaves primárias:
Crie a publicação apenas com as tabelas que têm chave primária:
-
Incluir no ClickPipes as tabelas sem chaves primárias:
Se quiser incluir tabelas sem chave primária, você precisará alterar a identidade da réplica delas para
FULL. Isso garante que as operações de UPDATE e DELETE funcionem corretamente:
Configurações recomendadas de max_slot_wal_keep_size
- No mínimo: defina
max_slot_wal_keep_sizepara reter pelo menos dois dias de dados de WAL. - Para bancos de dados grandes (alto volume de transações): retenha pelo menos 2 a 3 vezes o pico diário de geração de WAL.
- Para ambientes com restrição de armazenamento: ajuste esse parâmetro de forma conservadora para evitar o esgotamento do disco, garantindo ao mesmo tempo a estabilidade da replicação.
Como calcular o valor ideal
Para PostgreSQL 10+
Para PostgreSQL 9.6 e versões anteriores:
- Execute a consulta acima em diferentes horários do dia, especialmente durante períodos de alta atividade transacional.
- Calcule quanto WAL é gerado em um período de 24 horas.
- Multiplique esse número por 2 ou 3 para garantir retenção suficiente.
- Defina
max_slot_wal_keep_sizecom o valor resultante em MB ou GB.
Exemplo
Estou vendo um erro ReceiveMessage EOF nos logs. O que isso significa?
ReceiveMessage é uma função do protocolo de logical decoding do Postgres que lê mensagens do stream de replicação. Um erro EOF (End of File) indica que a conexão com o servidor Postgres foi encerrada inesperadamente ao tentar ler do stream de replicação.
É um erro recuperável e totalmente não fatal. O ClickPipes tentará se reconectar automaticamente e retomar o processo de replicação.
Isso pode acontecer por alguns motivos:
- Problemas de rede: Interrupções temporárias na rede podem fazer a conexão cair.
- Reinicialização do servidor Postgres: Se o servidor Postgres for reiniciado ou falhar, a conexão será perdida.
Meu slot de replicação foi invalidado. O que devo fazer?
max_slot_wal_keep_size no seu banco de dados PostgreSQL (por exemplo, alguns gigabytes). Recomendamos aumentar esse valor. Consulte esta seção sobre o ajuste de max_slot_wal_keep_size. O ideal é configurá-lo para pelo menos 200 GB para evitar a invalidação do slot de replicação.
Em casos raros, vimos esse problema ocorrer mesmo quando max_slot_wal_keep_size não está configurado. Isso pode ser causado por um bug raro e complexo no PostgreSQL, embora a causa exata permaneça incerta.
Estou vendo erros de falta de memória (OOMs) no ClickHouse enquanto meu ClickPipe está ingerindo dados. Podem ajudar?
-
Uma técnica comum de otimização para JOINs é quando você tem um
LEFT JOINem que a tabela do lado direito é muito grande. Nesse caso, reescreva a consulta para usar umRIGHT JOINe mova a tabela maior para o lado esquerdo. Isso permite que o planejador de consultas seja mais eficiente em termos de memória. -
Outra otimização para JOINs é filtrar explicitamente as tabelas por meio de
subqueriesouCTEse, em seguida, executar oJOINentre essas subconsultas. Isso dá ao planejador indicações de como filtrar linhas com eficiência e executar oJOIN.
Estou vendo um invalid snapshot identifier durante a carga inicial. O que devo fazer?
invalid snapshot identifier ocorre quando há uma queda na conexão entre o ClickPipes e seu banco de dados Postgres. Isso pode acontecer devido a timeouts no gateway, reinicializações do banco de dados ou outros problemas transitórios.
Recomenda-se não realizar operações disruptivas, como upgrades ou reinicializações, no seu banco de dados Postgres enquanto a carga inicial estiver em andamento, e garantir que a conexão de rede com o banco esteja estável.
Para resolver esse problema, você pode acionar uma ressincronização pela UI do ClickPipes. Isso reiniciará o processo de carga inicial desde o início.
O que acontece se eu excluir uma publicação no Postgres?
- Crie uma nova publicação com o mesmo nome e as tabelas necessárias no Postgres
- Clique no botão ‘Resync tables’ na aba Settings do seu ClickPipe
E se eu estiver vendo erros Unexpected Datatype ou Cannot parse type XX ...
Estou recebendo erros como invalid memory alloc request size <XXX> durante a replicação/criação de slot
Preciso manter um histórico completo no ClickHouse, mesmo quando os dados forem excluídos do banco de dados Postgres de origem. Posso ignorar completamente as operações DELETE e TRUNCATE do Postgres no ClickPipes?
Por que não consigo replicar minha tabela que tem um ponto no nome?
A carga inicial foi concluída, mas não há dados ou estão faltando dados no ClickHouse. Qual pode ser o problema?
- Se o usuário tem permissões suficientes para ler as tabelas de origem.
- Se há políticas de linha no ClickHouse que possam estar filtrando linhas.
Posso fazer com que o ClickPipe crie um slot de replicação com failover habilitado?
Advanced Settings ao criar o ClickPipe. Observe que sua versão do Postgres deve ser 17 ou superior para usar esse recurso.
Se a origem estiver configurada adequadamente, o slot será preservado após failovers para uma réplica de leitura do Postgres, garantindo a replicação contínua dos dados. Saiba mais aqui.
Estou vendo erros como Internal error encountered during logical decoding of aborted sub-transaction
ReorderBufferPreserveLastSpilledSnapshot, isso indica que a logical decoding não está conseguindo ler o snapshot gravado em disco. Pode valer a pena tentar aumentar o logical_decoding_work_mem para um valor mais alto.
Estou vendo erros como error converting new tuple to map ou error parsing logical message durante a replicação por CDC
Posso incluir colunas que inicialmente excluí da replicação?
Estou percebendo que meu ClickPipe entrou em Snapshot, mas os dados não estão entrando. Qual pode ser o problema?
O snapshot paralelo está demorando para obter partições
A criação do replication slot está bloqueada por uma transação
CREATE_REPLICATION_SLOT travada no estado Lock. Isso pode acontecer porque outra transação está mantendo bloqueios em objetos que o Postgres usa para criar replication slots.
Para ver as consultas que estão causando o bloqueio, você pode executar a consulta abaixo na sua origem Postgres: