Ekstensi PL/Proxy memungkinkan Anda mengakses instance ApsaraDB RDS for PostgreSQL dalam mode CLUSTER atau CONNECT.
Prasyarat
Versi mesin utama dari instance RDS harus didukung oleh ekstensi. Untuk informasi lebih lanjut, lihat Ekstensi yang Didukung oleh ApsaraDB RDS for PostgreSQL.
Versi mesin minor dari instance RDS harus diperbarui jika versi mesin utama memenuhi persyaratan tetapi ekstensi masih tidak didukung. Untuk informasi lebih lanjut, lihat Perbarui Versi Mesin Minor.
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 plproxyBuat kluster PL/Proxy
Jika Anda menggunakan mode CONNECT, Anda dapat melewati operasi yang dijelaskan dalam bagian ini.
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 SERVERBerikan izin pada kluster PL/Proxy yang dibuat kepada pengguna postgres. Contoh:
postgres=# grant usage on FOREIGN server cluster_srv1 to postgres; GRANTBuat 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:
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 FUNCTIONBuat 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 FUNCTIONBuat 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 FUNCTIONSisipkan 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');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)CatatanHasil kueri menunjukkan bahwa 10 catatan data didistribusikan secara tidak merata antara dua node data.
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:
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 FUNCTIONPanggil fungsi yang digunakan untuk memotong data pada node proxy. Contoh:
postgres=> SELECT TRUNC_USER(); trunc_user ------------ 1 1 (2 rows)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 FUNCTIONSisipkan 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');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)CatatanData sama pada setiap node data. Ini menunjukkan bahwa replikasi SQL berhasil.
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)