处理主动-主动复制中的序列 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

处理主动-主动复制中的序列

带有 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);