2 poin oleh GN⁺ 2025-04-30 | 1 komentar | Bagikan ke WhatsApp
  • 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

 
GN⁺ 2025-04-30
Opini Hacker News
  • Meskipun tidak disebutkan secara jelas di judul artikel, ini berkaitan dengan fitur baru RDS, yaitu klaster Multi-AZ

    • Instance Multi-AZ adalah fitur lama di mana DB utama direplikasi secara sinkron ke DB sekunder di AZ lain
    • Klaster Multi-AZ memiliki dua DB sekunder, dan transaksi direplikasi secara sinkron ke setidaknya satu DB sekunder
    • Ini lebih tangguh jika DB sekunder gagal atau kinerjanya menurun, serta memungkinkan akses baca saja ke DB sekunder
    • Klaster Multi-AZ bukan fitur Postgres pada umumnya, dan itu bisa menjadi alasan mengapa gagal dalam pengujian Jepsen
  • Di perusahaan sebelumnya, ketika perintah pg_dump dalam skrip backup diubah untuk menggunakan worker paralel (flag -j), masalah konsistensi muncul saat pemulihan backup (galat kunci duplikat dan galat constraint fk)

    • Masalah ini telah dilaporkan ke mailing list AWS dan Postgres, tetapi tidak terselesaikan karena sulit direproduksi
    • Pada akhirnya kembali ke dump single-thread, dan penasaran apakah masalah ini terkait dengan perilaku yang kami alami
  • Jepsen melakukan pekerjaan ini secara independen dan tidak dibayar

    • Ini adalah kabar yang tidak ingin didengar para pemangku kepentingan RDBMS di hari yang baik
    • Salut untuk aphyr
  • Implikasi praktis dari masalah ini adalah bahwa pembacaan yang terjadi segera setelah penulisan ke baris yang sama dapat mengembalikan data usang

    • Sebelum transaksi tulis ditandai selesai, tidak semua lapisan terdistribusi pada instance RDS Multi-AZ telah sepenuhnya diperbarui, sehingga pembacaan langsung dapat mengembalikan baris yang belum ada atau nilai lama
    • Karena mekanisme snapshot PostgreSQL, ini bukan berarti hanya sebagian byte dari tipe kolom multi-byte yang diperbarui lalu pembacaan mendapatkan nilai tak bermakna
    • Ini tampak seperti race condition yang pada akhirnya menjadi konsisten
  • Tidak jelas apakah pada klaster Postgres upstream multi-instance masalah ini tidak terjadi

    • Penasaran apakah AWS menambahkan sesuatu pada konfigurasi klaster atau menambahkan patch yang memicu perilaku ini
  • 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

    • Sempat khawatir bahwa upgrade versi mayor adalah keputusan yang salah, tetapi ini bukan regresi melainkan permintaan fitur atau bug lama
  • Akan bagus jika semua versi Amazon RDS diuji dengan Jepsen

  • AWS seharusnya memperbarui dokumentasinya untuk menyampaikan hal ini

    • Penasaran apakah perbaikan snapshot isolation akan menyebabkan regresi performa dalam latensi atau throughput, atau apakah mereka akan mengklaim kondisi saat ini sudah cukup kuat
    • Bagaimanapun juga, AWS harus menyebutkan hal ini