处理主动-主动复制中的序列
带有 pgactive
扩展的 RDS for PostgreSQL 数据库实例使用两种不同的序列机制来生成唯一值。
全局序列
要使用全局序列,请使用 CREATE SEQUENCE
语句创建一个本地序列。使用 pgactive.pgactive_snowflake_id_nextval(seqname)
而非 usingnextval(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');
然后,对每个节点调用 setval
以给出不同的偏移起始值,如下所示。
app=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);