یوتیوب چگونه از 2.49 میلیارد کاربر با MYSQL پشتیبانی می کند؟
این پست به تشریح معماری Vitess می پردازد. اگر می خواهید درباره این معماری جالب رو بدانید با ما همراه باشید.
روزی روزگاری 3 نفر که برای پی پال کار می کردند تصمیم گرفتند یک سایت دوستیابی بسازند و اما این مدل کسب و کار آنها شکست خورد.
آنها برای ایجاد یک سایت اشتراکگذاری ویدئو روی آوردند و آن را YouTube نامیدند و عناوین ویدیویی، توضیحات و داده های کاربر را در MySQL ذخیره کردند.
با پیوستن کاربران بیشتر، MySQL را براساس توپولوژی leader-follower به این مقیاس تنظیم کردند.
اما تکثیر در MySQL تک رشته ای است و بنابراین فالوورها نمیتوانستند با دادههای تازه در مورد عملیات نوشتن شدید برای leader، همراهی کنند.
با این حال نرخ رشد آنها انفجاری بود.
و به یک میلیارد کاربر رسید تا به دومین سایت پربازدید در جهان تبدیل شود.
بنابراین آنها با افزودن یک کش کوچک و همه رویدادها را از لاگ باینری MySQL بارگذاری کردند. این بدان معناست که تکرار به حافظه محدود می شود و سریعتر می شود.
اگرچه به طور موقت مشکل مقیاس پذیری آنها را حل کرد، اما مشکلات جدیدی وجود داشت.
در اینجا به برخی از آنها اشاره می کنیم:
۱- شاردینگ (Sharding) :
MySQL باید برای رسیدگی به نیازهای ذخیره سازی پارتیشن بندی شود و اما تراکنش ها و پیوستن ها پس از اشتراک گذاری مشکل می شوند.
بنابراین منطق برنامه باید آن را مدیریت کند و به این معنی است که منطق برنامه باید چه شارد هایی را پرس و جو کند و این احتمال خرابی را افزایش می دهد.
۲- عملکرد (Performance) :
توپولوژی leader-follower باعث می شود که داده های قدیمی از فالوورها خوانده شوند. بنابراین منطق برنامه باید در صورت نیاز به داده های تازه، reads را به leader هدایت کند و این نیاز به اجرای منطق اضافی دارد.
۳- حفاظت (Protection) :
این خطر وجود دارد که برخی از پرس و جوها برای بازگرداندن داده ها بیش از حد طولانی شود. همچنین بسیاری از اتصالات MySQL در یک زمان می تواند مشکل ساز باشد و ممکن است پایگاه داده را از بین ببرد.
درباره Vitess MySQL
آنها یک لایه انتزاعی در بالای MySQL برای سادگی و مقیاس پذیری می خواستند و Vitess را ایجاد کردند.
در اینجا Vitess مقیاس پذیری فوق العاده ارائه می دهد:
تعامل با پایگاه داده:
در مقابل هر نمونه MySQL یک سرور sidecar نصب کردند و آن را VTTablet نامیدند.
به آنها اجازه داد:
سرور MySQL را کنترل کنید و پشتیبان گیری از پایگاه داده را مدیریت کنید و پرس و جوهای گران را با اضافه کردن بند حد بازنویسی کنید.
برای جلوگیری از مشکلات پی در پی کش، دادههایی که مکرر به آنها دسترسی دارند را در حافظه پنهان ذخیره کنید.
مسیریابی پرس و جوهای SQL:
آنها یک سرور پراکسی بدون حالت برای مسیریابی کوئری ها راه اندازی کردند و آن را VTGate نامیدند.
به آنها اجازه داد:
VTTablet صحیح را برای مسیریابی یک پرس و جو بر اساس طرح و طرح شاردینگ (Sharding) پیدا کنید و از طریق ادغام اتصال، تعداد اتصالات MySQL را کم نگه دارید. پروتکل MySQL را با لایه برنامه صحبت کند.
برای سادگی، مانند یک سرور MySQL یکپارچه عمل کند و تعداد تراکنش ها را در یک زمان برای عملکرد محدود کند.
علاوه بر این، آنها بسیاری از سرورهای VTGate را برای مقیاس بزرگتر اجرا می کنند.
اطلاعات State:
آنها یک پایگاه داده توزیع شده key-value برای ذخیره اطلاعات در مورد طرح ها، طرح های شاردینگ (Sharding) و نقش ها راه اندازی کردند.
همچنین از روابط بین پایگاه های داده مانند leader و followers مراقبت می کند و از Zookeeper برای پیاده سازی پایگاه داده key-value استفاده می کنند.
علاوه بر این، آنها این داده ها را برای عملکرد بهتر در VTGate ذخیره می کنند.
یک سرور HTTP را برای به روز نگه داشتن پایگاه داده key-value اجرا می کنند و آن را VTctld نامیدند.
کل لیست سرورها و روابط آنها را دریافت می کند و سپس پایگاه داده key-value را به روز می کند.
TL;DR:
VTGate: سرور پروکسی برای مسیریابی کوئری ها
پایگاه داده Key-Value: سرور پیکربندی برای مدیریت توپولوژی
VTTablet: سرور sidecar در حال اجرا بر روی هر MySQL
آنها Vitess را در Go نوشتند و آن را منبع باز کردند و همچنین از MariaDB پشتیبانی می کند.
در حالی که یوتیوب توانست با ترکیب Vitess MySQL به 2.49 میلیارد کاربر خدمات رسانی کند و این مطالعه موردی نشان میدهد که MySQL به راحتی میتواند ترافیک در مقیاس اینترنت را مدیریت کند.