全部产品
Search
文档中心

ApsaraDB RDS:Gunakan ekstensi PL/Proxy

更新时间:Jul 06, 2025

Ekstensi PL/Proxy memungkinkan Anda mengakses instance ApsaraDB RDS for PostgreSQL dalam mode CLUSTER atau CONNECT.

Prasyarat

Informasi latar belakang

Ekstensi PL/Proxy mendukung mode berikut:

  • CLUSTER

    Mode ini mendukung sharding horizontal dan replikasi SQL.

  • CONNECT

    Mode ini memungkinkan ApsaraDB RDS untuk merutekan permintaan SQL ke database tertentu.

Untuk informasi lebih lanjut tentang cara menggunakan ekstensi PL/Proxy, kunjungi PL/Proxy.

Tindakan pencegahan

  • Anda dapat langsung mengelola tabel di seluruh instance RDS yang berada di virtual private cloud (VPC) yang sama.

  • Instance Elastic Compute Service (ECS) yang berada di VPC yang sama dengan instance RDS Anda dapat berfungsi sebagai proxy untuk mengarahkan ulang permintaan akses ke instance RDS Anda. Ini memungkinkan Anda mengelola tabel di seluruh instance RDS yang berada di VPC yang berbeda.

  • Jumlah node data yang dilayani oleh node proxy harus merupakan pangkat dua dari n.

Lingkungan pengujian

Pilih instance RDS sebagai node proxy dan dua instance RDS lainnya sebagai node data. Tabel berikut memberikan rincian tentang ketiga instance RDS tersebut.

IP

Tipe Node

Nama Database

Nama Pengguna

100.xx.xx.136

Node proxy

postgres

postgres

100.xx.xx.72

Data Node

pl_db0

postgres

11.xx.xx.9

Node data

pl_db1

postgres

Buat ekstensi PL/Proxy

Eksekusi pernyataan berikut untuk membuat ekstensi PL/Proxy:

create extension plproxy

Buat kluster PL/Proxy

Catatan

