چگونه کوئرا دیتابیس MySQL را برای ۳۰۰ میلیون کاربر بهینه کرد؟
بهینهسازی دیتابیس کوئرا: راهکاری برای مدیریت ۳۰۰ میلیون کاربر و دادههای ترابایتی

مقدمه: کوئرا، پلتفرم یادگیری و برنامهنویسی
کوئرا یکی از بزرگترین پلتفرمهای آموزش و حل تمرین برنامهنویسی در ایران است که هزاران دانشجو، توسعهدهنده و شرکتهای فناوری از آن برای یادگیری، برگزاری مسابقات کدنویسی و استخدام استفاده میکنند. این پلتفرم روزانه بیش از ۲۵,۰۰۰ سؤال و ۳۰۰ میلیون کاربر ماهانه دارد. چنین حجمی از کاربران و دادهها، چالشهای زیادی را برای مدیریت و بهینهسازی پایگاه داده ایجاد میکند.
با وجود حجم عظیم دادهها و صدها هزار Query Per Second (QPS)، کوئرا همچنان از MySQL به عنوان پایگاه داده اصلی خود استفاده میکند. اما این سیستم سنتی چگونه توانسته این حجم از درخواستها را مدیریت کند؟ در این مقاله، نگاهی به استراتژیهای کوئرا برای بهینهسازی دیتابیس و افزایش کارایی آن خواهیم داشت.
۱. رشد کاربران و افزایش بار دیتابیس
با افزایش کاربران، بار دیتابیس کوئرا به طرز چشمگیری بالا رفت. حجم دادهها به پتابایت رسید و ویژگیهای مبتنی بر یادگیری ماشین (ML) نیز باعث افزایش بیشتر این بار شدند. علاوه بر این، اسپمرها نیز بخشی از بار اضافه را تشکیل میدادند. بنابراین، کوئرا نیاز به بهینهسازی و کاهش بار دیتابیس داشت.
۲. تمرکز بر خواندن و حجم داده
دیتابیس کوئرا عمدتاً در سه بخش بار زیادی را تجربه میکرد:
- خواندن (Reads): حدود ۷۰٪ از ترافیک
- حجم داده (Data Volume): که طی ۵ سال ۲۰۰٪ رشد داشت
- نوشتن (Writes): بار کم اما حساس
با توجه به اینکه بیشتر ترافیک روی خواندن بود، کوئرا تصمیم گرفت روی بهینهسازی خواندن و کاهش حجم داده تمرکز کند.
۳. بهینهسازی خواندن و اسکنهای بزرگ
برای کاهش بار دیتابیس، کوئرا اسکنهای بزرگ را با صفحهبندی (Pagination) و LIMIT بهینه کرد. این کار باعث شد که اسکنهای غیرضروری حذف شوند و سرعت کوئریها تا ۶۰٪ افزایش یابد. منظور از اسکن هم پیمایش صفحه به صفحه اطلاعات برای یافتن رکوردهایی است که به عنوان نتیجه یک کوئری باید به کاربر برگردانده شود.
۴. طراحی مجدد ایندکسها و بهینهسازی کوئریها
برای بهینهسازی بیشتر:
- ایندکسها بازنگری و بهینهسازی شدند.
- ستونهای غیرضروری حذف شدند.
- ORDER BY به کلاینت منتقل شد. همانطور که میدانید عملیات مرتب سازی، منابع سیستمی زیادی را لازم دارد که کلا به سمت کلاینت منتقل شد.
- کوئریهای غیرضروری حذف شدند.
این تغییرات باعث شد که بار CPU تا ۵۰٪ کاهش یابد.
۵. بهینهسازی کش برای کاهش QPS
با تغییر کلید کش (Cache Key) به uid، میزان QPS بیش از ۹۰٪ کاهش یافت که باعث بهبود عملکرد کلی سیستم شد.
۶. کاهش حجم دادهها با MyRocks
برای مدیریت حجم بالای دادهها، کوئرا از MyRocks که توسط فیسبوک توسعه یافته، استفاده کرد. این فناوری باعث شد:
- فضای ذخیرهسازی تا ۸۰٪ برای برخی جداول کاهش یابد.
- برای سایر جداول، کاهش ۵۰-۶۰٪ در حجم دادهها اتفاق بیفتد.
۷. بهینهسازی با فشردهسازی و تسریع فرآیند بکاپ
MyRocks با فشردهسازی بهتر، باعث شد:
- IO کاهش یابد.
- زمان بکاپ و ریستور ۵۰٪ سریعتر شود.
- شاردهای قدیمی (بیش از ۱۸ ماه) به MyRocks منتقل شوند.
۸. حل مشکل تأخیر با رپلیکیشن موازی
برای بهبود فرآیند نوشتن، کوئرا از رپلیکیشن موازی (Parallel Replication) استفاده کرد. پیش از این، بین دیتابیس اصلی و رپلیکا تأخیری وجود داشت؛ چرا که وقتی رپلیکا مشغول پردازش کوئریهای سنگین بود، مجبور میشد تا اتمام تراکنشهای دیتابیس اصلی صبر کند. با موازیسازی فرآیند رپلیکیشن، این تأخیر حذف شد و بار بهتر توزیع شد.
۹. نتیجهگیری: چطور کوئرا MySQL را برای ۳۰۰ میلیون کاربر بهینه کرد؟
با این استراتژیها، کوئرا توانست عملکرد دیتابیس MySQL خود را برای ۳۰۰ میلیون کاربر بهینه کند:
✅ بهینهسازی کش و کوئریها
✅ استفاده از MyRocks برای کاهش حجم داده
✅ پیادهسازی رپلیکیشن موازی برای بهینهسازی نوشتن
این تجربه ارزشمند، که توسط Saman (@teal33t) در توئیتر به اشتراک گذاشته شده، نمونهای از مدیریت و بهینهسازی دیتابیس در مقیاس بزرگ است.
📌 منبع: توئیتر Saman (@teal33t)