Назад
Підтримка MySQL у Hyperdrive від Cloudflare стала загальнодоступною після виправлення 20 помилок
SiTech AI Team3 хв читання

Підтримка MySQL у Hyperdrive від Cloudflare стала загальнодоступною після виправлення 20 помилок

Cloudflare оголосив про загальну доступність підтримки MySQL у Hyperdrive. Під час бета-тестування команда виправила 20 помилок, включно з рідкісною проблемою кешування, яка впливала на ~0,001% запитів.

Cloudflare оголосив про загальнодоступність підтримки MySQL у Hyperdrive. Hyperdrive — це пул розподілених підключень до баз даних для Workers. Спочатку сервіс підтримував лише Postgres, а бета-версія для протоколу MySQL була анонсована на тижні. За словами компанії, різниця між бета-версією та GA полягала у виправленні 20 помилок.

Виправлені під час бета-тестування проблеми з кодуванням

Першою проблемою в бета-версії було те, що емодзі, записані в базу, поверталися некоректно. Причиною виявилося кодування набору символів. Hyperdrive домовляється про кодування під час встановлення з'єднання та використовував utf8, застарілий псевдонім utf8mb3. Це кодування підтримує лише 1–3 байти на кодову точку, тоді як повний UTF-8 — до 4 байтів. Команда змінила початкове налаштування на utf8mb4, і проблема з емодзі була вирішена.

Друга проблема з кодуванням виникла після того, як Hyperdrive додав очищення з'єднання за допомогою COM_RESET_CONNECTION. Це легка команда MySQL, яка очищує стан сесії, щоб стан сесії не передавався між клієнтами. Проблема в тому, що COM_RESET_CONNECTION скидає з'єднання на кодування за замовчуванням сервера замість узгодженого. Після перезавантаження MySQL сервера з кодуванням за замовчуванням latin1 з'єднання перемикалося на latin1. Виправленням стало виконання команди встановлення кодування utf8mb4 після кожного перезавантаження.

Рідкісна проблема кешування

Під час бета-тестування найбільш навантажений користувач MySQL у Hyperdrive повідомив про невелику, але стабільну кількість порожніх відповідей, тоді як очікувалася завжди непорожня відповідь. Помилка відбувалася приблизно в 0,001% випадків, тому відстежити її до кінця було складно. Одна ознака виділялася: помилка відбувалася лише на кешованих інстанціях Hyperdrive.

Кожен інстанс Hyperdrive має розділену архітектуру з вузлами Client та Endpoint. Client знаходиться на тій же машині, що й Worker, і за необхідності пересилає запити, а Endpoint зберігає пул з'єднань у найближчому центрі до вихідної бази даних. Обидва вузли використовують локальний кеш Cloudflare CDN свого центру, тому при роботі в одному центрі вони ділять спільний кеш. Для коректної роботи необхідно, щоб для однієї і тієї ж відповіді кешувалися однакові байти, незалежно від того, який вузол їх зберіг.

Розслідування врешт-решт вказувало на розбіжність можливостей у протоколі MySQL. Hyperdrive є клієнтом для вихідної бази даних і сервером для Worker, і сторони можуть мати різні можливості. Наприклад, бібліотека mysql2 для Node.js не підтримує CLIENT_DEPRECATE_EOF, яка змінює завершення наборів результатів. Тому Hyperdrive переписує набори результатів, за потреби додає пакети EOF і перетворює пакети OK на EOF, щоб відповідати очікуванням драйвера Worker.

Причиною було припущення, перенесене з кешування Postgres: точні байти, записані для Worker, можуть кешуватися. Для MySQL це не працює, оскільки Client записує байти, перетворені для можливостей Worker, а Endpoint працює з можливостями Hyperdrive. При спільному кеші один міг прочитати те, що зберіг інший. В одному випадку Endpoint зберіг байти відповіді в кеші, а Client передав їх Worker без перетворення. В іншому Client зберіг перетворені байти в кеші, Endpoint прочитав і передав їх іншому Client, який знову намагався їх перетворити та випадково відправив EOF або застряг.

Виправленням стало зберігання в кеші канонічної версії байтів результату запиту, зашифрованої можливостями Hyperdrive, незалежно від того, який вузол їх зберіг. Після змін проблема з порожніми рядками зникла, а показник успішності з'єднань Client досяг цільової доступності 99,99%.

Джерело: Cloudflare

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.