Replicar datos entre AlloyDB para PostgreSQL y AlloyDB Omni

Selecciona una versión de la documentación:

En esta página se describen los pasos para replicar datos entre AlloyDB para PostgreSQL y AlloyDB Omni mediante la extensión pglogical.

Para obtener una descripción general de pglogical en AlloyDB Omni, sus ventajas y limitaciones, consulta Acerca de la extensión pglogical.

Componentes clave de pglogical

Estos son los componentes clave de la extensión pglogical:

  • Nodo: referencia asignada a la base de datos dentro de un clúster de PostgreSQL. La extensión pglogical se instala en cualquier número de bases de datos del clúster y funciona con ellas. Cada una actúa como un nodo pglogical independiente. Cada nodo puede ser un proveedor (también conocido como origen de replicación), un suscriptor (también conocido como destino de replicación) o ambos al mismo tiempo. Solo se permite un nodo por base de datos.
  • Conjunto de réplicas: se define en la base de datos de proveedor como una agrupación lógica de tablas y secuencias que se van a migrar, así como las instrucciones SQL, como INSERT, UPDATE, DELETE, TRUNCATE, que se deben replicar. Puedes asignar tablas a más de un conjunto de réplicas. De forma predeterminada, se proporcionan tres conjuntos de réplicas preconfigurados, como default, default_insert_only y ddl_sql, y puedes añadir el número de conjuntos de réplicas que necesites.
  • Suscripción: proporciona detalles de los cambios que se replican desde las bases de datos del proveedor y de los cambios que se replican desde las bases de datos del proveedor en la base de datos del suscriptor. La suscripción especifica la base de datos del proveedor mediante una cadena de conexión y, opcionalmente, qué conjuntos de réplicas de ese proveedor se deben copiar. Además, también puedes especificar si quieres usar apply delay cuando crees la suscripción.

En esta implementación, el servicio AlloyDB para PostgreSQL es el proveedor y la instancia local de AlloyDB Omni es el suscriptor. Ten en cuenta que también es posible la configuración opuesta.

Métodos de autenticación admitidos

Debes tener en cuenta la red y la seguridad entre los nodos de réplica antes de implementar la extensión pglogical en AlloyDB Omni. 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 la autenticación de confianza, ya que, en el método de autenticación con contraseña, las contraseñas se almacenan en formato de texto sin formato en tablas de bases de datos propiedad de pglogical. Estas contraseñas están visibles en texto sin formato para cualquier persona que tenga permisos de base de datos para consultar estas tablas, en copias de seguridad no binarias y en los archivos de registro de PostgreSQL.

Si utilizas el método de autenticación de confianza, debes crear entradas específicas en el archivo de autenticación basada en host, pg_hba.conf, para maximizar la seguridad. Puedes restringir el acceso especificando las bases de datos de destino, permitiendo solo la opción de replicación o bases de datos específicas, el usuario de replicación y solo desde la dirección IP específica del suscriptor.

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:

  • Un clúster de AlloyDB para PostgreSQL y acceso de lectura/escritura a la instancia principal como administrador de AlloyDB para PostgreSQL. Para obtener instrucciones sobre cómo aprovisionar un clúster de AlloyDB para PostgreSQL, consulta el artículo Crear una base de datos de AlloyDB para PostgreSQL y conectarse a ella.
  • Un servidor AlloyDB Omni instalado y configurado. Para obtener instrucciones sobre cómo instalar AlloyDB Omni, consulta el artículo Instalar AlloyDB Omni.
  • Las direcciones IP de la instancia principal de AlloyDB para PostgreSQL y del servidor host de AlloyDB Omni.
  • Una red establecida y segura entre AlloyDB para PostgreSQL y el servidor host de AlloyDB Omni. Se necesita conectividad TCP en el puerto estándar de PostgreSQL, el 5432.

Ajustar parámetros en el proveedor de AlloyDB para PostgreSQL

La extensión pglogical requiere un conjunto mínimo de ajustes de parámetros en el clúster de proveedor de AlloyDB para PostgreSQL. Debe asignar el valor logical al parámetro wal_level y añadir pglogical al parámetro shared_preload_libraries en el archivo postgresql.conf.

   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

