Команда Lobste.rs перевела сайт с MariaDB на SQLite. Миграция заняла несколько лет и прошла через два деплоя. Первый, 21 февраля, провалился: после включения readonly‑режима все CPU взлетели до 100%. Пришлось откатывать. Проблему нашли позже — SQLite делал полные сканирования самых больших таблиц из‑за двух тяжёлых запросов и одного N+1. Во втором деплое, 11 июля, баги исправили, добавили лог медленных запросов, и сайт остался жив. После понедельничного всплеска трафика всё работало стабильно.
Результаты: нагрузка на CPU и потребление памяти снизились, сайт стал отзывчивее, а VPS с MariaDB можно отключить, уполовинив расходы. PR #539 наконец закрыли. Участники отметили, что ключом к успеху стала хорошая коммуникация — миграция без доступа к продакшен‑базе очень сложна. Разработчику, взявшемуся за задачу, пришлось вручную писать скрипты генерации тестовых данных — на создание половины датасета ушла неделя.
Технические детали: SQLite gem в Rails поддержал пользовательские функции (UDF) — через них добавили regexp, if и stddev, чтобы не переписывать миграции. Unsigned bigint в MariaDB пришлось заменить на обычные bigint, потому что SQLite их не поддерживает. Collation utf8mb4_general_ci заменили на NOCASE, который, к сожалению, работает только с ASCII. Для полнотекстового поиска использовали Contentless-Delete Tables — они не включены по умолчанию, но работают лучше. Старые миграции Rails переместили в отдельную папку, чтобы db:migrate не сломался. Тесты Lobste.rs оказались незаменимы для проверки без ручного тестирования.
Из пожеланий: было бы здорово иметь в тестах проверку «упади, если встретишь полное сканирование таблицы» — это отловило бы проблемы первого деплоя. И создавать реалистичный датасет для тестов должно быть проще, чем писать скрипты вручную и ждать неделю.