PostgreSQL uyumlu veritabanları
QueryProxy'nin hedef veritabanı olarak test edildiği PostgreSQL uyumlu sistemler (CockroachDB, YugabyteDB) ve her birinin PostgreSQL'den ayrıldığı yerler.
QueryProxy PostgreSQL ile pgsql sürücüsü üzerinden konuşur. PostgreSQL
protokolünü konuşan bir sistem PostgreSQL sürücüsüyle bağlantı olarak
eklenebilir; ama her biri uygulamanın dayandığı noktalarda PostgreSQL’den ayrılır:
çalışan bir ifadenin nasıl durdurulduğu, salt okunur kipin nasıl çalıştığı, kilit
bekleyişlerinin nasıl zaman aşımına uğradığı. Bu sayfa nelerin test edildiğini ve
nelerin farklı olduğunun bilindiğini listeler.
“CI’da test edildi”, entegrasyon testlerinin o sistemin gerçek bir sunucusuna karşı her pull request’te çalıştığı anlamına gelir. “Test edilmedi”, ona karşı hiçbir şey çalıştırılmadığı demektir: çalışabilir, ama burada hiçbir söz yoktur.
Durum
| Sistem | Test edilen sürüm | Durum |
|---|---|---|
| CockroachDB | v25.4.19 | CI’da test edildi, bilinen farklarla |
| YugabyteDB | 2025.2.8.0-b60 (PostgreSQL 15.12-YB) | CI’da test edildi, bilinen farklarla |
| Aurora PostgreSQL | yok | Test edilmedi |
| Neon | yok | Test edilmedi |
| Supabase | yok | Test edilmedi |
Bunlar yalnızca hedef veritabanlarıdır. Uygulamanın kendi veritabanı SQLite, MySQL, MariaDB, PostgreSQL ya da SQL Server olarak kalır; CockroachDB ve YugabyteDB uygulama veritabanı olarak desteklenmez.
Testler salt okunur zorlamayı, ifade ve kilit zaman aşımlarını, çalışan bir ifadenin durdurulmasını, büyük sonuçların akıtılmasını ve zorunlu TLS’i kapsar. Her sistemin durumu:
| Davranış | CockroachDB | YugabyteDB |
|---|---|---|
| Veritabanı okuma taleplerinde yazmayı ve DDL’i reddeder | Evet (salt okunur kip) | Evet |
| SQL koruması sistemin kendi ifadelerini tanır | Hayır, yalnızca PostgreSQL lehçesi (SQL koruması) | PostgreSQL lehçesi; YugabyteDB’ye özgü ifadeler gözden geçirilmedi |
| İfade zaman aşımı uzun bir okumayı ya da yazmayı keser | Evet | Evet |
| Kilit zaman aşımı satır kilidi beklemesini keser | Evet | Hayır (kilit bekleyişleri) |
| Durdurma çalışan bir yazmayı bitirir | Evet | Evet |
| Durdurma çalışan bir okumayı bitirir | Hayır, ifade zaman aşımı bitirir | Evet |
| Büyük sonuçlar akıtılır (sunucu tarafı imleç) | Evet | Evet |
| Zorunlu TLS TLS’siz sunucuyu reddeder; CA doğrulaması | Evet | Test edilmedi |
| Bağlantı testi oturumu şifreli olarak bildirir | “Bilinmiyor” bildirir | Test edilmedi |
CockroachDB
Bağlantıyı PostgreSQL sürücüsüyle, 26257 portuyla (SQL portu) ve veritabanı
adıyla ekleyin. TLS ve parola girişleri olan güvenli bir küme kullanın. Güvensiz
bir düğüm (--insecure) parola kabul etmez ve TLS sunmaz; bu yüzden yeni
bağlantıların TLS gereksinimini karşılayamaz ve salt okunur bir giriş taşıyamaz.
Bilinen farklar:
- İfadeyi durdurma. CockroachDB’de
pg_cancel_backendyoktur. QueryProxy süreç numarasının yanına oturum kimliğini (SHOW session_id) kaydeder ve ifadeyiCANCEL QUERIES SELECT query_id FROM [SHOW CLUSTER STATEMENTS] WHERE session_id = ...ile durdurur. Oturum, PostgreSQL’deki gibi kalır. Girişin kendi ifadelerini görebilmesi gerekir (her giriş görebilir) ve düğümler birbirine duyurdukları adresten ulaşabilmelidir:0.0.0.0duyuran bir düğümSHOW CLUSTER STATEMENTSçıktısını boş döndürür ve durdurma iletilmez. - Okumayı durdurma. Okuma talebi sunucu tarafı bir imleçle
(
DECLARE ... CURSOR) çalışır. CockroachDB imlecin sorgusunu tanımlandığında değerlendirir ve bu bitene kadarCANCEL QUERIESileCANCEL SESSION’ı yok sayar. Stop talebi hemen iptal edilmiş olarak işaretler; ama ifade, bitene ya da veritabanı tarafındaki ifade zaman aşımı kesene kadar çalışmaya devam eder. QueryProxy her zaman bir tane ayarlar: yürütme zaman aşımı eksi 5 saniye. Durdurulan bir yazma hemen kesilir. - Salt okunur kip. CockroachDB bir DDL ifadesinden önce açık işlemi commit
eder (
autocommit_before_ddlayarı), MySQL gibi; bu yüzden tek başınaREAD ONLYbir işlem DDL’e geçit verirdi. QueryProxy bu yüzden CockroachDB’dedefault_transaction_read_only’yi tüm oturum için de ayarlar; sunucu bir okuma talebinde DDL’i ve veri değişikliğini reddeder. PostgreSQL’den farklı olarak CockroachDB, bir ifadenin kendi işlemini yeniden okuma-yazmaya çevirmesine izin verir (SELECT set_config('transaction_read_only', 'off', false)ya daSET transaction_read_only = off). SQL koruması bu ifadeleri okuma taleplerinde reddeder, ama veritabanı reddetmezdi. Veritabanı tarafında garanti için bağlantıya salt okunur bir giriş tanımlayın. - SQL koruması. Korumanın yasak listeleri PostgreSQL lehçesi için yazılmıştır
ve yalnızca CockroachDB’de var olan ifadeleri tanımaz. Şunlar korumadan sıradan
yazma olarak,
crdb_internal.force_panicgibicrdb_internal.*fonksiyonları ise okuma olarak geçer:CANCEL QUERYveCANCEL SESSION(ve çoğul biçimleri),SET CLUSTER SETTING,EXPORT,IMPORT,BACKUPveRESTORE. PostgreSQL’deki karşılıkları, örneğinpg_cancel_backendveALTER SYSTEM, reddedilir. CockroachDB’de bunlara karşı güvence SQL koruması değil, girişin kendisidir: işi gören en az yetkili girişle bağlanın;adminrolünün üyesi olmasın,CANCELQUERYveMODIFYCLUSTERSETTINGrol seçeneklerine ya daEXTERNALIOIMPLICITACCESSayrıcalığına sahip olmasın; okuma talepleri için ayrıca salt okunur bir giriş ekleyin. Korumayı CockroachDB lehçesine genişletmek 0.4.1’in kapsamında değildir. - TLS durumu. CockroachDB’de
pg_stat_sslboştur; bu yüzden bağlantı testi oturumun şifrelemesini evet ya da hayır yerine bilinmiyor olarak bildirir. TLS gereksinimi kendisi çalışır: TLS’siz bir düğümerequirebağlantı başarısız olur ve sertifika doğrulaması (CA ileverify-full) çalışır. - Yalıtım. CockroachDB işlemleri
SERIALIZABLEdüzeyinde çalıştırır. Bir ifade yeniden denenebilir bir hatayla (SQLSTATE40001) başarısız olabilir. QueryProxy bunu talebin hatası olarak bildirir ve yeniden denemez.
YugabyteDB
Bağlantıyı PostgreSQL sürücüsüyle, 5433 portuyla (YSQL) ve veritabanı
adıyla ekleyin. Oturum kimlikleri, pg_cancel_backend, pg_stat_activity,
pg_stat_ssl, salt okunur işlemler ve sunucu tarafı imleçler PostgreSQL’deki gibi
davranır; bu yüzden ifadeyi durdurma, salt okunur kip, ifade zaman aşımı ve
akıtma özel bir işlem gerektirmez.
Bilinen farklar:
- Kilit bekleyişleri. Bir ifade başka bir işlemin tuttuğu satır kilidini
beklerken
lock_timeoutuygulanmaz (2025.2.8.0’da, varsayılan olan bekleme kuyruklarıyla gözlendi). Bekleyiş bunun yerine ifade zaman aşımında biter. Bir işlem dışında çalışan ve bu bekleyiş sırasında ifade zaman aşımınca kesilen tek birUPDATE, diğer işlem bıraktığında yine de uygulanabilir; oysa talep başarısız bildirilir. İşlem içinde geri alınır. Başka oturumların kilitlediği satırlar için kilit zaman aşımına ya da başarısız bir yazmanın “hiçbir şey değişmedi” anlamına geldiğine güvenmeyin. - TLS. Test edilmedi: test sunucusu istemci-sunucu şifrelemesi olmadan çalışır.
Test edilmeyenler
Aurora PostgreSQL, Neon ve Supabase PostgreSQL protokolünü konuşur ve yukarıdaki özelliklerde PostgreSQL gibi davranmaları beklenir; ama hiçbirine karşı bir şey çalıştırılmamıştır. Neon’un havuzlu uç noktası ve Supabase’in havuzlayıcısı gibi, işlem kipindeki bağlantı havuzlayıcıları; işlem dışındaki ifade zaman aşımı gibi oturum düzeyi ayarlar ve ifadeyi durdurmak için kullanılan süreç numarası için bilinen bir risktir.
Sonraki adımlar
- Korumanın neyi neden reddettiği için SQL korumaları.
- Zaman aşımları, hedef veritabanlarına TLS ve okuma kimlik bilgileri için Yapılandırma.
- Veritabanı tarafı ayarların neyi tutmayı amaçladığı için Tehdit modeli.