Replicar datos entre AlloyDB Omni y otras bases de datos

Selecciona una versión de la documentación:

En esta página se indican los pasos para replicar datos entre AlloyDB Omni y otras bases de datos mediante la extensión pglogical.

Para obtener más información, consulta Información sobre la extensión pglogical y la pglogicalterminología y los componentes fundamentales.

Métodos de autenticación admitidos

Los dos métodos de autenticación principales que se usan con la extensión pglogical son la autenticación con contraseña y la autenticación basada en la confianza.

El método de autenticación recomendado es el de confianza. Para obtener más información, consulta Métodos de autenticación admitidos.

Antes de empezar

Puedes instalar pglogical como extensión en una base de datos determinada.

Antes de implementar la extensión pglogical en AlloyDB Omni, asegúrate de que cumples los siguientes requisitos del sistema:

  • Acceso a tu clúster de PostgreSQL que no sea de AlloyDB como superuser.
  • La extensión pglogical está instalada en tu clúster de PostgreSQL que no es de AlloyDB. Para obtener instrucciones de instalación específicas de la versión y la distribución, consulta pglogical.
  • Un servidor AlloyDB Omni instalado y configurado. Para obtener instrucciones sobre cómo instalar AlloyDB Omni, consulta Instalar AlloyDB Omni.
  • Las direcciones IP del clúster de PostgreSQL que no es de AlloyDB y del servidor host de AlloyDB Omni.
  • Una red establecida y segura entre el clúster de PostgreSQL que no es de AlloyDB y el servidor host de AlloyDB Omni. Se necesita conectividad TCP en el puerto estándar de PostgreSQL, el 5432.

Ajustar los parámetros del proveedor que no es de AlloyDB

  1. Define el parámetro wal_level como logical y añade pglogical al parámetro shared_preload_libraries del archivo postgresql.conf. La extensión pglogical requiere un conjunto mínimo de ajustes de parámetros en el clúster del proveedor que no sea de AlloyDB.

    cp postgresql.conf postgresql.bak
    sed -r -i "s|(\#)?wal_level\s*=.*|wal_level=logical|" postgresql.conf
    sed -r -i "s|(\#)?(shared_preload_libraries\s*=\s*)'(.*)'.*$|\2'\3,pglogical'|" postgresql.conf
    sed -r -i "s|',|'|" postgresql.conf
  2. Comprueba que los parámetros estén configurados correctamente:

    grep -iE 'wal_level|shared_preload_libraries' postgresql.conf
  3. Reinicia el clúster que no es de AlloyDB para que los cambios en los parámetros surtan efecto.

    Otros parámetros ya pueden tener valores suficientes o pueden requerir ajustes en función de la distribución y la versión que no sean de AlloyDB.

    Comprueba los siguientes parámetros:

    • max_worker_processes: una por cada base de datos del proveedor y al menos una por cada nodo de suscriptor. El valor estándar de este parámetro es 10.
    • max_replication_slots: uno por nodo en los nodos de proveedor.
    • max_wal_senders: uno por nodo en los nodos de proveedor.
    • track_commit_timestamp: se asigna el valor on si se requiere la resolución de conflictos de la última o la primera actualización.
    • listen_addresses: debe incluir la dirección IP de AlloyDB Omni o mencionarla mediante un bloque CIDR que la incluya.
  4. (Opcional) Si tu proveedor que no es de AlloyDB es Amazon RDS o Aurora, debes habilitar la extensión pglogical y ajustar los parámetros necesarios mediante ajustes de cluster parameter group.

    1. En un grupo de parámetros de clúster nuevo o ya creado, define los siguientes parámetros:

      • De rds.logical_replication a 1
      • De max_replication_slots a 50
      • De max_wal_senders a 50
      • De max_worker_processes a 64
      • De shared_preload_libraries a pg_stat_statements, pglogical
    2. Reinicia tu clúster de Amazon RDS o Aurora para que se apliquen los ajustes del grupo de parámetros del clúster.

  5. Confirma que todos los valores de los parámetros sean relevantes:

    SELECT name, setting
    FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
     ORDER BY name;
    

Ajustes de la autenticación basada en host en el clúster del proveedor que no es de AlloyDB Omni

