为什么在RDS Aurora PostgreSQL 故障转移后id 为SERIAL 不连续值?

Why is id as SERIAL discontinuous values after failover in RDS Aurora PostgreSQL?

我正在使用 RDS Aurora PostgreSQL 测试故障转移。

首先,创建RDS Aurora PostgreSQL,并接入writer集群创建用户table。

$ CREATE TABLE users ( 
id SERIAL PRIMARY KEY NOT NULL, 
name varchar(10) NOT NULL,
createAt TIMESTAMP DEFAULT Now() );

然后我添加了一行并检查了 table。

$ INSERT INTO users(name) VALUES ('test');

$ SELECT * FROM users;
+----+--------+----------------------------+
| id | name   | createdAt                  |
+----+--------+----------------------------+
|  1 | test   | 2022-02-02 23:09:57.047981 |
+----+--------+----------------------------+

RDS Aurora 集群故障转移后,我添加了另一行并检查了 table。

$ INSERT INTO users(name) VALUES ('temp');

$ SELECT * FROM users;
+-----+--------+----------------------------+
|  id | name   | createdAt                  |
+-----+--------+----------------------------+
|   1 | test   | 2022-02-01 11:09:57.047981 |
|  32 | temp   | 2022-02-01 11:25:57.047981 |
+-----+--------+----------------------------+

故障转移后,本应为2的id值变成了32

为什么会这样?

有什么办法可以解决这个问题吗?

这是意料之中的事情。每当调用 nextval 时,索引修改都不会记录在 WAL 中,因为这可能成为性能瓶颈。相反,每 32 次调用写入一个 WAL 记录。这意味着序列可以在崩溃或故障转移到备用数据库后跳过一些值。

您可能想阅读 my ruminations about gaps in sequences