为什么在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 记录。这意味着序列可以在崩溃或故障转移到备用数据库后跳过一些值。
我正在使用 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 记录。这意味着序列可以在崩溃或故障转移到备用数据库后跳过一些值。