איך אנחנו הופכים את התשתית של רובלוקס ליעילה וגמישה יותר - בלוג רובלוקס

איך אנחנו הופכים את התשתית של רובלוקס ליעילה וגמישה יותר - בלוג רובלוקס

צומת המקור: 2998456

ככל ש-Roblox גדל במהלך 16+ השנים האחרונות, כך גם קנה המידה והמורכבות של התשתית הטכנית התומכת במיליוני חוויות משותפות תלת-ממדיות. מספר המכונות שאנו תומכים בהן גדל יותר מפי שלושה במהלך השנתיים האחרונות, מכ-3 נכון ל-36,000 ביוני 30 לכמעט 2021 כיום. תמיכה בחוויות שתמיד פועלות עבור אנשים בכל רחבי העולם דורשת יותר מ-145,000 שירותים פנימיים. כדי לעזור לנו לשלוט בעלויות ובזמן השהיית הרשת, אנו פורסים ומנהלים את המכונות הללו כחלק מתשתית ענן פרטית היברידית מותאמת אישית הפועלת בעיקר בשטח.  

התשתית שלנו תומכת כיום ביותר מ-70 מיליון משתמשים פעילים מדי יום ברחבי העולם, כולל היוצרים המסתמכים על ה-Roblox's. כלכלה עבור העסקים שלהם. כל מיליוני האנשים האלה מצפים לרמה גבוהה מאוד של אמינות. בהתחשב באופי הסוחף של החוויות שלנו, קיימת סובלנות נמוכה ביותר לפיגורים או חביון, שלא לדבר על הפסקות. Roblox היא פלטפורמה לתקשורת וחיבור, שבה אנשים מתאחדים בחוויות תלת מימד סוחפות. כאשר אנשים מתקשרים כאווטרים שלהם במרחב סוחף, אפילו עיכובים או תקלות קלות בולטים יותר מאשר בשרשור טקסט או שיחת ועידה.

באוקטובר, 2021, חווינו הפסקה מערכתית. זה התחיל בקטן, עם בעיה ברכיב אחד במרכז נתונים אחד. אבל זה התפשט במהירות בזמן שחקרנו ובסופו של דבר הביא להפסקה של 73 שעות. בזמנו חלקנו את שניהם פרטים על מה שקרה וכמה מהלמידה המוקדמת שלנו מהנושא. מאז, אנו לומדים את הלמידה הללו ופועלים להגברת העמידות של התשתית שלנו לסוגי הכשלים המתרחשים בכל המערכות בקנה מידה גדול עקב גורמים כמו עליות תנועה קיצוניות, מזג אוויר, כשל חומרה, באגים בתוכנה או סתם. בני אדם עושים טעויות. כאשר תקלות אלו מתרחשות, כיצד אנו מבטיחים שבעיה ברכיב בודד, או קבוצת רכיבים, לא תתפשט למערכת המלאה? השאלה הזו הייתה המוקד שלנו בשנתיים האחרונות ובזמן שהעבודה נמשכת, מה שעשינו עד כה כבר משתלם. לדוגמה, במחצית הראשונה של 2023, חסכנו 125 מיליון שעות מעורבות בחודש בהשוואה למחצית הראשונה של 2022. כיום, אנו חולקים את העבודה שכבר עשינו, כמו גם את החזון לטווח ארוך שלנו לבנייה מערכת תשתית עמידה יותר.

בניית Backstop

בתוך מערכות תשתית בקנה מידה גדול, כשלים בקנה מידה קטן קורים פעמים רבות ביום. אם למכונה אחת יש בעיה ויש להוציא אותה משירות, זה ניתן לניהול מכיוון שרוב החברות מחזיקות מופעים מרובים של שירותי הקצה האחוריים שלהן. אז כאשר מופע בודד נכשל, אחרים אוספים את עומס העבודה. כדי לטפל בכשלים התכופים הללו, בקשות מוגדרות בדרך כלל לנסות שוב באופן אוטומטי אם הן מקבלות שגיאה.

