Replica datos entre AlloyDB y AlloyDB Omni

En esta página, se proporcionan pasos para replicar datos entre Google Cloud AlloyDB y AlloyDB Omni con la extensión pglogical.

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

Componentes clave de pglogical

Los componentes clave de la extensión pglogical son los siguientes:

  • Nodo: Es la referencia que se proporciona para la base de datos dentro de un clúster de PostgreSQL. La extensión pglogical se instala en cualquier cantidad de bases de datos dentro del clúster y funciona con ellas, y cada una actúa como un nodo pglogical distinto. Cada nodo puede ser un proveedor, también conocido como fuente de replicación, o un suscriptor, también conocido como destino de replicación, o ambos de forma simultánea. Solo se permite un nodo por base de datos.
  • Conjunto de replicación: Se define en la base de datos del proveedor como una agrupación lógica de tablas y secuencias que se migrarán, y las instrucciones SQL, como INSERT, UPDATE, DELETE, TRUNCATE, que se deben replicar. Puedes asignar tablas a más de un conjunto de replicación. De forma predeterminada, se proporcionan tres conjuntos de replicación preconfigurados, como default, default_insert_only y ddl_sql, y puedes agregar cualquier cantidad de conjuntos de replicación adicionales para satisfacer tus necesidades.
  • Suscripción: Proporciona detalles de los cambios que se replican desde las bases de datos del proveedor y 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 a través de una cadena de conexión y, de manera opcional, qué conjuntos de replicación de ese proveedor se deben copiar. Además, también puedes especificar si usar apply delay cuando creas la suscripción.

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

Métodos de autenticación compatibles

Debes considerar las redes y la seguridad entre los nodos de replicación 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 los métodos de autenticación de contraseña y confianza.

El método de autenticación recomendado es la autenticación de confianza porque, 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 que son propiedad de pglogical. 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, puede ver estas contraseñas en texto sin formato.

Si usas el método de autenticación de confianza, debes realizar entradas específicas en el archivo de autenticación basada en host, pg_hba.conf, para obtener la máxima seguridad. Para restringir el acceso, especifica las bases de datos de destino, permite 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 comenzar

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

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

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

Ajusta los parámetros en el proveedor de AlloyDB de Google Cloud

La extensión pglogical requiere un conjunto mínimo de ajustes de parámetros en el clúster de proveedores de AlloyDB deGoogle Cloud . Debes establecer el parámetro wal_level en logical y agregar 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 de AlloyDB de Google Cloud , puedes ajustar los parámetros configurando las marcas de clúster adecuadas.

Debes ajustar los parámetros de las siguientes marcas de AlloyDB de Google Cloud :

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

Para obtener información sobre cómo configurar marcas de base de datos en AlloyDB de Google Cloud, consulta Configura las marcas de base de datos de una instancia.

Para los otros parámetros de la base de datos del nodo del proveedor obligatorios, debes configurar los valores predeterminados de AlloDB de Google Cloud de la siguiente manera:

  • max_worker_processes: Uno por base de datos de proveedor y, al menos, uno por nodo de suscriptor. El estándar para este parámetro es de al menos 10.
  • max_replication_slots: Uno por nodo en los nodos del proveedor.
  • max_wal_senders: Uno por nodo en los nodos del proveedor.
  • track_commit_timestamp: Se establece en on si se requiere que la última o la primera actualización gane la resolución de conflictos.
  • listen_addresses: Debe incluir la dirección IP de AlloyDB Omni o mencionarla a través de un bloque CIDR de cobertura.

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

Ajusta los parámetros en el clúster de suscriptores de AlloyDB Omni

La extensión pglogical también requiere un conjunto mínimo de ajustes de parámetros en el suscriptor de AlloyDB Omni. Debes adjuntar pglogical al parámetro shared_preload_libraries en el archivo DATA_DIR/postgresql.conf. Si alguna base de datos dentro del clúster actúa como una base de datos de proveedor, realiza los cambios de parámetros necesarios para las bases de datos de proveedores.

Reemplaza DATA_DIR por la ruta de acceso 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. Verifica que el parámetro esté configurado correctamente:

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

    Docker

     docker container restart CONTAINER_NAME

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

    Podman

     podman container restart CONTAINER_NAME

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

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

    • max_worker_processes: Uno por base de datos de proveedor y uno por nodo de suscriptor.
    • track_commit_timestamp: Se establece en on si se requiere la resolución de conflictos en la que gana la última o la primera actualización.
  5. Confirma que todos los valores de los parámetros estén configurados 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 autenticación basada en host en el clúster de suscriptores de AlloyDB Omni