El pglogical establece conexiones TCP locales con la base de datos del proveedor. Por lo tanto, debes añadir la dirección IP del servidor host al archivo DATA_DIR/pg_hba.conf de AlloyDB Omni, donde DATA_DIR es la ruta del sistema de archivos al directorio de datos (por ejemplo, /home/$USER/alloydb-data).

  1. Añade una entrada de autenticación de confianza para el servidor local, específica de un nuevo usuario de pglogical_replication, al archivo DATA_DIR/pg_hba.conf.

    Además, los nodos de suscriptor deben poder autenticarse en los nodos de proveedor. Añade la dirección IP de cada nodo de suscriptor o el intervalo de direcciones IP del bloque CIDR correspondiente al archivo DATA_DIR/pg_hba.conf:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    host all pglogical_replication SERVER_IP_ADDRESS/32 trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf

    Sustituye SERVER_IP_ADDRESS por la dirección IP de la instancia principal de AlloyDB Omni desde la que se va a replicar.

  2. Verifica que las entradas sean correctas:

    tail -3 DATA_DIR/pg_hba.conf
  3. Reinicia el clúster que no es de AlloyDB para que los cambios en los parámetros surtan efecto.

Ajustar los parámetros del clúster de suscriptor de AlloyDB Omni

pglogical también requiere un conjunto mínimo de ajustes de parámetros en el clúster suscriptor de AlloyDB Omni. Debe añadir pglogical al parámetro shared_preload_libraries del archivo DATA_DIR/postgresql.conf. Si alguna base de datos del clúster actúa como base de datos de proveedor, haz los cambios de parámetros necesarios para las bases de datos de proveedor.

  1. Ajusta los parámetros:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. Comprueba que el parámetro esté configurado correctamente:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. Reinicia AlloyDB Omni para que el cambio de parámetro surta efecto:

    Docker

     docker container restart CONTAINER_NAME

    Sustituye CONTAINER_NAME por el nombre que asignaste al contenedor de AlloyDB Omni cuando lo iniciaste.

    Podman

     podman container restart CONTAINER_NAME

    Sustituye CONTAINER_NAME por el nombre que asignaste al contenedor de AlloyDB Omni cuando lo iniciaste.

  4. Defina los valores predeterminados de AlloyDB Omni para otros parámetros de la base de datos del proveedor:

    • max_worker_processes: uno por cada base de datos de proveedor y uno por cada nodo de suscriptor.
    • track_commit_timestamp: se define como on si se requiere la resolución de conflictos de la última o la primera actualización.
  5. Confirma que todos los valores de los parámetros sean relevantes:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -c "
    SELECT name, setting
      FROM pg_catalog.pg_settings
     WHERE name IN ('listen_addresses',
                    'wal_level',
                    'shared_preload_libraries',
                    'max_worker_processes',
                    'max_replication_slots',
                    'max_wal_senders',
                    'track_commit_timestamp')
         ORDER BY name;
    "

Ajustes de la autenticación basada en host en el clúster de suscriptor de AlloyDB Omni

pglogical crea conexiones TCP locales a la base de datos de suscriptor de AlloyDB Omni. Por lo tanto, debes añadir la dirección IP del servidor host del suscriptor al archivo DATA_DIR/pg_hba.conf de AlloyDB Omni.

  1. Añade una entrada de autenticación de confianza para el servidor local, específica de un nuevo usuario de pglogical_replication, al archivo DATA_DIR/pg_hba.conf:

    echo -e "# pglogical entries:
    host all pglogical_replication samehost trust
    " | column -t | sudo tee -a DATA_DIR/pg_hba.conf
  2. Verifica que la entrada sea correcta:

    tail -2 DATA_DIR/pg_hba.conf
  3. Reinicia AlloyDB Omni para que el cambio de autenticación surta efecto:

    docker container restart CONTAINER_NAME

Crea un usuario pglogical en los clústeres de proveedor y de suscriptor

Debes crear un usuario en el clúster del proveedor y en el del suscriptor. pglogical requiere que el usuario tenga los atributos superuser y replication.

  1. En el clúster de proveedor de AlloyDB para PostgreSQL, crea el rol de usuario:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    
  2. (Opcional) Si tu proveedor que no es de AlloyDB es Amazon RDS o Aurora, debes conceder el siguiente rol:

    GRANT rds_superuser TO replication_user;
    