זה הופך למאתגר כאשר מערכת או אדם מנסים שוב באגרסיביות מדי, מה שעלול להפוך לדרך לאותם כשלים בקנה מידה קטן להתפשט בכל התשתית לשירותים ומערכות אחרות. אם הרשת או המשתמש ינסו שוב באופן מתמשך מספיק, הם בסופו של דבר יעמיסו יתר על המידה כל מופע של שירות זה, ואולי גם מערכות אחרות, ברחבי העולם. ההפסקה שלנו ב-2021 הייתה תוצאה של משהו שדי נפוץ במערכות בקנה מידה גדול: תקלה מתחילה בקטן ואז מתפשטת במערכת, ומתעצמת כל כך מהר שקשה לפתור אותה לפני שהכל יורד. 

בזמן ההפסקה שלנו, היה לנו מרכז נתונים פעיל אחד (עם רכיבים בתוכו שפעלו כגיבוי). היינו צריכים את היכולת להיכשל באופן ידני למרכז נתונים חדש כאשר בעיה הורידה את הקיים. העדיפות הראשונה שלנו הייתה להבטיח שתהיה לנו פריסת גיבוי של Roblox, אז בנינו את הגיבוי הזה במרכז נתונים חדש, הממוקם באזור גיאוגרפי אחר. זה הוסיף הגנה לתרחיש הגרוע ביותר: הפסקה המתפשטת לכמות מספקת של רכיבים בתוך מרכז נתונים עד שהיא הופכת לבלתי פעילה לחלוטין. כעת יש לנו מרכז נתונים אחד שמטפל בעומסי עבודה (פעיל) ואחד במצב המתנה, המשמש כגיבוי (פאסיבי). המטרה ארוכת הטווח שלנו היא לעבור מתצורה אקטיבית-פאסיבית זו לתצורה אקטיבית-אקטיבית, שבה שני מרכזי הנתונים מטפלים בעומסי עבודה, כאשר מאזן עומסים מפיץ ביניהם בקשות על סמך זמן השהייה, קיבולת ותקינות. ברגע שזה יתקיים, אנו מצפים לקבל אמינות גבוהה עוד יותר עבור כל רובלוקס ונוכל להיכשל כמעט באופן מיידי ולא במשך מספר שעות.

מעבר לתשתית סלולרית

העדיפות הבאה שלנו הייתה ליצור חומות פיצוץ חזקות בתוך כל מרכז נתונים כדי לצמצם את האפשרות שמרכז נתונים שלם ייכשל. תאים (חברות מסוימות מכנות אותם אשכולות) הם בעצם קבוצה של מכונות וזו הדרך שבה אנחנו יוצרים את הקירות האלה. אנו משכפלים שירותים הן בתוך התאים והן על פני התאים לתוספת יתירות. בסופו של דבר, אנחנו רוצים שכל השירותים ב-Roblox יפעלו בתאים כדי שיוכלו להפיק תועלת מקירות פיצוץ חזקים ומיתירות. אם תא אינו מתפקד עוד, ניתן לבטל אותו בבטחה. שכפול בין תאים מאפשר לשירות להמשיך לפעול בזמן תיקון התא. במקרים מסוימים, תיקון התא עשוי להיות חידוש מלא של התא. בכל התעשייה, ניגוב והקצאה מחדש של מכונה בודדת, או סט קטן של מכונות, הוא די נפוץ, אבל לעשות זאת עבור תא שלם, המכיל ~1,400 מכונות, לא. 

