Mereplikasi data antara AlloyDB dan AlloyDB Omni

Halaman ini memberikan langkah-langkah untuk mereplikasi data antara Google Cloud AlloyDB dan AlloyDB Omni menggunakan ekstensi pglogical.

Untuk ringkasan pglogical di AlloyDB Omni, manfaatnya, dan batasannya, lihat Tentang ekstensi pglogical.

Komponen utama pglogical

Komponen utama ekstensi pglogical adalah sebagai berikut:

  • Node: referensi yang diberikan untuk database dalam cluster PostgreSQL. Ekstensi pglogical diinstal ke dalam, dan berfungsi untuk sejumlah database dalam cluster, dan setiap node bertindak sebagai node pglogical yang berbeda. Setiap node dapat berupa penyedia yang juga dikenal sebagai sumber replika atau pelanggan yang juga dikenal sebagai target replika, atau keduanya secara bersamaan. Hanya satu node yang diizinkan per database.
  • Set replikasi: ditentukan dalam database penyedia sebagai pengelompokan logis tabel dan urutan yang akan dimigrasikan, dan pernyataan SQL seperti INSERT, UPDATE, DELETE, TRUNCATE yang perlu direplikasi. Anda dapat menetapkan tabel ke lebih dari satu set replika. Secara default, tiga set replikasi yang telah dikonfigurasi sebelumnya seperti default, default_insert_only, dan ddl_sql disediakan, dan Anda dapat menambahkan sejumlah set replikasi tambahan untuk memenuhi kebutuhan Anda.
  • Langganan: memberikan detail perubahan yang direplikasi dari database penyedia dan perubahan yang direplikasi dari database penyedia, di database pelanggan. Langganan menentukan database penyedia melalui string koneksi, dan secara opsional, set replika mana dari penyedia tersebut yang akan disalin. Selain itu, Anda juga dapat menentukan apakah akan menggunakan apply delay saat membuat langganan.

Dalam deployment ini, layanan AlloyDB Google Cloud adalah penyedia dan AlloyDB Omni on-premise adalah pelanggan. Perhatikan bahwa konfigurasi sebaliknya juga dapat dilakukan.

Metode autentikasi yang didukung

Anda harus mempertimbangkan jaringan dan keamanan di antara node replikasi sebelum menerapkan ekstensi pglogical di AlloyDB Omni. Dua metode autentikasi utama yang digunakan dengan ekstensi pglogical adalah metode autentikasi sandi dan kepercayaan.

Metode autentikasi yang direkomendasikan adalah autentikasi kepercayaan karena dalam metode autentikasi sandi, sandi disimpan dalam format teks biasa di tabel database yang dimiliki oleh pglogical. Sandi ini dapat dilihat dalam teks biasa oleh siapa saja yang memiliki izin database untuk membuat kueri tabel ini, dalam pencadangan non-biner, dan dalam file log PostgreSQL.

Jika menggunakan metode autentikasi kepercayaan, Anda harus membuat entri tertentu dalam file autentikasi berbasis host, pg_hba.conf untuk keamanan maksimum. Anda dapat membatasi akses dengan menentukan database target, hanya mengizinkan opsi replikasi atau database tertentu, pengguna replikasi, dan hanya dari alamat IP tertentu pelanggan.

Sebelum memulai

Anda dapat menginstal pglogical sebagai ekstensi dalam database tertentu.

Sebelum menerapkan ekstensi pglogical di AlloyDB Omni, pastikan Anda memenuhi persyaratan sistem berikut:

  • Cluster AlloyDB Google Cloud , dan akses baca/tulis ke instance utama sebagai Admin AlloyDB Cloud. Untuk mengetahui petunjuk cara menyediakan cluster AlloyDB Google Cloud , lihat Membuat dan terhubung ke database.
  • Server AlloyDB Omni, yang diinstal dan dikonfigurasi. Untuk mengetahui petunjuk cara menginstal AlloyDB Omni, lihat Menginstal AlloyDB Omni.
  • Alamat IP untuk instance utama Google Cloud AlloyDB dan server host AlloyDB Omni.
  • Jaringan yang telah dibuat dan aman antara Google Cloud AlloyDB dan server host AlloyDB Omni. Konektivitas TCP di port PostgreSQL standar 5432 diperlukan.

Menyesuaikan parameter di penyedia AlloyDB Google Cloud

Ekstensi pglogical memerlukan serangkaian penyesuaian parameter minimal di cluster penyedia AlloyDBGoogle Cloud . Anda harus menetapkan parameter wal_level ke logical, dan menambahkan pglogical ke parameter shared_preload_libraries dalam file 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

