QueryProxy
Doküman menüsü

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_backend yoktur. QueryProxy süreç numarasının yanına oturum kimliğini (SHOW session_id) kaydeder ve ifadeyi CANCEL 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.0 duyuran bir düğüm SHOW 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 kadar CANCEL QUERIES ile CANCEL 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_ddl ayarı), MySQL gibi; bu yüzden tek başına READ ONLY bir işlem DDL’e geçit verirdi. QueryProxy bu yüzden CockroachDB’de default_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 da SET 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_panic gibi crdb_internal.* fonksiyonları ise okuma olarak geçer: CANCEL QUERY ve CANCEL SESSION (ve çoğul biçimleri), SET CLUSTER SETTING, EXPORT, IMPORT, BACKUP ve RESTORE. PostgreSQL’deki karşılıkları, örneğin pg_cancel_backend ve ALTER 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; admin rolünün üyesi olmasın, CANCELQUERY ve MODIFYCLUSTERSETTING rol seçeneklerine ya da EXTERNALIOIMPLICITACCESS ayrı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_ssl boş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üğüme require bağlantı başarısız olur ve sertifika doğrulaması (CA ile verify-full) çalışır.
  • Yalıtım. CockroachDB işlemleri SERIALIZABLE düzeyinde çalıştırır. Bir ifade yeniden denenebilir bir hatayla (SQLSTATE 40001) 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_timeout uygulanmaz (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 bir UPDATE, 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.

Gezinmek için ok tuşları, açmak için Enter.