כדי שזה יעבוד, התאים האלה צריכים להיות אחידים במידה רבה, כדי שנוכל להעביר עומסי עבודה במהירות וביעילות מתא אחד לאחר. קבענו דרישות מסוימות ששירותים צריכים לעמוד בהן לפני שהם פועלים בתא. לדוגמה, שירותים חייבים להיות מכוללים, מה שהופך אותם לניידים הרבה יותר ומונע מאף אחד לבצע שינויים בתצורה ברמת מערכת ההפעלה. אימצנו פילוסופיית תשתית-כקוד לתאים: במאגר קוד המקור שלנו, אנו כוללים את ההגדרה של כל מה שנמצא בתא כדי שנוכל לבנות אותו מחדש במהירות מאפס באמצעות כלים אוטומטיים. 

לא כל השירותים עומדים כעת בדרישות הללו, לכן פעלנו כדי לעזור לבעלי שירותים לעמוד בהן במידת האפשר, ובנינו כלים חדשים כדי להקל על העברת שירותים לתאים כשהם מוכנים. לדוגמה, כלי הפריסה החדש שלנו "מרחיב" באופן אוטומטי פריסת שירות על פני תאים, כך שבעלי שירותים לא צריכים לחשוב על אסטרטגיית השכפול. רמת קפדנות זו הופכת את תהליך ההגירה להרבה יותר מאתגר וגוזל זמן, אך התמורה לטווח ארוך תהיה מערכת שבה: 

  • הרבה יותר קל להכיל כשל ולמנוע את התפשטותו לתאים אחרים; 
  • מהנדסי התשתית שלנו יכולים להיות יעילים יותר ולנוע מהר יותר; ו 
  • המהנדסים שבונים את השירותים ברמת המוצר שנפרסים בסופו של דבר בתאים לא צריכים לדעת או לדאוג באילו תאים השירותים שלהם פועלים.

פתרון אתגרים גדולים יותר

בדומה לאופן שבו משתמשים בדלתות אש כדי להכיל להבות, תאים פועלים כקירות פיצוץ חזקים בתוך התשתית שלנו כדי לעזור להכיל כל בעיה שגורמת לכשל בתוך תא בודד. בסופו של דבר, כל השירותים המרכיבים את רובלוקס ייפרסו בצורה מיותרת בתוך ובתוך תאים. לאחר השלמת העבודה, בעיות עדיין יכולות להתפשט מספיק רחב כדי להפוך תא שלם לבלתי ניתן לפעולה, אבל יהיה קשה מאוד לבעיה להתפשט מעבר לתא הזה. ואם נצליח להפוך תאים להחלפה, ההתאוששות תהיה מהירה משמעותית כי נוכל להיכשל לתא אחר ולמנוע מהבעיה להשפיע על משתמשי קצה. 

המקום שבו זה נעשה מסובך הוא הפרדת התאים האלה מספיק כדי להפחית את ההזדמנות להפיץ שגיאות, תוך שמירה על ביצועים ופונקציונליים. במערכת תשתית מורכבת, שירותים צריכים לתקשר זה עם זה כדי לשתף שאילתות, מידע, עומסי עבודה וכו'. כאשר אנו משכפלים שירותים אלה לתאים, עלינו להיות מתחשבים לגבי האופן שבו אנו מנהלים תקשורת צולבת. בעולם אידיאלי, אנו מפנים תנועה מתא אחד לא בריא לתאים בריאים אחרים. אבל איך אנחנו מנהלים "שאילתה של מוות" - כזו גורם תא להיות לא בריא? אם ננתב מחדש את השאילתה לתא אחר, זה עלול לגרום לתא זה להפוך לא בריא בדיוק כפי שאנו מנסים להימנע ממנו. עלינו למצוא מנגנונים להעברת תנועה "טובה" מתאים לא בריאים תוך זיהוי וסיכוך התנועה שגורמת לתאים להיות לא בריאים. 

