Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menangani urutan dalam replikasi aktif-aktif
Sebuah instans DB RDS for PostgreSQL dengan ekstensi pgactive
menggunakan dua mekanisme urutan yang berbeda untuk menghasilkan nilai unik.
Urutan Global
Untuk menggunakan urutan global, buat urutan lokal dengan pernyataan CREATE SEQUENCE
. Gunakan pgactive.pgactive_snowflake_id_nextval(seqname)
alih-alih usingnextval(seqname)
untuk mendapatkan nilai unik berikutnya dari urutan.
Contoh berikut membuat urutan global:
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');
Urutan yang dipartisi
Dalam urutan split-step atau partisi, urutan PostgreSQL normal digunakan pada setiap simpul. Setiap urutan bertambah dengan jumlah yang sama dan dimulai pada offset yang berbeda. Misalnya, dengan langkah 100, simpul 1 menghasilkan urutan sebagai 101, 201, 301, dan seterusnya dan simpul 2 menghasilkan urutan sebagai 102, 202, 302, dan seterusnya. Skema ini bekerja dengan baik bahkan jika simpul tidak dapat berkomunikasi untuk waktu yang lama, tetapi mengharuskan perancang menentukan jumlah simpul maksimum saat membuat skema dan memerlukan konfigurasi per-simpul. Kesalahan dapat dengan mudah menyebabkan urutan yang tumpang tindih.
Hal ini relatif mudah untuk mengonfigurasi pendekatan ini dengan pgactive
dengan membuat urutan yang diinginkan pada simpul sebagai berikut:
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');
Kemudian panggil setval
setiap simpul untuk memberikan nilai awal offset yang berbeda sebagai berikut.
app=>
-- On node 1 SELECT setval('some_seq', 1); -- On node 2 SELECT setval('some_seq', 2);