Añadir pglogical y nodos a la base de datos del proveedor que no es AlloyDB

  1. Concede los privilegios necesarios.

    Debes instalar la extensión pglogical en cada base de datos y conceder el permiso usage al usuario de la base de datos pglogical.

    Por ejemplo, si tu base de datos es my_test_db, ejecuta el siguiente comando:

    CREATE EXTENSION IF NOT EXISTS pglogical;
    GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    
  2. Crea un nodo pglogical para las bases de datos del proveedor. El node_name es arbitrario y la cadena dsn debe ser una conexión TCP válida a la misma base de datos.

    Por ejemplo, para la base de datos my_test_db, ejecuta el siguiente comando:

    SELECT pglogical.create_node(node_name := 'provider', dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    

Crear una tabla y añadirla al conjunto de réplicas predeterminado

Crea una tabla y añádela al conjunto de réplicas predeterminado en la base de datos del proveedor que no es AlloyDB.

  1. Crea una tabla de prueba llamada test_table_1 en la base de datos del proveedor:

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. Añade manualmente la tabla de prueba al conjunto de réplicas predeterminado. Puedes crear conjuntos de replicación pglogical personalizados o usar los conjuntos de replicación predeterminados. Se crearon varios conjuntos de réplicas predeterminados, como default, default_insert_only y ddl_sql, al crear la extensión. Puedes añadir tablas y secuencias a los conjuntos de réplicas de forma individual o todas a la vez para un esquema específico.

    -- Add the specified table to the default replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default', relation := 'test_table_1', synchronize_data := TRUE);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
  3. (Opcional) Añade todas las tablas de un esquema especificado, como public:

    -- Add all "public" schema tables to the default replication set:
    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    
    -- Check which tables have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_table;
    
    -- Add all "public" schema sequences to the default replication:
    SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public']);
    
    -- Check which sequences have been added to all replication sets:
    SELECT * FROM pglogical.replication_set_seq;
    
  4. Quita la tabla del conjunto de réplicas default. Si hay alguna tabla en el esquema que no tenga una clave principal o una identidad de réplica, solo se podrán replicar las instrucciones INSERT. Si has añadido esas tablas al conjunto de réplicas default automáticamente mediante la función replication_set_add_all_tables, debes eliminarlas manualmente de ese conjunto de réplicas y añadirlas al conjunto default_insert_only.

    -- Remove the table from the **default** replication set:
    SELECT pglogical.replication_set_remove_table(set_name := 'default', relation := 'test_table_2');
    
    -- Manually add to the **default_insert_only** replication set:
    SELECT pglogical.replication_set_add_table(set_name := 'default_insert_only', relation := 'test_table_2');
    

    Si quiere añadir automáticamente las tablas recién creadas al conjunto de réplicas, añada el activador pglogical_assign_repset como se sugiere en la pglogical fuente.

Copia la base de datos en el clúster suscriptor de AlloyDB Omni

  1. Crea una copia de seguridad solo del esquema de la base de datos de origen con la utilidad pg_dump.

  2. Ejecuta el comando pg_dump desde tu servidor suscriptor de AlloyDB Omni con la dirección IP o el endpoint de tu servidor que no es de AlloyDB.

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. Importa la copia de seguridad en la base de datos de suscriptor del servidor AlloyDB Omni del suscriptor:

    Docker

    docker exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

    Podman

    podman exec -i CONTAINER_NAME psql -h localhost -U postgres < my_test_db.schema-only.sql

De esta forma, se crea la base de datos y el esquema, pero no los datos de las filas. La extensión pglogical replica los datos de la fila. Copia o vuelve a crear manualmente los demás usuarios o roles que necesites.

Crear un nodo y una suscripción en la base de datos de suscriptor de AlloyDB Omni

  1. Crea un nodo en la base de datos suscriptora de AlloyDB Omni. Añade la contraseña a tu dsn si quieres usar la autenticación con contraseña.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_node(node_name := 'subscriber', dsn := 'host=localhost port=5432 dbname=my_test_db user=pglogical_replication');
    "
  2. Crea una suscripción en la base de datos de suscriptor que apunte a la base de datos del proveedor en el servidor del proveedor de AlloyDB Omni.

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT pglogical.create_subscription(subscription_name := 'test_sub_1', provider_dsn := 'host=SERVER_IP_ADDRESS port=5432 dbname=my_test_db user=pglogical_replication password=secret');
    "
  3. En cuestión de segundos o minutos, los datos iniciales se habrán replicado del proveedor al suscriptor:

    Docker

    docker exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Podman

    podman exec CONTAINER_NAME psql -h localhost -U postgres -d my_test_db -c "
    SELECT * FROM test_table_1 ORDER BY 1;
    "

    Las filas adicionales que se añaden a la base de datos del proveedor también se replican en tiempo real en cuestión de segundos.

Consideraciones adicionales sobre la implementación de pglogical

La extensión pglogical tiene muchas funciones avanzadas que no se tratan en este documento. Muchas de estas funciones se pueden aplicar a tu implementación. Puedes tener en cuenta las siguientes funciones avanzadas:

  • Resolución de conflictos
  • Replicación multimaster y bidireccional
  • Inclusión de secuencias
  • Procedimientos de cambio y conmutación por error

Siguientes pasos