Di layanan AlloyDB Google Cloud , Anda dapat menyesuaikan parameter dengan menetapkan flag cluster yang sesuai.

Anda harus menyesuaikan parameter untuk flag AlloyDB Google Cloud berikut:

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

Untuk mengetahui informasi tentang cara menetapkan flag database di Google Cloud AlloyDB, lihat Mengonfigurasi flag database instance.

Untuk parameter database node penyedia lainnya yang diperlukan, Anda harus menetapkan nilai default AlloDBGoogle Cloud sebagai berikut:

  • max_worker_processes: satu per database penyedia dan minimal satu per node pelanggan. Setidaknya 10 adalah standar untuk parameter ini.
  • max_replication_slots: satu per node di node penyedia.
  • max_wal_senders: satu per node di node penyedia.
  • track_commit_timestamp: ditetapkan ke on jika pembaruan terakhir atau pertama memenangkan resolusi konflik diperlukan.
  • listen_addresses: harus menyertakan alamat IP AlloyDB Omni atau menyebutkannya melalui blok CIDR yang mencakup.

Anda dapat memeriksa parameter ini menggunakan alat kueri apa pun, seperti psql.

Menyesuaikan parameter di cluster pelanggan AlloyDB Omni

Ekstensi pglogical juga memerlukan serangkaian penyesuaian parameter minimum pada pelanggan AlloyDB Omni. Anda harus menambahkan pglogical ke parameter shared_preload_libraries dalam file DATA_DIR/postgresql.conf. Jika ada database dalam cluster yang bertindak sebagai database penyedia, buat perubahan parameter yang diperlukan untuk database penyedia.

Ganti DATA_DIR dengan jalur sistem file ke direktori data Anda—misalnya, /home/$USER/alloydb-data.

  1. Sesuaikan parameter:

    sudo sed -r -i "s|(shared_preload_libraries\s*=\s*)'(.*)'.*$|\1'\2,pglogical'|" DATA_DIR/postgresql.conf
  2. Pastikan parameter ditetapkan dengan benar:

    grep -iE 'shared_preload_libraries' DATA_DIR/postgresql.conf
  3. Mulai ulang AlloyDB Omni agar perubahan parameter diterapkan:

    Docker

     docker container restart CONTAINER_NAME

    Ganti CONTAINER_NAME dengan nama yang Anda tetapkan ke penampung AlloyDB Omni saat menginstalnya.

    Podman

     podman container restart CONTAINER_NAME

    Ganti CONTAINER_NAME dengan nama yang Anda tetapkan ke penampung AlloyDB Omni saat menginstalnya.

  4. Tetapkan nilai default AlloyDB Omni untuk parameter database penyedia lainnya:

    • max_worker_processes: Satu per database penyedia dan satu per node pelanggan.
    • track_commit_timestamp: Tetapkan ke on jika pembaruan terakhir atau pertama yang menang, resolusi konflik diperlukan.
  5. Pastikan semua nilai parameter ditetapkan dengan benar:

    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;"

Penyesuaian autentikasi berbasis host ke cluster pelanggan AlloyDB Omni

pglogical membuat koneksi TCP lokal ke database pelanggan AlloyDB Omni. Oleh karena itu, Anda harus menambahkan alamat IP server host pelanggan ke file DATA_DIR/pg_hba.conf AlloyDB Omni.

  1. Tambahkan entri autentikasi kepercayaan untuk server lokal, khusus untuk pengguna pglogical_replication baru, ke file 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. Pastikan entri sudah benar:

    tail -2 DATA_DIR/pg_hba.conf
  3. Mulai ulang AlloyDB Omni agar perubahan autentikasi diterapkan:

    Docker

    docker container restart CONTAINER_NAME

    Podman

    podman container restart CONTAINER_NAME

Membuat pengguna pglogical di cluster penyedia dan pelanggan

Anda harus membuat pengguna baru di cluster penyedia dan pelanggan. pglogical mengharuskan pengguna memiliki izin superuser dan replication.

  1. Di cluster penyedia AlloyDB Google Cloud , buat pengguna dan berikan peran alloydbsuperuser:

    CREATE USER pglogical_replication LOGIN PASSWORD 'secret';
    ALTER USER pglogical_replication WITH replication;
    GRANT alloydbsuperuser TO pglogical_replication;
    
  2. Di cluster pelanggan AlloyDB Omni, buat pengguna dan berikan atribut replication dan superuser:

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

