PL/Proxy拡張機能を使用すると、ApsaraDB RDS for PostgreSQLインスタンスにCLUSTERまたはCONNECTモードでアクセスできます。
前提条件
RDSインスタンスのメジャーエンジンバージョンは、拡張機能でサポートされています。 詳細については、「ApsaraDB RDS For PostgreSQLでサポートされている拡張機能」をご参照ください。
RDSインスタンスのメジャーエンジンバージョンが要件を満たしているが、拡張機能がまだサポートされていない場合、RDSインスタンスのマイナーエンジンバージョンが更新されます。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
背景情報
PL/Proxy拡張機能は、次のモードをサポートします。
クラスター
このモードは、水平シャーディングとSQLレプリケーションをサポートします。
CONNECT
このモードでは、ApsaraDB RDSが指定されたデータベースにSQLリクエストをルーティングできます。
PL /プロキシ拡張機能の使用方法の詳細については、PL /プロキシをご参照ください。
注意事項
同じ仮想プライベートクラウド (VPC) にあるRDSインスタンス全体でテーブルを直接管理できます。
RDSインスタンスと同じVPCにあるElastic Compute Service (ECS) インスタンスは、RDSインスタンスへのアクセス要求をリダイレクトするためのプロキシとして機能します。 これにより、異なるVPCにあるRDSインスタンス間でテーブルを管理できます。
プロキシノードによって提供されるデータノードの数は、2のn乗でなければならない。
テスト環境
1つのRDSインスタンスをプロキシノードとして選択し、別の2つのRDSインスタンスをデータノードとして選択します。 次の表に、3つのRDSインスタンスの詳細を示します。
IP | ノードタイプ | データベース名 | ユーザー名 |
100.xx.xx.136 | プロキシノード | postgres | postgres |
100.xx.xx.72 | データノード | pl_db0 | postgres |
11.xx.xx.9 | データノード | pl_db1 | postgres |
PL /プロキシ拡張を作成する
次のステートメントを実行して、PL /プロキシ拡張を作成します。
拡張機能を作成するplproxycreate extension plproxy
PL /プロキシクラスターの作成
CONNECTモードを使用する場合は、このセクションで説明する操作をスキップできます。
PL/Proxyクラスターを作成し、クラスター内のデータノードとして接続するRDSインスタンスの名前、IPアドレス、およびポートを指定します。 例:
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(# ); サーバーの作成
作成したPL/Proxyクラスターの権限をpostgresユーザーに付与します。 例:
postgres=# FOREIGNサーバーcluster_srv1の使用をpostgresに許可します。グラント
ユーザーマッピングを作成します。 例:
を作成するpostgres=> postgresサーバーcluster_srv1オプションのユーザーマッピングを作成します (ユーザー 'postgres ') 。ユーザーマッピング
テストテーブルの作成
各データノードにテストテーブルを作成します。 例:
テーブルユーザーの作成 (userid int, name text);
CLUSTERモードのテスト
水平シャーディングをテストするには、次の手順を実行します。
各データノードにデータを挿入する関数を作成します。 例:
pl_db0=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text) pl_db0-> RETURNS整数AS $$ pl_db0$> INSERT INTO users (userid, name) VALUES ($1,$2); pl_db0$> SELECT 1; pl_db0$> $$ LANGUAGE SQL; 関数の作成 pl_db1=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text) pl_db1-> RETURNS整数AS $$ pl_db1$> INSERT INTO users (userid, name) VALUES ($1,$2); pl_db1$> SELECT 1; pl_db1$> $$ LANGUAGE SQL; 関数の作成
プロキシノードにデータを挿入する関数を作成します。 この関数は、各データノードにデータを挿入するために使用される関数と同じ名前を持ちます。 例:
postgres=> CREATE OR REPLACE FUNCTION insert_user(i_id int, i_name text) postgres-> RETURNS整数AS $$ postgres$> CLUSTER 'cluster_srv1'; postgres$> 何でも実行します。postgres$> $$ LANGUAGE plproxy; 関数の作成
プロキシノード上のデータを読み取るために使用される関数を作成します。 例:
postgres=> CREATE OR REPLACE FUNCTION get_user_name() postgres-> RETURNS TABLE(userid int、name text) AS $$ postgres$> CLUSTER 'cluster_srv1'; postgres$> すべて実行します。postgres$> SELECT userid,name FROM users; postgres$> $$ LANGUAGE plproxy; 関数の作成
プロキシノードに10個のテストレコードを挿入します。 例:
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');
各データノードのデータを表示します。 この関数はRUN ON ANYを使用して、データをデータノードにランダムに挿入します。
pl_db0=> select * from users; userid | name ------- --------- 1001 | スヴェン 1003 | スティーブ 1004 | lottu 1005 | rax 1006 | ak 1007 | ジャック 1008 | molica 1009 | pg (8行) pl_db1=> select * from users; userid | name ------- --------- 1002 | マルコ 1010 | oracle (2行)
説明クエリ結果は、10個のデータレコードが2つのデータノード間で不均等に分散していることを示す。
プロキシノードのデータを読み取るために使用される関数を呼び出します。 この関数はRUN ON ANYを使用して、すべてのデータノードからデータを読み取ります。 例:
postgres=> SELECT USERID,NAME FROM GET_USER_NAME(); userid | name ------- --------- 1001 | スヴェン 1003 | スティーブ 1004 | lottu 1005 | rax 1006 | ak 1007 | ジャック 1008 | molica 1009 | pg 1002 | マルコ 1010 | oracle (10行)
SQLレプリケーションをテストするには、次の手順を実行します。
各ノードのusersテーブルを切り捨てるために使用される関数を作成します。 例:
pl_db0=> CREATE OR REPLACE FUNCTION trunc_user() pl_db0-> RETURNS整数AS $$ pl_db0$> テーブルユーザーを切り捨てます。pl_db0$> SELECT 1; pl_db0$> $$ LANGUAGE SQL; 関数の作成 pl_db1=> CREATE OR REPLACE FUNCTION trunc_user() pl_db1-> RETURNS整数AS $$ pl_db1$> テーブルユーザーを切り捨てます。pl_db1$> SELECT 1; pl_db1$> $$ LANGUAGE SQL; 関数の作成 postgres=> CREATE OR REPLACE FUNCTION trunc_user() postgres-> RETURNS SETOF整数AS $$ postgres$> CLUSTER 'cluster_srv1'; postgres$> すべて実行します。postgres$> $$ LANGUAGE plproxy; 関数の作成
プロキシノードのデータを切り捨てるために使用される関数を呼び出します。 例:
postgres=> SELECT TRUNC_USER(); trunc_user ------------ 1 1 (2行)
プロキシノードにデータを挿入する関数を作成します。 例:
postgres=> CREATE OR REPLACE FUNCTION insert_user_2(i_id int, i_nameテキスト) postgres-> RETURNS SETOF整数AS $$ postgres$> CLUSTER 'cluster_srv1'; postgres$> すべて実行します。postgres$> ターゲットinsert_user; postgres$> $$ LANGUAGE plproxy; 関数の作成
4つのテストレコードをプロキシノードに挿入します。 例:
SELECT insert_user_2(1004、'lottu'); SELECT insert_user_2(1005、'rax'); SELECT insert_user_2(1006、'ak'); SELECT insert_user_2(1007、'jack');
各データノードのデータを表示します。 例:
pl_db0=> select * from users; userid | name ------- -------- 1004 | lottu 1005 | rax 1006 | ak 1007 | ジャック (4行) pl_db1=> select * from users; userid | name ------- -------- 1004 | lottu 1005 | rax 1006 | ak 1007 | ジャック (4行)
説明データは各データノードで同じです。 これは、SQLレプリケーションが成功したことを示します。
プロキシノードでデータを照会します。 任意のデータノードからデータをランダムに読み取るには、RUN ON ANYのみを使用する必要があります。 例:
postgres=> CREATE OR REPLACE FUNCTION get_user_name_2() postgres-> RETURNS TABLE(userid int、name text) AS $$ postgres$> CLUSTER 'cluster_srv1'; postgres$> 何でも実行します。postgres$> SELECT userid,name FROM users; postgres$> $$ LANGUAGE plproxy; 関数の作成 postgres=> SELECT USERID,NAME FROM GET_USER_NAME_2(); userid | name ------- -------- 1004 | lottu 1005 | rax 1006 | ak 1007 | ジャック (4行)
CONNECTモードのテスト
CONNECTモードを使用すると、プロキシノードから他のRDSインスタンスにアクセスできます。 例:
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;
関数の作成
postgres=> SELECT USERID,NAME FROM GET_USER_NAME_3();
userid | name
------- --------
1004 | lottu
1005 | rax
1006 | ak
1007 | ジャック
(4行)