本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
處理主動-主動式複寫中的序列
具有 pgactive
延伸模組的 RDS for PostgreSQL 資料庫執行個體使用兩種不同的序列機制來產生唯一值。
全域序列
若要使用全域序列,請使用 CREATE SEQUENCE
陳述式建立本機序列。不要使用 usingnextval(seqname)
,而是使用 pgactive.pgactive_snowflake_id_nextval(seqname)
來取得序列中的下一個唯一值。
下列範例會建立全域序列:
app=>
CREATE TABLE gstest ( id bigint primary key, parrot text );
app=>
CREATE SEQUENCE gstest_id_seq OWNED BY gstest.id;
app=>
ALTER TABLE gstest \ ALTER COLUMN id SET DEFAULT \ pgactive.pgactive_snowflake_id_nextval('gstest_id_seq');
分割序列
在拆分步驟或分割序列中,每個節點上會使用標準 PostgreSQL 序列。每個序列會以相同的量遞增,並從不同的偏移量開始。例如,若是步進 100,節點 1 會產生序列為 101、201、301,依此類推,而節點 2 會產生序列為 102、202、302,依此類推。即使節點無法長時間通訊,此結構仍能正常運作,但是設計人員必須在建立結構描述時指定最大節點數,並且需要每個節點的組態。若發生錯誤,便容易導致序列重疊。
透過在節點上建立所需的序列來對 pgactive
設定此方法相對較為簡單,如下所示:
CREATE TABLE some_table (generated_value bigint primary key);
app=>
CREATE SEQUENCE some_seq INCREMENT 100 OWNED BY some_table.generated_value;
app=>
ALTER TABLE some_table ALTER COLUMN generated_value SET DEFAULT nextval('some_seq');
然後在每個節點上呼叫,以提供不同的偏移量起始值,如下所示。
app=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);