pglogical establece conexiones TCP locales con la base de datos de suscriptores de AlloyDB Omni. Por lo tanto, debes agregar la dirección IP del servidor host del suscriptor al archivo DATA_DIR/pg_hba.conf de AlloyDB Omni.

  1. Agrega una entrada de autenticación de confianza para el servidor local, específica para un usuario pglogical_replication nuevo, 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 se aplique el cambio de autenticación:

    Docker

    docker container restart CONTAINER_NAME

    Podman

    podman container restart CONTAINER_NAME

Crea un usuario pglogical en clústeres de proveedores y suscriptores

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

  1. En el clúster del proveedor de AlloyDB de Google Cloud , crea el usuario y otorga 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 suscriptores de AlloyDB Omni, crea el usuario y otorga los atributos replication y superuser:

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

Agrega pglogical y nodos a la base de datos del proveedor de AlloyDB de Google Cloud

  1. Otorga los privilegios necesarios.

    Debes instalar la extensión pglogical en cada base de datos y otorgar el permiso usage al usuario de la base de datos pglogical. En Google Cloud AlloyDB, debes otorgar 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 de Google Cloud :

       \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. node_name es arbitraria y la cadena dsn debe ser una conexión TCP válida a la misma base de datos. Para Google Cloud AlloyDB, la parte del host de dsn es la dirección IP proporcionada para la instancia principal.

    En el caso de Google Cloud AlloyDB, no se permite la autenticación de confianza, y el argumento de contraseña se debe incluir en dsn. maxSurge.

    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');
    

Crea una tabla y agrégala al conjunto de replicación predeterminado

Crea una tabla y agrégala al conjunto de replicación predeterminado en la base de datos del proveedor de AlloyDB de Google Cloud.

  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. Otorga SELECT en las tablas individuales o ejecuta el comando GRANT SELECT ON ALL TABLES. Todas las tablas que formen parte de un conjunto de replicación deben tener permiso de consulta otorgado al usuario de replicación, pglogical_replication.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. Agrega manualmente la tabla de prueba al conjunto de replicación predeterminado. Puedes crear conjuntos de replicación pglogical personalizados o usar los conjuntos de replicación predeterminada. Cuando creaste la extensión, se crearon varios conjuntos de replicación predeterminados, como default, default_insert_only y ddl_sql. Puedes agregar tablas y secuencias a los conjuntos de replicación de forma individual o todas a la vez para un esquema especificado.

    -- 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. Agrega todas las tablas de un esquema especificado, como public (opcional):

    -- 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 replicación default. Si hay tablas en el esquema que no tienen una clave primaria, puedes configurarlas para la replicación de INSERT solo o establecer las columnas que identifican de forma única la fila con la función REPLICA IDENTITY que se usa con el comando ALTER TABLE. Si agregaste esas tablas al conjunto de replicación default automáticamente con la función replication_set_add_all_tables, debes quitarlas de ese conjunto de replicación de forma manual y agregarlas 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');
    

    De forma opcional, si deseas agregar las tablas recién creadas al conjunto de replicación automáticamente, agrega el activador pglogical_assign_repset como se sugiere en la fuente pglogical.

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

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

  2. Ejecuta el comando pg_dump desde el servidor de suscriptores de AlloyDB Omni con la dirección IP de la instancia principal de AlloyDB de la instancia principal de Google Cloud .

    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 a la base de datos del suscriptor en el servidor Omni de AlloyDB 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 errores como alloydbsuperuser not existing. Este rol es específico deGoogle Cloud AlloyDB.

Esto crea la base de datos y el esquema, sin ninguno de los datos de las filas. La extensión pglogical replica los datos de las filas. Copia o vuelve a crear de forma manual cualquier otro usuario o rol que sea necesario.

Crea un nodo y una suscripción en la base de datos de suscriptores de AlloyDB Omni

  1. Crea un nodo en la base de datos de suscriptores 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 de suscriptores que haga referencia a la instancia principal de la base de datos del proveedor deGoogle Cloud AlloyDB.

    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. Según el tamaño de la tabla y los datos que se replicarán, el tiempo de replicación puede variar de segundos a minutos. Después de ese tiempo, los datos iniciales deberían haberse 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 agregan a la base de datos del proveedor también se replican en segundos.

Consideraciones adicionales para 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 considerar las siguientes funciones avanzadas:

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

¿Qué sigue?