lobste.rs از MariaDB به SQLite کوچ کرد
خلاصهٔ کاملتر
توسعهدهندهای با نام کاربری thomas0 تو lobste.rs نوشته که با همکاری pushcx بالاخره پولریکوئست مهاجرت به SQLite رو روی پروداکشن دیپلوی کردن. عمداً تا صبح دوشنبه صبر کردن تا واکنش سیستم به پیک ترافیک هفته رو ببینن و بعد اعلام کنن.
نتیجه به روایت خودش: مصرف CPU پایین، مصرف حافظه پایین، سایت بهنظر سرعت بیشتری داره و بعد از خاموشکردن سرور MariaDB، هزینهٔ VPS نصف میشه. ایشیوی «مهاجرت به SQLite» که از سال ۲۰۱۹ باز بود هم همون روز بسته شد.
داستان پسزمینهش طولانیه. سال ۲۰۱۹ بحث سر رفتن به PostgreSQL بود، اما بعد از خرید MariaDB توسط K1 دوباره گفتگو باز شد و در نهایت سؤال «آیا lobsters میتونه روی SQLite اجرا بشه؟» مسیر رو عوض کرد. تلاش اول برای پولریکوئست بهخاطر بیوقتی بسته شد و نسخهٔ دوم شامل تست کارایی، اسکریپت اختصاصی انتقال دیتابیس و کار روی یکپارچگی داده بود.
دیپلوی اول شکست خورد. سایت تو حالت فقطخواندنی رفت ولی همون ترافیک خواندنی هم همهٔ هستهها رو صد درصد کرد و چون علتش پیدا نشد، برگردوندنش. نویسنده میگه بعد از اون دیپلوی حس خوبی نداشت، چون میدونست بدون دسترسی به دیتابیس پروداکشن، کارایی میتونه دردسر بشه.
ریشهٔ مشکل بعداً روشن شد: SQLite برای دو کوئری روی بزرگترین جدولها full table scan میزد و یه مورد n+1 هم وجود داشت. برای تلاش سوم یه اسکریپت ساخت انبوه داده نوشت که یک هفته طول کشید تا نصف حجم دادهٔ واقعی lobsters رو محلی بسازه، سه اصلاح کارایی رو کامیت کرد و یه لاگ کوئری کند هم اضافه کرد که اگه باز مشکلی پیش اومد دستش خالی نباشه. دیپلوی دوم بدون افت منابع پیش رفت و دو تا باگ کوچیک هم همونجا رفع شد.
درسهای فنی SQLite هم جالبن: جمِ SQLite از توابع تعریفشده توسط کاربر (UDF) پشتیبانی میکنه و تیم از همین برای پیادهسازی توابع غایب مثل regexp و stddev استفاده کرد تا مجبور به دور زدن کوئریها نشه. SQLite از bigint بدون علامت پشتیبانی نمیکنه، پس بعضی شناسهها باید تغییر میکردن. Collation ضعیفتره و بهجای utf8mb4_general_ci از NOCASE استفاده شد که فقط ASCII رو پوشش میده. برای جستجوی تماممتن هم توصیهش استفاده از contentless-delete tables ـه که پیشفرض نیست.
سمت Rails، پیشفرضهای PRAGMA برای این پروژه جواب داده، ولی مهاجرتهای دیتابیس ذاتاً وابسته به موتور دیتابیسن؛ مهاجرتهای قدیمی باید به یه پوشهٔ جدا منتقل میشدن تا db:migrate کار کنه. نویسنده تأکید میکنه مجموعه تستهای lobsters نقش کلیدی داشته تا بدون تست دستی انبوه، از درستی مهاجرت مطمئن بشه.
جمعبندی خودش دو تاست: ارتباط خوب بین همهٔ آدمهای درگیر شرط اصلی موفقیت این کار بوده، و مهاجرت دیتابیس زیرین بدون دسترسی به دادهٔ پروداکشن واقعاً سخته — دفعهٔ بعد اول یه دیتاست هماندازهٔ واقعی میسازه. دو آرزو هم داره: بشه تو تست گفت «اگه به full table scan رسیدی fail کن»، و ساختن دیتاست شبیه پروداکشن اینقدر دستی و زمانبر نباشه.
نکات کلیدی:
- lobste.rs از MariaDB به SQLite مهاجرت کرد؛ CPU و رم پایینتر و هزینهٔ VPS نصف
- دیپلوی اول بهخاطر full table scan روی جدولهای بزرگ برگشت خورد
- سه اصلاح کوئری بهعلاوهٔ رفع یه n+1 مشکل کارایی رو حل کرد
- توابع غایب SQLite مثل regexp و stddev با UDF پیاده شدن
- SQLite bigint بدون علامت نداره و collationش (NOCASE) فقط ASCII رو پوشش میده
- درس اصلی: مهاجرت بدون دسترسی به دادهٔ پروداکشن سخته؛ اول دیتاست واقعی بساز




