سیستم های توزیع شده | چه چیزی می توانیم از قطع 3 روزه Roblox یاد بگیریم؟

در اکتبر سال 2021 ، Roblox طولانی ترین قطع در تاریخ خود 73 ساعت از خرابی کامل را متحمل شد و میلیون ها بازیکن در سراسر جهان را تحت تأثیر قرار داد. علت ریشه؟ یک مسئله ظریف و در عین حال ویرانگر در اعماق یک ساختار پایگاه داده منسوخ دفن شده است. آنچه این مورد را جذاب می کند این است که مسئله یک خرابی سیستم آشکار یا حمله خارجی نبوده است-این یک بدهی فنی آهسته سوخته بود که در پایگاه داده پنهان بود.
من به تازگی شیرجه عمیقی به پس از مرگ کردم و بینش ارزشمندی کسب کردم. این مسلماً یکی از دقیق ترین و دقیق ترین گزارش های خاموشی در دسترس به صورت آنلاین است.
🌐 زمینه:
Roblox از یک معماری میکروسرویس برای پس زمینه خود استفاده می کند. کنسول هاشیکورپ برای کشف خدمات ، خدمات داخلی را قادر به یافتن و برقراری ارتباط با یکدیگر می کند. بعد از ظهر 28 اکتبر ، یک سرور کنسول بار بار بالا CPU را تجربه کرد. عملکرد خوشه کنسول همچنان تخریب شد و در نهایت کل سیستم Roblox را کاهش داد زیرا کنسول به عنوان یک عمل کرد یک نقطه از شکستبشر مهندسان Roblox و Hashicorp برای تشخیص و حل مسئله همکاری کردند.
attempt تلاش های اشکال زدایی:
- مشکوک به شکست سخت افزار: تیم جایگزین یکی از گره های خوشه کنسول شد ، اما مسئله همچنان ادامه داشت.
- مشکوک افزایش ترافیک: این تیم تمام گره های خوشه کنسول را با ماشین های قدرتمندتر با 128 هسته (افزایش 2 برابر) و دیسک های SSD NVME سریعتر جایگزین کرد. این مسئله همچنین مسئله را حل نکرد.
- تنظیم مجدد وضعیت کنسول: این تیم کل خوشه کنسول را خاموش کرد و از چند ساعت قبل از شروع قطع ، وضعیت خود را با استفاده از عکس فوری بازگرداند. در ابتدا ، این سیستم پایدار به نظر می رسید ، اما به زودی دوباره تخریب شد و به یک کشور ناسالم بازگردد.
- کاهش استفاده از کنسول: خدمات Roblox که به طور معمول صدها نمونه در حال اجرا بودند ، به رقم های تک تقسیم می شدند. این رویکرد برای چند ساعت قبل از اینکه دوباره کنسول ناسالم شود ، تسکین موقت را فراهم می کند.
- شناسایی مسائل مربوط به مشاجره منابع: پس از بازرسی عمیق تر از سیاهههای اشکال زدایی ، این تیم مشکلات بحث در مورد منابع را کشف کرد. آنها به ماشینهای مشابه با استفاده از آنهایی که قبل از قطع شدن استفاده می شوند ، بازگشتند. سرانجام ، آنها این مسئله را شناسایی کردند: ویژگی جدید جریان کنسول. این ویژگی از عناصر کنترل همزمانی کمتری استفاده می کند (کانال های GO) ، که منجر به مشاجره بیش از حد در یک کانال واحد تحت بارهای زیاد خواندن/نوشتن شد. غیرفعال کردن جریان به طرز چشمگیری سلامت خوشه کنسول را بهبود بخشید.
- بهینه سازی انتخابات رهبر: این تیم کنسول را به طور متناوب انتخاب رهبران جدید خوشه ای را مشاهده کرد که طبیعی بود. با این حال ، برخی از رهبران همان مسائل مربوط به تأخیر را به نمایش گذاشتند. این تیم با جلوگیری از انتخاب رهبران مشکل ساز در این زمینه کار کرد.
✅ پیروی از این اقدامات ، سرانجام سیستم پایدار بود. این تیم با ترمیم سیستم های ذخیره سازی ، Roblox را با دقت به صورت آنلاین برگرداند و به تدریج اجازه می دهد تا بازیکنان انتخاب شده به طور تصادفی مجدداً وصل شوند. پس از 73 ساعت ، Roblox کاملاً عملیاتی بود.
free freelist Boltdb: یک مقصر ساکت
علت اصلی قطع این دو موضوع مهم است: ویژگی جریان کنسول (همانطور که در بالا ذکر شد) و پایگاه داده زیربنایی کنسول بولتدب نمایش تخریب عملکرد شدید ، که به نظر من بسیار جالب است.
کنسول برای اطمینان از سازگاری داده ها در یک محیط توزیع شده ، از اجماع قایق برای انتخابات رهبر استفاده می کند. برای پایداری ، برای ذخیره سیاهههای مربوط به قایق ، به BoltDB ، یک فروشگاه با ارزش کلیدی تعبیه شده متکی است.
مانند بسیاری از بانکهای اطلاعاتی ، boltdb دارای یک مستقل، که آهنگ می کند صفحات رایگان– فضای دیسک که قبلاً اشغال شده بود اما اکنون برای استفاده مجدد در دسترس است. این مکانیسم برای عملکرد کارآمد بانک اطلاعاتی ، جلوگیری از رشد غیر ضروری دیسک و بهینه سازی عملیات خواندن/نوشتن بسیار مهم است.
با این حال ، اجرای آزادیست Boltdb دارای ناکارآمدی بحرانی بود (کد منبع را در اینجا ببینید). از یک آرایه برای ذخیره شناسه هر صفحه رایگان استفاده کرد ، به این معنی که هر عملیات خواندن/نوشتن پایگاه داده شامل یک اسکن خطی از آزاد است. با بزرگ شدن آزاد ، هزینه عملیات به میزان قابل توجهی افزایش یافت.
جالب اینجاست که این شماره عملکرد برای اولین بار در سال 2016 گزارش شده است (شماره GitHub) ، اما هرگز برطرف نشده است. نویسنده Boltdb ، بن جانسون ، حفظ این پروژه را در سال 2017 متوقف کرد و اظهار داشت:
“حفظ یک بانک اطلاعاتی منبع باز نیاز به زمان و انرژی زیادی دارد. تغییر در کد می تواند اثرات ناخواسته و گاه فاجعه بار داشته باشد ، بنابراین حتی تغییرات ساده نیاز به ساعت آزمایش و اعتبار سنجی دقیق دارد.
متأسفانه ، من دیگر وقت و انرژی لازم برای ادامه این کار را ندارم. بولت در وضعیت پایدار قرار دارد و سالها استفاده موفق از تولید دارد. به همین ترتیب ، من احساس می کنم که ترک آن در وضعیت فعلی خود محتاط ترین مسیر عمل است
اگرچه BoltDB دیگر حفظ نشده بود ، جامعه GO آن را به پروژه جدیدی به نام BBOLT (BBOLT GitHub) برای ادامه نگهداری فعال و افزودن ویژگی های جدید پرداخت. متأسفانه ، کنسول هنوز از نسخه منسوخ و غیرقابل تحمل BOLTDB استفاده می کرد.
در سال 2019 ، سرانجام مسئله عملکرد آزاد در BBOLT (وبلاگ Alibaba Cloud) حل شد. رفع ساده بود: استفاده از هاشو به جای یک آرایه ، کاهش اسکن خطی بالای سر و اجازه جستجوی فوری. (🚀 من عاشق این هستم که چگونه یک ایده ساده باعث تقویت عملکرد عظیم می شود!)
از آنجا که این رفع به BBOLT متعهد شد-نه Boltdb-Consul از این پیشرفت سود نبرد ، در نهایت منجر به قطع سه روزه Roblox در سال 2021 شد.
questions سوالات بدون جواب
این پست چیزهای زیادی را پوشش داده است ، اما فقط چیزهای زیادی وجود دارد که می تواند در یک پست واحد قرار بگیرد. من به عنوان یک مهندس ، خودم را مشتاق به کشف جزئیات بیشتر می دانم. چندین سؤال جالب بدون پاسخ باقی مانده است:
چرا ویژگی جریان کنسول Roblox را زودتر به عقب نرسید؟
با توجه به اینکه کنسول در اوایل مقصر بود و تغییر قابل توجهی به زیرساخت های آن ایجاد شده بود ، بازگشت به عقب باید یکی از اولین مواردی بود که تلاش می شد. چه عواملی این تصمیم را به تأخیر انداخت؟
چرا فقط برخی از سرورهای کنسول مسئله عملکرد آزاد BOLTDB را تجربه کردند؟
از نظر تئوری ، همه سرورها باید در وضعیت مشابهی قرار داشته باشند زیرا رهبر معمولاً فقط با یک حاشیه کوچک از پیروان خود جلوتر است. با این حال ، فقط برخی از موارد دچار تخریب شدید شدند. چه عواملی باعث این ناسازگاری شده است؟
چرا بازگرداندن حالت کنسول با استفاده از عکس فوری قبلی مسئله را برطرف نکرد؟
فرضیه من این است که بازگرداندن وضعیت کنسول ، پرونده زیرین Raft.db BoltDB را در هر سرور تنظیم مجدد نکرد ، به این معنی که آزادیست نفخ حتی پس از بازپرداخت همچنان ادامه داشت. در صورت صحت ، این نشان می دهد که عکس های فوری شامل بهینه سازی های مهم برای ساختارهای بانک اطلاعاتی داخلی نیستند.
چرا قبل از عدم موفقیت دوباره ، کاهش استفاده از کنسول به طور موقت کار کرد؟
اگر آزادکار قبلاً خیلی بزرگ بود ، کاهش استفاده نباید هیچ تسکینی ایجاد می کرد. آیا مقیاس گذاری به طور موقت رشد آزاد را کند کرد ، و اجتناب ناپذیر را به تأخیر انداخت ، یا عامل دیگری در بازی بود؟
چرا ویژگی جریان جدید برای یک روز قبل از وقوع قطع کار کار کرد؟
اگر ویژگی جدید جریان کنسول ذاتاً ناقص بود ، چرا سیستم بلافاصله تخریب نشد؟ آیا یک بافر اولیه وجود داشت که به طور موقت مسئله را نقاب می کرد ، یا یک الگوی ترافیک خاص باعث خرابی می شد؟
از آنجا که مسئله عملکرد Freelist BoltDB سالهاست که وجود دارد ، چرا Roblox چنین تخریب عملکرد سیستم را در ماه های اولیه تجربه نکرده است؟
ناکارآمدی آزادیست Boltdb از سال 2016 یک مسئله شناخته شده بوده است. آیا ویژگی جریان کنسول جدید با افزایش چشمگیر عملیات نوشتن به BOLTDB ، مشکل را تشدید کرد؟
💡 انتهای
این گزارش پس از مرگ ، دروس ارزشمندی را ارائه می دهد ، و من همه را بسیار تشویق می کنم تا آن را بررسی کنند! همچنین بحث های گسترده ای در مورد این قطع اخبار هکر ، جایی که نویسنده Boltdb ، بن جانسون نیز در مکالمات شرکت کرده است ، وجود دارد.
من به عنوان یک مهندس نرم افزار ، من کاملاً معتقدم یک ویژگی اصلی یک مهندس بزرگ ، امکان حرکت کارآمد در سیستم های بزرگ و پیچیده و تشخیص مشکلات تحت فشار استبشر من عمیقاً مهندسان Roblox و Hashicorp را که برای بررسی و حل مسئله ، خستگی ناپذیر کار می کردند ، تحسین و احترام می گذارم. به خاطر مقاومت و تخصص خود از آنها استفاده می کند.
با تشکر از شما برای خواندن این تا کنون! اگر این پست را مفید دیدید ، اگر می توانستید آن را با دیگران به اشتراک بگذارید ، واقعاً از آن قدردانی می کنم.