Se recomienda a los usuarios de ClickHouse Cloud que utilicen ClickPipes para la replicación de PostgreSQL a ClickHouse. Esto ofrece compatibilidad nativa con Change Data Capture (CDC) de alto rendimiento para PostgreSQL.
MaterializedPostgreSQL crea una instantánea de la base de datos de PostgreSQL y carga las tablas necesarias. Las tablas necesarias pueden incluir cualquier subconjunto de tablas de cualquier subconjunto de esquemas de la base de datos especificada. Junto con la instantánea, el motor de base de datos obtiene el LSN y, una vez completado el volcado inicial de las tablas, empieza a extraer actualizaciones del WAL. Después de crear la base de datos, las tablas que se añadan posteriormente a la base de datos de PostgreSQL no se incorporan automáticamente a la replicación. Deben añadirse manualmente con la consulta ATTACH TABLE db.table.
La replicación se implementa mediante el protocolo de replicación lógica de PostgreSQL, que no permite replicar DDL, pero sí detectar si se han producido cambios que rompen la replicación (cambios en el tipo de columna, adición o eliminación de columnas). Estos cambios se detectan y las tablas correspondientes dejan de recibir actualizaciones. En este caso, debe usar las consultas ATTACH/ DETACH PERMANENTLY para recargar por completo la tabla. Si el DDL no rompe la replicación (por ejemplo, al cambiar el nombre de una columna), la tabla seguirá recibiendo actualizaciones (la inserción se realiza por posición).
Este motor de base de datos es experimental. Para usarlo, establezca
allow_experimental_database_materialized_postgresql en 1 en sus archivos de configuración o mediante el comando SET:Crear una base de datos
host:port— endpoint del servidor PostgreSQL.database— nombre de la base de datos de PostgreSQL.user— usuario de PostgreSQL.password— contraseña del usuario.
Ejemplo de uso
Añadir nuevas tablas a la replicación de forma dinámica
MaterializedPostgreSQL, esta no detecta automáticamente las tablas nuevas de la base de datos de PostgreSQL correspondiente. Estas tablas se pueden añadir manualmente:
Eliminar tablas dinámicamente de la replicación
Esquema de PostgreSQL
- Un esquema por cada motor de base de datos
MaterializedPostgreSQL. Requiere usar la configuraciónmaterialized_postgresql_schema. Se accede a las tablas solo por el nombre de la tabla:
- Cualquier cantidad de esquemas con un conjunto específico de tablas para un mismo database engine
MaterializedPostgreSQL. Requiere usar la configuraciónmaterialized_postgresql_tables_list. Cada tabla se escribe junto con su esquema. Se accede a las tablas mediante el nombre del esquema y el nombre de la tabla al mismo tiempo:
materialized_postgresql_tables_list deben escribirse con el nombre de su esquema.
Requiere materialized_postgresql_tables_list_with_schema = 1.
Advertencia: en este caso no se permiten puntos en el nombre de la tabla.
- Cualquier número de esquemas con el conjunto completo de tablas para un motor de base de datos
MaterializedPostgreSQL. Requiere usar el ajustematerialized_postgresql_schema_list.
Requisitos
-
La configuración wal_level debe tener asignado el valor
logical, y el parámetromax_replication_slotsdebe tener un valor de al menos2en el archivo de configuración de PostgreSQL. - Cada tabla replicada debe tener una de las siguientes identidades de réplica:
- clave primaria (de forma predeterminada)
- índice
La replicación de valores TOAST no es compatible. Se utilizará el valor predeterminado del tipo de dato.
Configuración
materialized_postgresql_tables_list
materialized_postgresql_schema
materialized_postgresql_schema_list
materialized_postgresql_max_block_size
- Entero positivo.
65536.
materialized_postgresql_replication_slot
materialized_postgresql_snapshot.
materialized_postgresql_snapshot
materialized_postgresql_replication_slot.
materialized_postgresql_tables_list. Para actualizar la lista de tablas de este ajuste, use la consulta ATTACH TABLE.
materialized_postgresql_use_unique_replication_consumer_identifier
0.
Si se establece en 1, permite configurar varias tablas MaterializedPostgreSQL que apunten a la misma tabla PostgreSQL.
Notas
Failover del slot de replicación lógica
materialized_postgresql_replication_slot, y este debe exportarse con la opción EXPORT SNAPSHOT. El identificador de la instantánea debe pasarse mediante la configuración materialized_postgresql_snapshot.
Tenga en cuenta que esto debe usarse solo si realmente es necesario. Si no hay una necesidad real o no se entiende completamente por qué hacerlo, es mejor permitir que el motor de tabla cree y administre su propio slot de replicación.
Ejemplo (de @bchrobot)
-
Configure el slot de replicación en PostgreSQL.
-
Espere a que el slot de replicación esté listo; luego, inicie una transacción y exporte el identificador de la instantánea de la transacción:
-
En ClickHouse, cree la base de datos:
-
Finalice la transacción de PostgreSQL una vez que se confirme la replicación en la base de datos de ClickHouse. Verifique que la replicación continúe después del failover:
Permisos requeridos
- CREATE PUBLICATION — privilegio para crear consultas.
- CREATE_REPLICATION_SLOT — privilegio de replicación.
- pg_drop_replication_slot — privilegio de replicación o privilegios de superusuario.
-
DROP PUBLICATION — propietario de la publicación (
usernameen el propio motor MaterializedPostgreSQL).
2 y 3 y no necesitar esos permisos. Use la configuración materialized_postgresql_replication_slot y materialized_postgresql_snapshot. Pero hágalo con mucho cuidado.
Acceso a las tablas:
- pg_publication
- pg_replication_slots
- pg_publication_tables