- Amazon RDS for PostgreSQL’ün multi-AZ kümesi resmî olarak Snapshot Isolation’ı desteklese de, pratikte bunu ihlal eden G-nonadjacent cycle ve Long Fork olayı sıkça ortaya çıkıyor
- Testler, doğrudan yapılandırılmış PostgreSQL transaction workload’u temel alınarak yürütüldü ve PostgreSQL 13.15’ten 17.4’e kadar tüm sürümlerde tutarlılık hataları oluştuğu görüldü
- Bu hatalar çoğunlukla salt okunur secondary node’larda ortaya çıkıyor ve "Repeatable Read" düzeyinde bile Snapshot Isolation bozuluyor
- RDS kümesi Parallel Snapshot Isolation düzeyinde tutarlılık sağlıyor olabilir; bu, temel PostgreSQL tek düğüm modelinden daha zayıf bir model
- Salt okunur transaction’lar birbirinden farklı transaction sıralamaları gözlemleyebilir ve bu tür uyumsuzluklar veri bütünlüğü hatalarına yol açabilir
Background
- PostgreSQL, MVCC tabanlı açık kaynaklı bir SQL veritabanıdır ve çeşitli transaction isolation düzeyleri sunar. Repeatable Read, pratikte Snapshot Isolation anlamına gelir
- Amazon RDS, PostgreSQL’ü yönetilen bir küme olarak sunar ve Multi-AZ yapılandırması replikasyon ile hata toleransı için kullanılan bir mimaridir
- Birincil endpoint okuma/yazma destekler, secondary’ler salt okunurdur ve Serializable düzeyini desteklemez
Test Design
- Jepsen PostgreSQL test aracı, RDS’ye uyarlanacak şekilde sarmalanarak otomatik transaction testleri yürütüldü
- Transaction’lar, belirli anahtarlardaki listeleri okumak veya benzersiz tam sayılar append etmek üzere tasarlandı; cycle tespiti için Elle checker kullanıldı
- 150 TPS yazma ve 1600 TPS okuma yükünde 2 dakika içinde Long Fork ve G-nonadjacent ortaya çıktığı doğrulandı
Results
- 4 transaction’dan oluşan bir G-nonadjacent cycle üzerinden Snapshot Isolation ihlali kanıtlandı
- T₂, T₁’in değişikliklerini gözlemledi ama T₃’ü görmedi; T₄ ise T₃’ü gördü ama T₁’i görmedi → zamansal sırada karşılıklı çelişki oluşuyor
- Bu durum Long Fork olayıdır ve aynı zamanda Snapshot Isolation ihlalini gösteren güçlü bir örnektir
- Write Skew tespit edilmemesi, Parallel Snapshot Isolation olasılığını destekliyor
Discussion
- Multi-AZ RDS, tek düğümlü PostgreSQL’den daha düşük bir tutarlılık düzeyi sunuyor
- Salt okunur node kullanıldığında tutarlılık hatası olasılığı bulunduğu için, yalnızca yazma düğümünü kullanmak veya tüm transaction’lara en az bir yazma işlemi eklemek değerlendirilmeli
- Bu analiz ilk test düzeyindedir ve sorunun varlığını kanıtlar, ancak yokluğunu garanti etmez
1 yorum
Hacker News görüşü
Başlıkta açıkça belirtilmemiş olsa da, bu RDS'nin yeni özelliği olan multi-AZ cluster ile ilgili
Önceki şirkette yedekleme betiğindeki
pg_dumpkomutunu paralel worker'lar (-jbayrağı) kullanacak şekilde değiştirdiğimizde, yedek geri yükleme sırasında tutarlılık sorunları (yinelenen anahtar hataları ve fk kısıt hataları) ortaya çıkmıştıJepsen bu çalışmayı bağımsız olarak yürüttü ve bunun için ödeme almadı
Bu sorunun pratik anlamı, aynı satıra yapılan bir yazmadan kısa süre sonra gerçekleşen okumanın eski veriyi döndürebilmesidir
Multi-instance upstream Postgres cluster'da sorun olmadığı net değil
Gönderilen başlık asıl noktayı gizliyor: PostgreSQL 17.4 için RDS, snapshot isolation'ı düzgün şekilde uygulamıyor
Geliştiriciler snapshot isolation varsayarken Amazon RDS for PostgreSQL gerçekte yalnızca parallel snapshot isolation sağlıyorsa, özellikle read replica endpoint kullanan multi-AZ yapılandırmalarında bunun ne tür güvenlik veya uygulama düzeyi hatalara yol açabileceğini merak ediyorum
Test edilen 13.15'ten 17.4'e kadar tüm sürümlerde bu durum görüldü
Amazon RDS'nin tüm sürümlerinin Jepsen ile test edilmesi iyi olurdu
AWS'nin bunu iletmek için belgeleri güncellemesi gerekir