בטווח הקצר, פרסנו עותקים של שירותי מחשוב לכל תא מחשוב כך שרוב הבקשות למרכז הנתונים יוכלו להיות מסופקים על ידי תא בודד. אנחנו גם מבצעים איזון עומסים בתנועה בין תאים. במבט רחוק יותר, התחלנו לבנות תהליך גילוי שירותים של הדור הבא שימונף על ידי רשת שירות, אותה אנו מקווים להשלים בשנת 2024. זה יאפשר לנו ליישם מדיניות מתוחכמת שתאפשר תקשורת בין תאים רק כאשר זה לא ישפיע לרעה על תאי הכשל. עוד תגיע ב-2024 שיטה להפניית בקשות תלויות לגרסת שירות באותו תא, שתמזער תעבורה בין תאים ובכך תפחית את הסיכון להפצה בין תאים של כשלים.

בשיא, יותר מ-70 אחוז מתעבורת השירות האחורי שלנו מוגשת מחוץ לתאים ולמדנו הרבה על איך ליצור תאים, אבל אנו צופים יותר מחקר ובדיקות ככל שאנו ממשיכים להעביר את השירותים שלנו עד 2024 מעבר. ככל שנתקדם, קירות הפיצוץ הללו יתחזקו יותר ויותר.

העברת תשתית שפועלת תמיד

Roblox היא פלטפורמה גלובלית התומכת במשתמשים בכל רחבי העולם, כך שאיננו יכולים להעביר שירותים בזמן שיא או "השבתה", מה שמקשה עוד יותר על תהליך העברת כל המכונות שלנו לתאים והשירותים שלנו כדי שיפעלו בתאים האלה . יש לנו מיליוני חוויות תמיד שצריכות להמשיך להיות נתמכות, גם כשאנחנו מעבירים את המכונות שהן פועלות בהן ואת השירותים התומכים בהן. כשהתחלנו את התהליך הזה, לא היו לנו עשרות אלפי מכונות שפשוט ישבו ללא שימוש וזמינות להעברה של עומסי העבודה האלה. 

עם זאת, היה לנו מספר קטן של מכונות נוספות שנרכשו בציפייה לצמיחה עתידית. כדי להתחיל, בנינו תאים חדשים באמצעות המכונות הללו, ולאחר מכן העברנו אליהם עומסי עבודה. אנו מעריכים יעילות כמו גם אמינות, אז במקום לצאת ולקנות עוד מכונות ברגע שנגמרו לנו המכונות ה"רזרביות", בנינו יותר תאים על ידי מחיקה והקצאה מחדש של המכונות מהן עברנו. לאחר מכן העברנו עומסי עבודה למכונות שהוקצו מחדש, והתחלנו את התהליך מחדש. תהליך זה מורכב - מכיוון שמכונות מוחלפות ומתפנות להיבנות בתאים, הן אינן מתפנות בצורה אידיאלית ומסודרת. הם מפוצלים פיזית בין אולמות נתונים, מה שמותיר לנו לספק אותם בצורה חלקית, מה שדורש תהליך איחוי ברמת החומרה כדי לשמור על מיקומי החומרה מיושרים עם תחומי כשל פיזיים בקנה מידה גדול. 

חלק מצוות הנדסת התשתית שלנו מתמקד בהעברת עומסי עבודה קיימים מהסביבה הישנה שלנו, או ה"קדם-תא", לתאים. העבודה הזו תימשך עד שנעביר אלפי שירותי תשתית שונים ואלפי שירותים עורפיים לתאים שנבנו לאחרונה. אנו צופים שזה ייקח את כל השנה הבאה ואולי לתוך 2025, בגלל כמה גורמים מסבכים. ראשית, עבודה זו דורשת בניית כלי עבודה חזקים. לדוגמה, אנו זקוקים לכלי עבודה כדי לאזן מחדש באופן אוטומטי מספרים גדולים של שירותים כאשר אנו פורסים תא חדש - מבלי להשפיע על המשתמשים שלנו. ראינו גם שירותים שנבנו עם הנחות לגבי התשתית שלנו. אנחנו צריכים לשנות את השירותים האלה כדי שהם לא יהיו תלויים בדברים שיכולים להשתנות בעתיד כשנעבור לתאים. יישמנו גם דרך לחיפוש דפוסי עיצוב ידועים שלא יעבדו טוב עם ארכיטקטורה סלולרית, וגם תהליך בדיקה מתודי של כל שירות שהועבר. תהליכים אלה עוזרים לנו להתנער מכל בעיה מול המשתמש הנגרמת כתוצאה מכך ששירות אינו תואם לתאים.

