¿Se replican en ClickHouse las reversiones de transacciones?
¿Puedo conservar datos en ClickHouse durante más tiempo que en el Postgres de origen?
¿Cómo puedo enriquecer los datos a medida que se transfieren de Postgres a ClickHouse?
¿Puedo replicar desde varias instancias de Postgres a uno o más servicios de ClickHouse?
¿Cómo afecta la inactividad a mi ClickPipe de Postgres CDC?
¿Cómo se manejan las columnas TOAST en ClickPipes for Postgres?
¿Cómo se manejan las columnas generadas en ClickPipes for Postgres?
¿Las tablas necesitan tener una clave primaria para formar parte de Postgres CDC?
- Clave primaria: La forma más sencilla es definir una clave primaria en la tabla. Esto proporciona un identificador único para cada fila, lo cual es fundamental para seguir las actualizaciones y eliminaciones. En este caso, puedes tener REPLICA IDENTITY configurada como
DEFAULT(el comportamiento predeterminado). - Replica Identity: Si una tabla no tiene clave primaria, puedes configurar una replica identity. La replica identity puede establecerse en
FULL, lo que significa que se usará la fila completa para identificar los cambios. Como alternativa, puedes configurarla para usar un índice único si existe uno en la tabla y, después, establecer REPLICA IDENTITY enUSING INDEX index_name. Para establecer la replica identity en FULL, puedes usar el siguiente comando SQL:
REPLICA IDENTITY FULL puede afectar al rendimiento y acelerar el crecimiento del WAL, especialmente en tablas sin clave primaria y con actualizaciones o eliminaciones frecuentes, ya que exige registrar más datos en cada cambio. Si tienes alguna duda o necesitas ayuda para configurar claves primarias o identidades de réplica en tus tablas, ponte en contacto con nuestro equipo de soporte para recibir orientación.
Es importante tener en cuenta que, si no se define ni una clave primaria ni una identidad de réplica, ClickPipes no podrá replicar los cambios de esa tabla, y podrías encontrarte con errores durante el proceso de replicación. Por lo tanto, se recomienda revisar los esquemas de tus tablas y asegurarte de que cumplan estos requisitos antes de configurar tu ClickPipe.
¿Se admiten tablas particionadas como parte de Postgres CDC?
¿Puedo conectar bases de datos de Postgres que no tienen una IP pública o que están en redes privadas?
¿Cómo se gestionan los UPDATEs y DELETEs?
_peerdb_) en ClickHouse. El motor de tabla ReplacingMergeTree realiza periódicamente la deduplicación en segundo plano en función de la clave de ordenación (columnas ORDER BY), conservando solo la fila con la versión _peerdb_ más reciente.
Los DELETEs de Postgres se propagan como filas nuevas marcadas como eliminadas (mediante la columna _peerdb_is_deleted). Como el proceso de deduplicación es asíncrono, es posible que veas duplicados temporalmente. Para resolverlo, debes gestionar la deduplicación en la capa de consulta.
Ten en cuenta también que, de forma predeterminada, Postgres no envía los valores de las columnas que no forman parte de la clave primaria o de la identidad de réplica durante las operaciones DELETE. Si quieres capturar los datos completos de la fila durante los DELETEs, puedes establecer REPLICA IDENTITY en FULL.
Para obtener más información, consulta:
- buenas prácticas del motor de tabla ReplacingMergeTree
- entrada de blog sobre los aspectos internos del CDC de Postgres a ClickHouse
¿Puedo actualizar columnas de la clave primaria en PostgreSQL?
¿Se admiten cambios de esquema?
¿Cuáles son los costos de ClickPipes for Postgres CDC?
El tamaño de mi slot de replicación está creciendo o no disminuye; ¿cuál podría ser el problema?
-
Picos repentinos en la actividad de la base de datos
- Las actualizaciones masivas, los inserts en bloque o los cambios importantes en el esquema pueden generar rápidamente una gran cantidad de datos WAL.
- El slot de replicación conservará estos registros WAL hasta que se consuman, lo que provocará un aumento temporal de tamaño.
-
Transacciones de larga duración
- Una transacción abierta obliga a Postgres a conservar todos los segmentos WAL generados desde que comenzó la transacción, lo que puede aumentar drásticamente el tamaño del slot.
- Establece
statement_timeouteidle_in_transaction_session_timeouten valores razonables para evitar que las transacciones permanezcan abiertas indefinidamente:Usa esta consulta para identificar transacciones inusualmente largas.
-
Operaciones de mantenimiento o utilidades (por ejemplo,
pg_repack)- Herramientas como
pg_repackpueden reescribir tablas completas, generando grandes cantidades de datos WAL en poco tiempo. - Programa estas operaciones durante períodos de menor tráfico o supervisa de cerca el uso de WAL mientras se ejecutan.
- Herramientas como
-
VACUUM y VACUUM ANALYZE
- Aunque son necesarios para la salud de la base de datos, estas operaciones pueden generar tráfico WAL adicional, especialmente si escanean tablas grandes.
- Considera usar parámetros de ajuste de autovacuum o programar operaciones manuales de VACUUM durante horas de baja actividad.
-
El consumidor de replicación no está leyendo activamente el slot
- Si tu pipeline de CDC (por ejemplo, ClickPipes) u otro consumidor de replicación se detiene, se pausa o falla, los datos WAL se acumularán en el slot.
- Asegúrate de que tu pipeline esté ejecutándose de forma continua y revisa los logs para detectar errores de conectividad o autenticación.
¿Cómo se mapean los tipos de datos de Postgres a ClickHouse?
¿Puedo definir mi propio mapeo de tipos de datos al replicar datos de Postgres a ClickHouse?
¿Cómo se replican las columnas json y jsonb desde Postgres?
json y jsonb se replican como tipo String en ClickHouse debido a incompatibilidades con el tipo JSON nativo. Por ejemplo:
- PostgreSQL permite cualquier valor JSON válido en el nivel superior (cadenas, números, arrays), mientras que el tipo JSON de ClickHouse solo admite objetos.
- Las claves que contienen puntos (p. ej., “app.kubernetes.io/name”) también son interpretadas por el tipo JSON de ClickHouse como rutas anidadas, lo que podría alterar la estructura de los datos.
¿Qué sucede con las inserciones cuando se pausa un mirror?
- En el caso de sync, si se cancela a mitad del proceso, el confirmed_flush_lsn en Postgres no avanza, por lo que la siguiente sync comenzará desde la misma posición que la abortada, lo que garantiza la consistencia de los datos.
- En el caso de normalize, el orden de inserción de ReplacingMergeTree se encarga de la deduplicación.
¿Se puede automatizar la creación de ClickPipe o realizarla mediante API o CLI?
¿Cómo puedo acelerar mi carga inicial?
snapshot number of tables in parallel o especificar una columna de particionamiento personalizada e indexada para las tablas grandes.
¿Cómo debo delimitar mis publicaciones al configurar la replicación?
REPLICA IDENTITY FULL. Si tiene tablas sin clave primaria, crear una publicación para todas las tablas hará que las operaciones DELETE y UPDATE fallen en esas tablas.
Para identificar las tablas sin claves primarias en su base de datos, puede usar esta consulta:
-
Excluir de ClickPipes las tablas sin clave primaria:
Cree la publicación solo con las tablas que tienen clave primaria:
-
Incluir en ClickPipes las tablas sin clave primaria:
Si quiere incluir tablas sin clave primaria, debe cambiar su identidad de réplica a
FULL. Esto garantiza que las operaciones UPDATE y DELETE funcionen correctamente:
Configuración recomendada de max_slot_wal_keep_size
- Como mínimo: Configure
max_slot_wal_keep_sizepara retener al menos dos días de datos WAL. - Para bases de datos grandes (alto volumen de transacciones): Retenga al menos entre 2 y 3 veces la generación máxima diaria de WAL.
- Para entornos con almacenamiento limitado: Ajuste este valor de forma conservadora para evitar agotar el espacio en disco y, al mismo tiempo, garantizar la estabilidad de la replicación.
Cómo calcular el valor adecuado
Para PostgreSQL 10+
Para PostgreSQL 9.6 y versiones anteriores:
- Ejecute la consulta anterior en distintos momentos del día, especialmente durante períodos de alta actividad transaccional.
- Calcule cuánto WAL se genera en cada período de 24 horas.
- Multiplique ese valor por 2 o 3 para garantizar una retención suficiente.
- Establezca
max_slot_wal_keep_sizeen el valor resultante, en MB o GB.
Ejemplo
Veo un error EOF de ReceiveMessage en los logs. ¿Qué significa?
ReceiveMessage es una función del protocolo de decodificación lógica de Postgres que lee mensajes del flujo de replicación. Un error EOF (End of File) indica que la conexión al servidor de Postgres se cerró inesperadamente mientras se intentaba leer del flujo de replicación.
Es un error recuperable y totalmente no fatal. ClickPipes intentará volver a conectarse automáticamente y reanudar el proceso de replicación.
Puede ocurrir por varios motivos:
- Problemas de red: Las interrupciones temporales de la red pueden hacer que la conexión se cierre.
- Reinicio del servidor de Postgres: Si el servidor de Postgres se reinicia o falla, la conexión se perderá.
Mi slot de replicación se ha invalidado. ¿Qué debo hacer?
max_slot_wal_keep_size tenga un valor demasiado bajo en tu base de datos PostgreSQL (por ejemplo, unos pocos gigabytes). Recomendamos aumentar este valor. Consulta esta sección sobre cómo ajustar max_slot_wal_keep_size. Lo ideal es establecerlo en al menos 200 GB para evitar que el slot de replicación se invalide.
En casos poco frecuentes, hemos visto que este problema se produce incluso cuando max_slot_wal_keep_size no está configurado. Esto podría deberse a un error complejo y poco común en PostgreSQL, aunque la causa sigue sin estar clara.
Estoy viendo errores de memoria insuficiente (OOM) en ClickHouse mientras mi ClickPipe está realizando la ingestión de datos. ¿Pueden ayudarme?
JOIN potencialmente no optimizados:
-
Una técnica de optimización habitual para los
JOINse aplica cuando tiene unLEFT JOINen el que la tabla del lado derecho es muy grande. En ese caso, reescriba la consulta para usar unRIGHT JOINy mueva la tabla más grande al lado izquierdo. Esto permite que el planificador de consultas sea más eficiente en el uso de la memoria. -
Otra optimización para los
JOINconsiste en filtrar explícitamente las tablas mediantesubqueriesoCTEsy, a continuación, realizar elJOINentre esas subconsultas. Esto proporciona al planificador indicaciones sobre cómo filtrar filas de forma eficiente y ejecutar elJOIN.
Veo un invalid snapshot identifier durante la carga inicial. ¿Qué debo hacer?
invalid snapshot identifier se produce cuando se interrumpe la conexión entre ClickPipes y su base de datos de Postgres. Esto puede ocurrir por timeouts del gateway, reinicios de la base de datos u otros problemas transitorios.
Se recomienda no realizar operaciones disruptivas, como actualizaciones o reinicios, en su base de datos de Postgres mientras la carga inicial esté en curso, y asegurarse de que la conexión de red con la base de datos sea estable.
Para resolver este problema, puede iniciar una resincronización desde la UI de ClickPipes. Esto reiniciará el proceso de carga inicial desde el principio.
¿Qué sucede si elimino una publicación en Postgres?
- Crea una nueva publicación con el mismo nombre y las tablas necesarias en Postgres
- Haz clic en el botón ‘Resync tables’ en la pestaña ‘Settings’ de tu ClickPipe
¿Qué pasa si veo errores como Unexpected Datatype o Cannot parse type XX ...?
Veo errores como invalid memory alloc request size <XXX> durante la creación de la replicación o del slot
pipe si se produce este error.
Necesito mantener un historial completo en ClickHouse, incluso cuando los datos se eliminan de la base de datos Postgres de origen. ¿Puedo ignorar por completo las operaciones DELETE y TRUNCATE de Postgres en ClickPipes?
¿Por qué no puedo replicar mi tabla si tiene un punto en el nombre?
La carga inicial se completó, pero no hay datos o faltan datos en ClickHouse. ¿Cuál podría ser el problema?
- Si el usuario tiene permisos suficientes para leer las tablas de origen.
- Si hay políticas de filas del lado de ClickHouse que podrían estar filtrando filas.
¿Puedo hacer que ClickPipe cree un slot de replicación con failover habilitado?
Advanced Settings al crear el ClickPipe. Ten en cuenta que tu versión de Postgres debe ser 17 o superior para usar esta función.
Si el origen está configurado correctamente, el slot se conserva tras un failover a una réplica de lectura de Postgres, lo que garantiza la replicación continua de los datos. Más información aquí.
Veo errores como Internal error encountered during logical decoding of aborted sub-transaction
ReorderBufferPreserveLastSpilledSnapshot, esto indica que la decodificación lógica no puede leer la instantánea volcada a disco. Puede valer la pena probar a aumentar logical_decoding_work_mem a un valor mayor.
Veo errores como error converting new tuple to map o error parsing logical message durante la replicación de CDC
¿Puedo incluir columnas que inicialmente excluí de la replicación?
He notado que mi ClickPipe ha entrado en Snapshot, pero no están llegando datos; ¿cuál podría ser el problema?
La creación de instantáneas en paralelo tarda en obtener las particiones
La creación del slot de replicación está bloqueada por una transacción
CREATE_REPLICATION_SLOT atascada en estado Lock. Esto puede deberse a que otra transacción está reteniendo bloqueos sobre objetos que Postgres utiliza para crear slots de replicación.
Para ver las consultas que están bloqueando, puedes ejecutar la siguiente consulta en tu origen de Postgres: