- Klaster multi-AZ Amazon RDS for PostgreSQL secara resmi mendukung Snapshot Isolation, tetapi dalam praktiknya siklus G-nonadjacent dan fenomena Long Fork yang melanggarnya sering terjadi
- Pengujian dilakukan berdasarkan workload transaksi PostgreSQL yang disusun sendiri, dan error konsistensi terjadi di semua versi dari PostgreSQL 13.15 hingga 17.4
- Error ini terutama terjadi pada node sekunder read-only, dan Snapshot Isolation tetap rusak bahkan pada level "Repeatable Read"
- Klaster RDS kemungkinan menyediakan konsistensi pada level Parallel Snapshot Isolation, yang merupakan model yang lebih lemah daripada PostgreSQL single-node dasar
- Transaksi read-only dapat mengamati urutan transaksi yang berbeda, dan ketidakkonsistenan ini dapat berujung pada error integritas data
Background
- PostgreSQL adalah DB SQL open source berbasis MVCC, yang menyediakan berbagai level isolasi transaksi. Repeatable Read pada praktiknya berarti Snapshot Isolation
- Amazon RDS menyediakan PostgreSQL sebagai klaster terkelola, dan konfigurasi Multi-AZ adalah arsitektur untuk replikasi dan toleransi kegagalan
- Endpoint utama mendukung baca/tulis, sekunder bersifat read-only dan tidak mendukung level Serializable
Test Design
- Melakukan pengujian transaksi otomatis dengan membungkus alat uji Jepsen PostgreSQL agar sesuai untuk RDS
- Transaksi dirancang dalam struktur membaca list pada key tertentu atau menambahkan integer unik dengan append, dengan deteksi siklus menggunakan checker Elle
- Pada beban 150 TPS tulis dan 1600 TPS baca, Long Fork dan G-nonadjacent terkonfirmasi muncul dalam 2 menit
Results
- Pelanggaran Snapshot Isolation dibuktikan melalui siklus G-nonadjacent yang terdiri dari 4 transaksi
- T₂ mengamati perubahan dari T₁ tetapi tidak melihat T₃, sedangkan T₄ melihat T₃ tetapi tidak melihat T₁ → terjadi kontradiksi timbal balik dalam urutan waktu
- Ini merupakan fenomena Long Fork sekaligus contoh kuat yang membuktikan pelanggaran Snapshot Isolation, dan
- Write Skew tidak ditemukan, sehingga mendukung kemungkinan Parallel Snapshot Isolation
Discussion
- Multi-AZ RDS memiliki level konsistensi yang lebih rendah daripada PostgreSQL single-node
- Karena ada kemungkinan error konsistensi saat menggunakan node read-only, perlu mempertimbangkan untuk selalu hanya menggunakan node tulis atau memastikan setiap transaksi setidaknya menyertakan satu operasi tulis
- Analisis ini masih pada tahap pengujian awal, dan membuktikan adanya masalah tetapi tidak menjamin ketiadaannya
1 komentar
Opini Hacker News
Meskipun tidak disebutkan secara jelas di judul artikel, ini berkaitan dengan fitur baru RDS, yaitu klaster Multi-AZ
Di perusahaan sebelumnya, ketika perintah
pg_dumpdalam skrip backup diubah untuk menggunakan worker paralel (flag-j), masalah konsistensi muncul saat pemulihan backup (galat kunci duplikat dan galat constraint fk)Jepsen melakukan pekerjaan ini secara independen dan tidak dibayar
Implikasi praktis dari masalah ini adalah bahwa pembacaan yang terjadi segera setelah penulisan ke baris yang sama dapat mengembalikan data usang
Tidak jelas apakah pada klaster Postgres upstream multi-instance masalah ini tidak terjadi
Judul yang diajukan menyembunyikan inti masalahnya: RDS untuk PostgreSQL 17.4 tidak mengimplementasikan snapshot isolation dengan benar
Jika pengembang mengasumsikan snapshot isolation, tetapi Amazon RDS for PostgreSQL sebenarnya hanya menyediakan parallel snapshot isolation, penasaran bug keamanan atau bug tingkat aplikasi apa yang bisa muncul, terutama pada konfigurasi Multi-AZ yang menggunakan endpoint read replica
Fenomena ini terjadi di semua versi yang diuji, dari 13.15 hingga 17.4
Akan bagus jika semua versi Amazon RDS diuji dengan Jepsen
AWS seharusnya memperbarui dokumentasinya untuk menyampaikan hal ini