כיום, קרוב ל-30,000 מכונות מנוהלות על ידי תאים. זה רק חלק קטן מהצי הכולל שלנו, אבל זה היה מעבר חלק מאוד עד כה ללא השפעה שלילית על השחקנים. המטרה הסופית שלנו היא שהמערכות שלנו ישיגו 99.99 אחוז זמן פעילות של משתמשים בכל חודש, כלומר נשבש לא יותר מ-0.01 אחוז משעות ההתקשרות. לא ניתן לבטל לחלוטין את זמני ההשבתה בכל התעשייה, אבל המטרה שלנו היא לצמצם כל זמן השבתה של רובלוקס במידה שכמעט לא ניתן להבחין בה.

הוכחה לעתיד תוך כדי קנה המידה

בעוד המאמצים המוקדמים שלנו מוכיחים את עצמם כמוצלחים, העבודה שלנו על תאים רחוקה מלהסתיים. ככל ש-Roblox ממשיכה להתרחב, נמשיך לפעול לשיפור היעילות והגמישות של המערכות שלנו באמצעות טכנולוגיות זו ואחרות. ככל שנלך, הפלטפורמה תהפוך יותר ויותר עמידה לבעיות, וכל בעיה שמתרחשת צריכה להפוך בהדרגה פחות גלויה ומפריעה לאנשים בפלטפורמה שלנו.

לסיכום, עד היום יש לנו: 

  • בנה מרכז נתונים שני והשיג בהצלחה סטטוס אקטיבי/פאסיבי. 
  • יצר תאים במרכזי הנתונים הפעילים והפאסיביים שלנו והעביר בהצלחה יותר מ-70 אחוז מתעבורת השירות האחורי שלנו לתאים אלו.
  • הגדר את הדרישות והשיטות המומלצות שעליהן נצטרך לפעול כדי לשמור על אחידות כל התאים בזמן שאנו ממשיכים להגר את שאר התשתית שלנו. 
  • הניע תהליך מתמשך של בניית "קירות פיצוץ" חזקים יותר בין תאים. 

ככל שתאים אלה הופכים להיות ניתנים להחלפה, תהיה פחות דיבור צולב בין תאים. זה פותח כמה הזדמנויות מעניינות מאוד עבורנו במונחים של הגברת האוטומציה סביב ניטור, פתרון בעיות ואפילו העברת עומסי עבודה אוטומטית. 

בספטמבר התחלנו גם להפעיל ניסויים פעילים/פעילים במרכזי הנתונים שלנו. זהו מנגנון נוסף שאנו בודקים כדי לשפר את האמינות ולמזער את זמני הכשל. ניסויים אלה עזרו לזהות מספר דפוסי עיצוב מערכת, בעיקר סביב גישה לנתונים, שעלינו לעבד אותם מחדש בזמן שאנו דוחפים לקראת הפיכתם לפעילים באופן מלא. בסך הכל, הניסוי היה מוצלח מספיק כדי להשאיר אותו פועל עבור תנועה ממספר מוגבל של משתמשים שלנו. 

אנו נרגשים להמשיך להניע את העבודה הזו קדימה כדי להביא ליעילות וגמישות רבה יותר לפלטפורמה. עבודה זו על תאים ותשתית אקטיבית, יחד עם המאמצים האחרים שלנו, יאפשרו לנו לצמוח לכלי עזר אמין ובעל ביצועים גבוהים עבור מיליוני אנשים ולהמשיך להגדיל את קנה המידה בזמן שאנו פועלים לחבר מיליארד אנשים במציאות זְמַן.

בול זמן:

עוד מ רובלוקס