Jika Anda menggunakan mode CONNECT, Anda dapat melewati operasi yang dijelaskan dalam bagian ini.

  1. Buat kluster PL/Proxy dan tentukan nama, alamat IP, serta port dari instance RDS yang ingin Anda sambungkan sebagai node data dalam kluster. Contoh:

    postgres=# CREATE SERVER cluster_srv1 FOREIGN DATA WRAPPER plproxy
    postgres-# OPTIONS (
    postgres(#         connection_lifetime '1800',
    postgres(#         disable_binary '1',
    postgres(#         p0 'dbname=pl_db0 host=100.xxx.xxx.72 port=5678',
    postgres(#         p1 'dbname=pl_db1 host=11.xxx.xxx.9 port=5678'
    postgres(#         );
    CREATE SERVER
  2. Berikan izin pada kluster PL/Proxy yang dibuat kepada pengguna postgres. Contoh:

    postgres=# grant usage on FOREIGN server cluster_srv1 to postgres;
    GRANT 
  3. Buat pemetaan pengguna. Contoh:

    postgres=> create user mapping for postgres server cluster_srv1 options (user 'postgres');
    CREATE USER MAPPING

Buat tabel uji

Buat tabel uji pada setiap node data. Contoh:

create table users(userid int, name text);

Uji mode CLUSTER

Untuk menguji sharding horizontal, lakukan langkah-langkah berikut:

  1. Buat fungsi yang digunakan untuk menyisipkan data pada setiap node data. Contoh:

    pl_db0=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text)
    pl_db0-> RETURNS integer AS $$
    pl_db0$>        INSERT INTO users (userid, name) VALUES ($1,$2);
    pl_db0$>        SELECT 1;
    pl_db0$> $$ LANGUAGE SQL;
    CREATE FUNCTION
    
    pl_db1=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text)
    pl_db1-> RETURNS integer AS $$
    pl_db1$>        INSERT INTO users (userid, name) VALUES ($1,$2);
    pl_db1$>        SELECT 1;
    pl_db1$> $$ LANGUAGE SQL;
    CREATE FUNCTION
  2. Buat fungsi yang digunakan untuk menyisipkan data pada node proxy. Fungsi ini memiliki nama yang sama dengan fungsi yang digunakan untuk menyisipkan data pada setiap node data. Contoh:

    postgres=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text)
    postgres-> RETURNS integer AS $$
    postgres$>     CLUSTER 'cluster_srv1';
    postgres$>     RUN ON ANY;
    postgres$> $$ LANGUAGE plproxy;
    CREATE FUNCTION
  3. Buat fungsi yang digunakan untuk membaca data pada node proxy. Contoh:

    postgres=> CREATE OR REPLACE FUNCTION get_user_name()
    postgres-> RETURNS TABLE(userid int, name text) AS $$
    postgres$>     CLUSTER 'cluster_srv1';
    postgres$>     RUN ON ALL ;
    postgres$> SELECT userid,name FROM users;
    postgres$> $$ LANGUAGE plproxy;
    CREATE FUNCTION
  4. Sisipkan 10 catatan uji pada node proxy. Contoh:

    SELECT insert_user(1001, 'Sven');
    SELECT insert_user(1002, 'Marko');
    SELECT insert_user(1003, 'Steve');
    SELECT insert_user(1004, 'lottu');
    SELECT insert_user(1005, 'rax');
    SELECT insert_user(1006, 'ak');
    SELECT insert_user(1007, 'jack');
    SELECT insert_user(1008, 'molica');
    SELECT insert_user(1009, 'pg');
    SELECT insert_user(1010, 'oracle');
  5. Lihat data pada setiap node data. Fungsi menggunakan RUN ON ANY untuk secara acak menyisipkan data ke dalam node data.

    pl_db0=> select * from users;
     userid |  name
    --------+--------
       1001 | Sven
       1003 | Steve
       1004 | lottu
       1005 | rax
       1006 | ak
       1007 | jack
       1008 | molica
       1009 | pg
    (8 rows)
    
    pl_db1=> select * from users;
     userid |  name
    --------+--------
       1002 | Marko
       1010 | oracle
    (2 rows)
    Catatan

    Hasil kueri menunjukkan bahwa 10 catatan data didistribusikan secara tidak merata antara dua node data.

  6. Panggil fungsi yang digunakan untuk membaca data pada node proxy. Fungsi menggunakan RUN ON ANY untuk membaca data dari semua node data. Contoh:

    postgres=> SELECT USERID,NAME FROM GET_USER_NAME();
     userid |  name
    --------+--------
       1001 | Sven
       1003 | Steve
       1004 | lottu
       1005 | rax
       1006 | ak
       1007 | jack
       1008 | molica
       1009 | pg
       1002 | Marko
       1010 | oracle
    (10 rows)

Untuk menguji replikasi SQL, lakukan langkah-langkah berikut:

  1. Buat fungsi yang digunakan untuk memotong tabel users pada setiap node. Contoh:

    pl_db0=> CREATE OR REPLACE FUNCTION trunc_user()
    pl_db0-> RETURNS integer AS $$
    pl_db0$>        truncate table users;
    pl_db0$>        SELECT 1;
    pl_db0$> $$ LANGUAGE SQL;
    CREATE FUNCTION
    
    pl_db1=> CREATE OR REPLACE FUNCTION trunc_user()
    pl_db1-> RETURNS integer AS $$
    pl_db1$>        truncate table users;
    pl_db1$>        SELECT 1;
    pl_db1$> $$ LANGUAGE SQL;
    CREATE FUNCTION
    
    postgres=> CREATE OR REPLACE FUNCTION trunc_user()
    postgres-> RETURNS SETOF integer AS $$
    postgres$>     CLUSTER 'cluster_srv1';
    postgres$>     RUN ON ALL;
    postgres$> $$ LANGUAGE plproxy;
    CREATE FUNCTION
  2. Panggil fungsi yang digunakan untuk memotong data pada node proxy. Contoh:

    postgres=> SELECT TRUNC_USER();
     trunc_user
    ------------
              1
              1
    (2 rows)
  3. Buat fungsi yang digunakan untuk menyisipkan data pada node proxy. Contoh:

    postgres=> CREATE OR REPLACE FUNCTION insert_user_2(i_id int, i_name text)
    postgres-> RETURNS SETOF integer AS $$
    postgres$>     CLUSTER 'cluster_srv1';
    postgres$>     RUN ON ALL;
    postgres$> TARGET insert_user;
    postgres$> $$ LANGUAGE plproxy;
    CREATE FUNCTION
  4. Sisipkan empat catatan uji ke dalam node proxy. Contoh:

    SELECT insert_user_2(1004, 'lottu');
    SELECT insert_user_2(1005, 'rax');
    SELECT insert_user_2(1006, 'ak');
    SELECT insert_user_2(1007, 'jack');
  5. Lihat data pada setiap node data. Contoh:

    pl_db0=> select * from users;
     userid | name
    --------+-------
       1004 | lottu
       1005 | rax
       1006 | ak
       1007 | jack
    (4 rows)
    
    pl_db1=> select * from users;
     userid | name
    --------+-------
       1004 | lottu
       1005 | rax
       1006 | ak
       1007 | jack
    (4 rows)
    Catatan

    Data sama pada setiap node data. Ini menunjukkan bahwa replikasi SQL berhasil.

  6. Kueri data pada node proxy. Anda hanya perlu menggunakan RUN ON ANY untuk membaca data secara acak dari node data mana pun. Contoh:

    postgres=> CREATE OR REPLACE FUNCTION get_user_name_2()
    postgres-> RETURNS TABLE(userid int, name text) AS $$
    postgres$>     CLUSTER 'cluster_srv1';
    postgres$>     RUN ON ANY ;
    postgres$> SELECT userid,name FROM users;
    postgres$> $$ LANGUAGE plproxy;
    CREATE FUNCTION
    
    postgres=> SELECT USERID,NAME FROM GET_USER_NAME_2();
     userid | name
    --------+-------
       1004 | lottu
       1005 | rax
       1006 | ak
       1007 | jack
    (4 rows)

Uji mode CONNECT

Saat menggunakan mode CONNECT, Anda dapat mengakses instance RDS lainnya dari node proxy. Contoh:

postgres=> CREATE OR REPLACE FUNCTION get_user_name_3()
postgres-> RETURNS TABLE(userid int, name text) AS $$
postgres$>     CONNECT 'dbname=pl_db0 host=100.81.137.72 port=56789';
postgres$> SELECT userid,name FROM users;
postgres$> $$ LANGUAGE plproxy;
CREATE FUNCTION

postgres=> SELECT USERID,NAME FROM GET_USER_NAME_3();
 userid | name
--------+-------
   1004 | lottu
   1005 | rax
   1006 | ak
   1007 | jack
(4 rows)