利用者は、各ノードで重複しないように範囲を決めた順序を作成することで、各ノードに作成した順序からノード間で一意なシーケンス番号を取得できます。一意なシーケンス番号は、シャーディングと組み合わせることで、ノード間で行を一意なものにできます。
例えば、データノードが2つの場合、以下のように作成します。
-- datanode1のシーケンス番号を0から10000の範囲で作成します CREATE SEQUENCE id_seq MINVALUE 0 MAXVALUE 10000; -- datanode2のシーケンス番号を10001から20000の範囲で作成します CREATE SEQUENCE id_seq MINVALUE 10001 MAXVALUE 20000;
作成した順序はシャーディングと組み合わせることによって、ノード間で一意なidを付与できます。
-- 接続ルーティングでdatanode1のshard1に存在するt_shard1を更新します INSERT INTO t_shard1(id, balance) VALUES(nextval('id_seq'), 1000); -- 接続ルーティングでdatanode2のshard2に存在するt_shard2を更新します INSERT INTO t_shard2(id, balance) VALUES(nextval('id_seq'), 2000); -- 中央管理ノードから上記テーブルの親テーブルを参照すると、 -- 異なるノード間でもid列の値が一意になります SELECT * FROM t; id | balance -------+--------- 0 | 1000 10001 | 2000 (2 rows)
また、以下のように各データノードの子テーブルに順序を紐付けることで連番型のようにカラムを定義することもできます。
-- 中央管理ノードでシャード表を作成します SET pgx_ddl_target_node = 'ALLNODES'; CREATE TABLE order1 (customer_id INT, order_id INT) PARTITION BY RANGE(customer_id); RESET pgx_ddl_target_node; CREATE TABLE order1_customer_1_99 PARTITION OF order1 FOR VALUES FROM (1) TO (100) TABLESPACE tblspc_shard1; -- datanode1で順序を作成し、order1_customer_1_99に紐付けます。 CREATE SEQUENCE order1_customer_1_99_order_id_seq START 1 RESTART 1 MINVALUE 1 MAXVALUE 100000 OWNED BY order1_customer_1_99.customer_id; ALTER TABLE order1_customer_1_99 ALTER COLUMN order_id SET DEFAULT nextval('order1_customer_1_99_order_id_seq');
上記の例では中央管理ノード上にデータを持っていない場合について説明しましたが、中央管理ノードにもデータを保持する場合、連番型を使用することができます。中央管理ノードを経由した場合、中央管理ノード上の順序が参照され、データノードを直接、参照した場合、データノード上の順序が参照されるため、どのノードの順序が参照されるか注意して使用してください。
-- 中央管理ノードでシャード表と子テーブルを作成します SET pgx_ddl_target_node = 'ALLNODES'; CREATE TABLE order2 (customer_id INT, order_id SERIAL) PARTITION BY RANGE(customer_id); RESET pgx_ddl_target_node; CREATE TABLE order2_customer_1_99 PARTITION OF order2 FOR VALUES FROM (1) TO (100); CREATE TABLE order2_customer_100_199 PARTITION OF order2 FOR VALUES FROM (100) TO (200) TABLESPACE tblspc_shard1; -- 中央管理ノードの子テーブルに紐付いた順序の範囲を変更します -- psqlの場合、\d table_nameのDefaultの列から該当する順序を見つけることができます ALTER SEQUENCE order2_customer_order_id_seq START 1 RESTART 1 MINVALUE 1 MAXVALUE 200; -- datanode1に作成した子テーブルに紐づく順序の範囲を変更します ALTER SEQUENCE order2_customer_order_id_seq START 201 RESTART 201 MINVALUE 201 MAXVALUE 400;
なお、スケールアウトではPostgreSQLが提供している順序に関する機能を使用します。スケールアウト環境で順序に関する機能で制限はありません。