Menambahkan pglogical dan node ke database penyedia AlloyDB Google Cloud

  1. Berikan hak istimewa yang diperlukan.

    Anda harus menginstal ekstensi pglogical di setiap database dan memberikan izin usage kepada pengguna database pglogical. Di Google Cloud AlloyDB, Anda harus memberikan hak istimewa pada skema pglogical.

    Misalnya, jika database Anda adalah my_test_db, jalankan perintah berikut terhadap database penyedia AlloyDB 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. Buat node pglogical untuk database penyedia. node_name bersifat arbitrer dan string dsn harus berupa koneksi TCP yang valid kembali ke database yang sama. Untuk Google Cloud AlloyDB, bagian host dari dsn adalah alamat IP yang disediakan untuk instance utama.

    Untuk Google Cloud AlloyDB, autentikasi kepercayaan tidak diizinkan, dan argumen sandi harus disertakan dalam dsn. parameter.

    Misalnya, untuk database my_test_db, jalankan perintah berikut:

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

Membuat tabel dan menambahkannya ke kumpulan replikasi default

Buat tabel dan tambahkan ke set replikasi default di database penyedia AlloyDB Google Cloud.

  1. Buat tabel pengujian bernama test_table_1 di database penyedia:

    CREATE TABLE test_table_1 (col1 INT PRIMARY KEY);
    INSERT INTO test_table_1 VALUES (1),(2),(3);
    
  2. Berikan SELECT di setiap tabel atau jalankan perintah GRANT SELECT ON ALL TABLES. Setiap tabel yang akan menjadi bagian dari set replikasi harus memiliki izin kueri yang diberikan kepada pengguna replikasi, pglogical_replication.

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO pglogical_replication;
    
  3. Tambahkan tabel pengujian secara manual ke set replikasi default. Anda dapat membuat set replikasi pglogical kustom, atau menggunakan set replikasi default. Beberapa set replika default seperti default, default_insert_only, dan ddl_sql dibuat saat Anda membuat ekstensi. Anda dapat menambahkan tabel dan urutan ke set replika satu per satu, atau sekaligus untuk skema tertentu.

    -- 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. (Opsional) Tambahkan semua tabel dalam skema yang ditentukan, seperti 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. Hapus tabel dari kumpulan replikasi default. Jika ada tabel dalam skema yang tidak memiliki kunci utama, Anda dapat menyiapkannya untuk replikasi khusus INSERT atau menetapkan kolom yang secara unik mengidentifikasi baris menggunakan fitur REPLICA IDENTITY yang digunakan dengan perintah ALTER TABLE. Jika Anda telah menambahkan tabel tersebut ke set replikasi default secara otomatis menggunakan fungsi replication_set_add_all_tables, Anda harus menghapusnya secara manual dari set replikasi tersebut dan menambahkannya ke set 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');
    

    Secara opsional, jika Anda ingin menambahkan tabel yang baru dibuat ke replika yang ditetapkan secara otomatis, tambahkan pemicu pglogical_assign_repset seperti yang disarankan di sumber pglogical.

Menyalin database ke cluster pelanggan AlloyDB Omni

  1. Buat cadangan khusus skema database sumber menggunakan utilitas pg_dump.

  2. Jalankan perintah pg_dump dari server pelanggan AlloyDB Omni menggunakan alamat IP instance utama AlloyDB Google Cloud .

    pg_dump -h SERVER_IP_ADDRESS -U postgres --create --schema-only my_test_db > my_test_db.schema-only.sql
  3. Impor cadangan ke database pelanggan di server AlloyDB Omni pelanggan:

    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

Abaikan error seperti alloydbsuperuser not existing. Peran ini khusus untuk Google Cloud AlloyDB.

Tindakan ini akan membuat database dan skema, tanpa data baris apa pun. Data baris direplikasi oleh ekstensi pglogical. Salin atau buat ulang pengguna atau peran lain yang diperlukan secara manual.

Membuat node dan langganan di database pelanggan AlloyDB Omni

  1. Buat node di database pelanggan 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. Buat langganan di database pelanggan, yang mengarah kembali ke instance utama database penyedia AlloyDB diGoogle Cloud .

    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. Berdasarkan ukuran tabel dan data yang akan direplikasi, waktu replikasi dapat bervariasi dari detik hingga menit. Setelah itu, data awal akan direplikasi dari penyedia ke pelanggan:

    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;"

    Baris tambahan yang ditambahkan ke database penyedia juga direplikasi dalam hitungan detik.

Pertimbangan deployment pglogical tambahan

Ekstensi pglogical memiliki banyak fitur lanjutan yang tidak dibahas dalam dokumen ini. Banyak fitur ini berlaku untuk penerapan Anda. Anda dapat mempertimbangkan fitur lanjutan berikut:

  • Penyelesaian konflik
  • Replikasi multimaster dan dua arah
  • Penyertaan urutan
  • Prosedur peralihan dan failover

Langkah selanjutnya