
Cloudflare'ın Hyperdrive'ında MySQL desteği 20 hata düzeltmesi sonrası genel olarak kullanılabilir
Cloudflare, Hyperdrive'da MySQL desteğinin genel kullanılabilirliğini duyurdu. Beta sırasında ekip 20 hatayı düzeltti; bunlar arasında sorguların yaklaşık %0,001'ini etkileyen ve bağlantı başarı oranını %99,99'a düşüren nadir bir önbellek sorunu da vardı.
Cloudflare, Hyperdrive'da MySQL desteğinin genel kullanılabilirliğini duyurdu. Hyperdrive, Workers'ın dağıtık veritabanı bağlantı havuzudur. Hizmet başlangıçta yalnızca Postgres'u destekliyordu; MySQL protokolünün betası ise geçen ay duyuruldu. Şirkete göre beta ile GA arasındaki fark 20 hata düzeltmesiydi.
Beta Sırasında Giderilen Kodlama Hataları
Betadaki ilk sorun, veritabanına kaydedilen emojilerin yanlış dönmesiydi. Neden, karakter setinin kodlaması ortaya çıktı. Hyperdrive bağlantı başlatırken kodlama üzerinde pazarlık yapar ve utf8, yani utf8mb3'ün eski takma adını kullanırdı. Bu kodlama kod noktasına yalnızca 1 ila 3 bayt desteklerken, tam UTF-8 4 bayta kadar destekler. Elbeti ekibi el yazısı utf8mb4'e geçirdi ve emoji sorunu çözüldü.
İkinci kodlama sorunu, Hyperdrive'ın COM_RESET_CONNECTION ile bağlantı temizleme özelliğini eklemesinden sonra ortaya çıktı. Bu, oturum durumunu sıfırlayan ve oturumlar arası durum sızıntısını önleyen MySQL'in hafif bir komutudur. Sorun şu: COM_RESET_CONNECTION, bağlantıyı sıfırlarken üzerinde anlaşılan kodlama yerine sunucunun varsayılan kodlamasına döner. latin1'in MySQL sunucusunda varsayılan olduğu bir ortamda, yeniden yükleme sonrası bağlantı latin1'e geçiyordu. Düzeltme, yeniden yükleme sonrası kodlamayı utf8mb4'e ayarlayan komutun her zaman çalıştırılmasıydı.
Nadir Önbellek Hatası
Beta sırasında Hyperdrive'ın en yoğun kullanan MySQL kullanıcısı, her zaman boş olmayan yanıt beklenirken küçük ama tutarlı bir miktarda boş yanıt bildirdi. Hata zamanın yaklaşık %0,001'inde meydana geliyordu, bu yüzden baştan sona iz sürmek zordu. Bir ipucu öne çıkıyordu: hata yalnızca önbelleğe alınmış Hyperdrive örneklerinde görülüyordu.
Hyperdrive'ın her bir örneği, Client ve Endpoint düğümleriyle ayrık bir mimariye sahiptir. Client, aynı makinede çalışan Worker'dır ve gerektiğinde sorguları iletir; Endpoint ise bağlantı havuzunu kaynak veritabanına en yakın merkezde tutar. Her iki düğüm de kendi merkezinin yerel Cloudflare CDN önbelleğini kullanır, bu yüzden aynı merkezde çalışırken ortak bir önbelleği paylaşırlar. Doğru çalışma için, aynı yanıt her zaman aynı baytlarla önbelleğe alınmalıdır; bunu hangi düğümün sakladığı önemli değildir.
Araştırma sonunda MySQL protokolündeki yetenek farklılıklarına işaret etti. Hyperdrive, kaynak veritabanı için bir istemci, Worker için bir sunucudur ve tarafların farklı yetenekleri olabilir. Örneğin, Node.js'in mysql2 kütüphanesi, sonuç kümelerinin bitişini değiştiren CLIENT_DEPRECATE_EOF'ü desteklemez. Bu yüzden Hyperdrive, sonuç kümelerini yeniden yazar, gerektiğinde EOF paketleri ekler ve OK paketlerini EOF'lere dönüştürerek Worker sürücüsünün beklentisine uyarlar.
Neden, Postgres önbelleğinden taşınan bir varsayımdu: Worker için yazılan birebir baytlar önbelleğe alınabilir. MySQL için bu geçerli değildir çünkü Client, Worker yeteneklerine çevrilmiş baytları yazar, Endpoint ise Hyperdrive yetenekleriyle çalışır. Ortak bir önbellekte, birinin sakladığını diğeri okuyabilirdi. Bir durumda Endpoint, yanıt baytlarını önbelleğe aldı, Client ise bunları Worker'a çevirmeden ulaştırdı. Diğerinde Client, çevrilmiş baytları önbelleğe aldı, Endpoint okudu ve başka bir Client'a iletti; bu son çevirmeyi denedi ve beklenmeyen bir EOF gönderdi veya takıldı.
Düzeltme, sorgu sonucu baytlarının her zaman Hyperdrive yetenekleriyle şifrelenmiş kanonik sürümünün önbelleğe alınmasıydı; bunu hangi düğümün sakladığı önemli değildi. Değişiklikten sonra boş satırların sorunu ortadan kalktı ve Client bağlantılarının başarı oranı %99,99'luk kullanılabilirlik hedefine ulaştı.
Kaynaklar: Cloudflare
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.