En el servicio AlloyDB para PostgreSQL, puedes ajustar los parámetros configurando las marcas de clúster adecuadas.

Debes ajustar los parámetros de las siguientes marcas de AlloyDB para PostgreSQL:

  • alloydb.enable_pglogical = on
  • alloydb.logical_decoding = on

Para obtener información sobre cómo definir marcas de base de datos en AlloyDB para PostgreSQL, consulta Configurar las marcas de base de datos de una instancia.

En el caso de los demás parámetros de base de datos de nodos de proveedor obligatorios, debes definir los valores predeterminados de AlloyDB para PostgreSQL de la siguiente manera:

  • 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.

Puedes comprobar estos parámetros con cualquier herramienta de consulta, como psql.

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

La extensión pglogicaltambién requiere un conjunto mínimo de ajustes de parámetros en el 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.

Sustituye DATA_DIR por la ruta del sistema de archivos a tu directorio de datos (por ejemplo, /home/$USER/alloydb-data).

  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 instalaste.

    Podman

     podman container restart CONTAINER_NAME

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

  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 asigna el valor 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 se han definido correctamente:

    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

    docker container restart CONTAINER_NAME

    Podman

    podman container restart CONTAINER_NAME

Crear un usuario pglogical en 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 permisos superuser y replication.

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

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    GRANT alloydbsuperuser TO pglogical_replication;
    
  2. En el clúster de suscriptor de AlloyDB Omni, crea el usuario y concede los atributos replication y superuser:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    ALTER USER pglogical_replication WITH superuser;
    

Añadir pglogical y nodos a la base de datos del proveedor de AlloyDB para PostgreSQL

  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. En AlloyDB para PostgreSQL, debes conceder privilegios en el esquema pglogical.

    Por ejemplo, si tu base de datos es my_test_db, ejecuta el siguiente comando en la base de datos del proveedor de AlloyDB para PostgreSQL:

       \c my_test_db;
     CREATE EXTENSION IF NOT EXISTS pglogical;
     GRANT usage ON SCHEMA pglogical TO pglogical_replication;
    -- For Google Cloud AlloyDB we also need to manually grant privileges:
     GRANT ALL PRIVILEGES ON ALL tables IN 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. En AlloyDB para PostgreSQL, la parte del host de dsn es la dirección IP proporcionada para la instancia principal.

    En AlloyDB para PostgreSQL, no se permite la autenticación de confianza y el argumento de contraseña debe incluirse en dsn. parámetro.

    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 de proveedor de AlloyDB para PostgreSQL.

  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. Concede el permiso SELECT en las tablas concretas o ejecuta el comando GRANT SELECT ON ALL TABLES. Todas las tablas que vayan a formar parte de un conjunto de réplicas deben tener el permiso de consulta concedido al usuario de réplica, pglogical_replication.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. Añade manualmente la tabla de prueba al conjunto de réplicas predeterminado. Puedes crear conjuntos de réplicas pglogical personalizados o usar los conjuntos de réplicas predeterminados. Cuando creaste la extensión, se crearon varios conjuntos de réplicas predeterminados, como default, default_insert_only y ddl_sql. 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;
    
  4. (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;
    
  5. Quita la tabla del conjunto de réplicas default. Si hay alguna tabla en el esquema que no tenga una clave principal, puede configurarla para que solo se replique INSERT o definir las columnas que identifican de forma única la fila mediante la función REPLICA IDENTITY que se usa con el comando ALTER TABLE. 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 de la instancia principal de AlloyDB para PostgreSQL.

    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

Ignora los errores, como alloydbsuperuser not existing. Este rol es específico de AlloyDB para PostgreSQL.

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:

    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 suscriptora que apunte a la instancia principal de la base de datos de proveedor de AlloyDB para PostgreSQL.

    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 función del tamaño de la tabla y de los datos que se van a replicar, el tiempo de replicación puede variar de segundos a minutos. Después, 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 cuestión de segundos.

Consideraciones adicionales sobre la implementación de pglogical

La extensión pglogical tiene muchas funciones avanzadas que no se explican en este documento. Muchas de estas funciones se pueden aplicar a tu implementación. Puedes probar 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