Cloudflare, Hyperdrive’da MySQL desteğinin genel kullanıma sunulduğunu açıkladı. Hyperdrive, Workers kullanıcılarına yönelik olarak veritabanı bağlantılarını şirketin ağı üzerinden havuzlayan ve yeniden kullanan bir hizmettir. Hizmetin beta sürümünden genel kullanıma geçişi, aralarında sorgu sonuçlarının önbelleğe alınmasında verilerin mevcut olması beklenmesine rağmen boş yanıtlar döndüren nadir bir sorunun da bulunduğu yaklaşık 20 hatanın giderilmesinin ardından gerçekleşti.
Sorun yaklaşık %0,001 oranında ortaya çıktığı için izleme günlükleri üzerinden tespit edilmesi zordu. Cloudflare, hatanın yalnızca önbellekleme etkinleştirildiğinde ortaya çıktığını ve beta aşamasında MySQL hizmetini en yoğun kullanan müşterinin bildirmesinin ardından keşfedildiğini belirledi.
Hyperdrive nasıl çalışır?
Hyperdrive, SQL bağlantılarını Cloudflare ağı üzerinde sıcak ve açık tutar, ardından her istek için yeni bir bağlantı oluşturmak yerine bu bağlantıları Workers istekleri arasında paylaşır. Ayrıca yaygın sorguların sonuçlarını yerel CDN önbelleğinde depolayabilir; bu da gecikmeyi ve asıl veritabanı üzerindeki yükü azaltır.
Hizmetin mimarisi, Worker’ın yakınında çalışan bir Client düğümü ile bağlantı havuzunu yöneten ve asıl veritabanına yakın bir veri merkezinde bulunan bir Endpoint düğümünden oluşur. Her iki düğüm de aynı veri merkezinde çalıştığında aynı önbelleği paylaşabilir.
Hata, MySQL protokol biçimindeki farklılıktan kaynaklanıyordu
Hyperdrive, MySQL ile iki farklı yönden etkileşim kurar: Worker’ın karşısında sunucu, asıl veritabanının karşısında ise istemci olarak çalışır. Worker’ın üzerinde anlaşmaya vardığı protokol yetenekleri, Hyperdrive’ın veritabanıyla kullandığı yeteneklerden farklı olabileceği için hizmetin sonuç mesajlarını nihai istemciye uygun olacak şekilde yeniden biçimlendirmesi gerekir.
İnceleme, sonuç kümelerinin sonlandırılma yöntemine odaklandı. Node.js’te yaygın olarak kullanılan mysql2 kitaplığı da dahil olmak üzere bazı MySQL kitaplıkları CLIENT_DEPRECATE_EOF yeteneğini desteklemiyor. Bu yetenek bulunmadığında sunucu EOF paketlerini kullanırken, protokolün daha yeni davranışında sonuç kümesinin sonunda bunların yerine OK paketi kullanılır.
Client düğümü bazen Worker’ın yeteneklerine uyacak şekilde çevrilen baytları önbelleğe alırken Endpoint düğümü Hyperdrive’ın yeteneklerine sahip standart bir sürüm bekliyordu. Düğümlerden biri diğerinin depoladığı sonucu okuduğunda mesajları uygun olmayan bir biçimde ele alabiliyor ve bu da erken EOF’a, takılmaya veya boş sonuca yol açabiliyordu.
Uygulamada ne değişti?
Cloudflare, tüm düğümlerin sorgu sonucunun standart bir sürümünü önbelleğe yazmasını sağlayarak sorunu düzeltti. Bu sürüm, hangi düğüm tarafından depolandığına bakılmaksızın her zaman Hyperdrive’ın yeteneklerine göre kodlanıyor. Cloudflare’a göre düzeltmenin kullanıma sunulmasının ardından boş satır sorunu ortadan kalktı ve Client bağlantılarındaki başarı oranı %99,99’a ulaştı.
Şirket ayrıca testler sırasında ortaya çıkan başka sorunları da giderdi; bunlar arasında emoji karakterlerinin kodlanmasındaki hata da bulunuyordu. utf8 kullanımı gerçekte tüm dört baytlık Unicode kod noktalarını desteklemeyen utf8mb3 anlamına geliyordu. Hizmet utf8mb4’e geçirildi. Ayrıca COM_RESET_CONNECTION komutu yürütüldükten sonra kodlama yeniden ayarlandı; çünkü bu komut bağlantıyı, latin1 olabilen sunucunun varsayılan ayarına döndürüyor.
Kullanılabilirlik ve sınırlamalar
MySQL desteği bugün itibarıyla Cloudflare paneli veya wrangler aracı üzerinden genel kullanıma sunuldu ve yeni bir PlanetScale veritabanına bağlantı da dahil olmak üzere MySQL uyumlu veritabanlarıyla kullanılabiliyor. Bu durum, bir ara katmanda bağlantı havuzlama ve önbelleklemenin yalnızca SQL’in doğruluğuna bağlı olmadığını; aynı zamanda protokol durumları ile her katmanın beklediği biçim arasında hassas bir uyum gerektirdiğini gösteriyor.