
Cloudflare-ın Hyperdrive-ında MySQL dəstəyi ümumi əlçatandır – 20 səhv düzəldildikdən sonra
Cloudflare elan etdi ki, Hyperdrive-da MySQL dəstəyi ümumi əlçatandır. Beta mərhələsində komanda 20 səhvi düzəldildi: nadir keş problemi də var idi — sorğuların təxminən 0,001%-i aiddir və uğurlu bağlantı göstəricisi 99,99%-ə qaldırıldı.
Cloudflare elan etdi ki, Hyperdrive-da MySQL dəstəyi ümumi əlçatandır. Hyperdrive Workers üçün paylanmış verilənlər bazası bağlantıları hovuzudur. Xidmət əvvəlcən yalnız Postgres dəstəklərdi, MySQL protokolunun betası isə keçən il elan olundu. Şirkətin sözləsinə görə, beta ile GA arasındaki fərq 20 səhvin düzəldilməsi oldu.
Beta mərhələsində düzəldilmiş kodlaşdırma xətaları
Betada ilk problem odur ki, bazaya yazılan emojilər səhv qayırdı. Səbəb simvolların kodlaşdırılması oldu. Hyperdrive bağlantı başlayarkən kodlaşdırma üzərində razılaşır və utf8, yəni utf8mb3-ün köhnə ləqəbini istifadə edirdi. Bu kodlaşdırma kod nöqtəsi üçün yalnız 1-dən 3 baytə qədər dəstəklər, tam UTF-8 isə 4 baytə qədər. Komanda razılaşmanı utf8mb4-ə keçirdi və emoji probleminə son qoydu.
İkinci kodlaşdırma problemi sonra ortaya çıxdı: Hyperdrive bağlantını təmizləmək üçün COM_RESET_CONNECTION əlavə etdi. Bu, sorğular arasında sessiya vəziyyətinin sızmasını üçün sessiya vəziyyətini təmizləyən MySQL-in yüngül əmridir. Problem şuradır ki, COM_RESET_CONNECTION bağlantı başlayarkən razılaşılan kodlaşdırma əvəzinə serverin default kodlaşdırmasına qaytarır. MySQL serveri latin1 default ilə yenidən başladıqda bağlantı latin1-ə keçirdi. Düzəliş odur ki, yenidən yükləndikdən sonra hər dəfə kodlaşdırmanın utf8mb4-ə quraşdırılması əmri icra edilsin.
Nadir keş xətası
Beta zamanı Hyperdrive-ın ən yüklü MySQL müştərisi həmişə boş olmayan cavab gözlənilən halda, boş cavabların kiçik, ancaq sabit miqdarını bildirdi. Xəta təxminən 0,001%-də baş verirdi, buna görə sona qədər izləmək çətin olurdu. Bir əlamət fərqlənirdi: xəta yalnız keşlənmiş Hyperdrive instansiyalarında baş verirdi.
Hyperdrive-ın hər instansiyası Client və Endpoint düyünləri ilə ayrılmış arxitekturadır. Client Worker eyni maşındadır və lazım olduqda sorğuları ötürür, Endpoint isə bağlantı hovuzunu mənbə bazasına ən yaxında olan mərkəzdə saxlayır. Hər iki düyün öz mərkəzinin lokal Cloudflare CDN keşini istifadə edir, buna görə bir mərkəzdə işləyəndə ümumi keşi paylaşırlar. Düzgün işləmək üçün eyni cavab üçün hansı düyün saxlamış olsın, eyni baytlar eyni şəkildə keşlənməlidir.
Araşdırma MySQL protokolunda imkanların razılaşdırılmasına göstərdi. Hyperdrive mənbə bazası üçün müştəridir, Worker üçün serverdir və tərəflərdə fərqli imkanlar ola bilər. Məsələn, Node.js kitabxanası mysql2 CLIENT_DEPRECATE_EOF-u dəstəkləmir, bu da nəticə dəstələrinin başa çatmasını dəyişir. Buna görə Hyperdrive nəticə dəstələrini yenidən yazır, lazım olduqda EOF paketləri əlavə edir və OK paketlərini EOF-ə çevirir, beləliklə Worker sürücüsünün gözləninə uyğunlaşır.
Səbəb Postgres-dan keşə gətirilən varsayım idi: Worker üçün yazılan dəqiq baytlar keşlənə bilər. MySQL üçün bu işləmir, çünki Client baytları Worker imkanlarına görə tərcümə edir, Endpoint isə Hyperdrive imkanları ilə işləyir. Ümumi keşdə biri digərinin saxladığını oxuya bilərdi. Bir halda Endpoint cavab baytlarını keşdə saxladı, Client isə onları Worker-ə tərcümə etmədən verdi. Digər halda Client tərcümə edilmiş baytları keşdə saxladı, Endpoint onu oxuyub digər Client-ə ötürdü, o isə yenidən tərcümə etməyə çalışdı və sərt EOF göndərdi ya da qısaydı.
Düzəliş şuradır ki, sorğunun nəticə baytları hansı düyün saxlamış olsın, həmişə kanonik variantda, Hyperdrive imkanları ilə kodlaşdırılmış şəkildə keşə yazılsın. Dəyişikliklərdən sonra boş cavab probleminə son verildi və Client bağlantılarının uğurluluğu 99,99% əlçatanlıq hədəfinə çatdı.
Mənbələr: Cloudflare
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.