Spanner Omni משיג עקביות חיצונית בסביבות בניהול עצמי על ידי הטמעה של גרסה מבוססת-תוכנה של TrueTime API. המערכת הזו מבוססת על ארכיטקטורה של אשכולות כדי לספק חותמות זמן מהימנות, וכך לוודא שהעסקאות משקפות סדר סדרתי קפדני בכל התשתית.
כדי לשמור על חותמות זמן מדויקות ועקביות ועל יכולת סריאליזציה, צריך להגדיר שרת זמן ראשי ולקוחות מבוססי-מארח שמחשבים את מרווחי הזמן על סמך זמן האחזור ברשת וסחיפת השעון. עוקבים אחרי ביצועי הפריסה באמצעות מדדים ספציפיים, ומוודאים שהחומרה הבסיסית עומדת במפרטים הנדרשים לשגיאה בקצב השעון ולסנכרון חותמות הזמן.
Spanner Omni ו-TrueTime
כדי לספק את אותה עקביות חיצונית כמו בגרסה המנוהלת של Spanner, Spanner Omni משתמשת בהטמעה מבוססת-תוכנה של TrueTime API של Google. בסביבת Spanner המנוהלת, TrueTime משיג מרווחי אי-ודאות צרים באמצעות שימוש במספר שרתי זמן שמסונכרנים עם מקלטי GPS פיזיים ושעונים אטומיים. מכיוון ש-Spanner Omni פועל על תשתית בניהול עצמי ולא יכול להסתמך על החומרה הפיזית הזו, הוא משיג עקביות באמצעות ארכיטקטורה מבוססת-אשכולות.
ביישום הזה, כל העסקאות מתבצעות בסדר עוקב.
אם עסקה מסתיימת לפני שעסקה אחרת מתחילה, העסקה השנייה משקפת את ההשפעות של העסקה הראשונה. Spanner Omni מסתמך על רצף סיבתי מהסוג הבא: אם קריאה ל-t1 = TrueTime::Now() מסתיימת לפני שמתחילה קריאה ל-t2 = TrueTime::Now() (גם במכונות שונות), אז t2.latest מאוחר יותר מ-t1.earliest. הקצאת חותמות זמן של ביצוע פעולות (commit) מהמרווחים האלה מאפשרת ל-Spanner Omni לוודא שאם פעולה t1 מתבצעת לפני שפעולה t2 מתחילה, חותמות הזמן של המפתחות משקפות את העובדה שפעולה t1 התרחשה לפני פעולה t2.
מידע נוסף על השימוש ב-TrueTime בגרסה המנוהלת של Spanner זמין במאמר TrueTime ועקביות חיצונית במסמכי התיעוד של Spanner.
ארכיטקטורת TrueTime
הארכיטקטורה מבוססת-האשכולות משתמשת בשני רכיבי ליבה כדי לספק TrueTime בכל הפריסה:
שרת זמן: האשכול מגדיר אחד משרתי מסד הנתונים כשרת הזמן הראשי. השרת הוא המקור המהימן היחיד לכל הפריסה של Spanner Omni, והוא מספק את השעה מהשעון המקומי שלו ברמת דיוק גבוהה. כדי להבטיח זמינות גבוהה, אם השרת הראשי מפסיק להגיב, האשכול מקדם באופן דינמי שרת מסד נתונים אחר כדי למלא את התפקיד הזה. שרת הזמן כלול בקובץ הבינארי של Spanner Omni, כך שלא נדרשת תשתית נפרדת או תלות חיצונית.
לקוח זמן: דימון ברקע פועל בכל מחשב מארח בפריסה. הוא שולח שאילתות לשרת הזמן הראשי באופן תקופתי כדי לאחזר פרמטרים של השעה הנוכחית, ומפרסם אותם לתהליכים שפועלים במחשב.
TrueTime מחשב מרווחי זמן על סמך סחיפת שעון מוגבלת וזמן הלוך ושוב (RTT) ברשת בין שרתי מסד הנתונים של Spanner Omni לבין שרת הזמן הראשי. לכל המכונות המארחות בפריסה צריכים להיות שעונים מקומיים שפועלים בתוך גבול ידוע של שגיאת הקצב שלהם.
השפעה של אי-ודאות (אפסילון) וזמן אחזור
ב-TrueTime, הזמן מיוצג כפרק זמן, [earliest, latest], ולא כערך יחיד. TrueTime מחשב את גודל מרווח אי-הוודאות הזה על סמך שני גורמים:
זמן הלוך ושוב ברשת (RTT): זמן האחזור במהלך הסנכרון בין לקוח הזמן לבין שרת הזמן הראשי. השגיאה של לקוחות זמן שנמצאים באותו מרכז נתונים כמו שרת הזמן הראשי נמוכה משמעותית בהשוואה ללקוחות שנמצאים במרכזי נתונים מרוחקים.
סטייה בשעון: הסטייה הטבעית של השעונים הפיזיים במכונות הלקוח והשרת בין סנכרונים.
רמת אי-ודאות גבוהה עלולה להאריך את זמני ההמתנה לאישור הטרנזקציות. עם זאת, מכיוון ששכפול Paxos דורש גם תקשורת ברשת, אי הוודאות של TrueTime לא מגדילה את זמן האחזור של אישור העסקה, כל עוד אי הוודאות קטנה מזמן האחזור של הלוך ושוב של Paxos.
מידע נוסף זמין במאמר Spanner under the hood: Understanding strict serializability and external consistency.
דרישות חומרה
כדי ש-TrueTime מבוסס תוכנה יפעל בצורה תקינה, החומרה הבסיסית צריכה לעמוד בדרישות הבאות:
- מונה חותמות זמן: צריך להשתמש במונה חותמות זמן בחומרה. בארכיטקטורות x86 של Linux, הדלפק הזה הוא Time Stamp Counter (TSC).
- שגיאה בקצב השעון עם גבולות: השעונים המקומיים צריכים לפעול בתוך שגיאה ידועה ומוגבלת בקצב מהתדר הנומינלי שלהם. אפשר לעקוב אחרי הפרות של שגיאת תדר השעון באמצעות המדד
sla_tester_violation_count. מידע נוסף זמין במאמר בנושא TrueTime observability.
מגבלות
אין תמיכה ב-TrueTime במהלך מיגרציות פעילות של מכונות וירטואליות או קונטיינרים שמופעלים באמצעות Spanner Omni. יש חריגים לסוגים ספציפיים של מכונות שעומדות בדרישות ולתמונות מכונה של אמזון (AMI) בפלטפורמות כמו Amazon Web Services (AWS). מידע נוסף זמין במאמר בנושא דרישות המערכת של Spanner Omni.
ניראות (observability)
אפשר להשתמש בלוח הבקרה TrueTime ב-Grafana כדי לעקוב אחרי המדדים הבאים. אתם יכולים להשתמש במדדים האלה כדי לוודא ש-TrueTime מבוסס התוכנה פועל בפרמטרים הצפויים:
| מדד | תיאור | הפעולה המומלצת |
|---|---|---|
true_time_is_available |
בודקת אם TrueTime API זמין. | הגדרת התראות לגבי כל מקרה של חוסר זמינות. אם TrueTime לא זמין, סביר להניח שגם Spanner Omni לא זמין. יכול להיות שהמוצר לא זמין באופן זמני או קבוע, וצריך לבדוק את זה. |
sla_tester_violation_count |
מציין בעיות פוטנציאליות בהתנהגות השעון (clock behavior) או הפרות של דרישות החומרה. | בודקים כדי לזהות את הסיבה להפרות. הגורמים האפשריים לכך הם מיגרציות פעילות, השהיות של מכונות וירטואליות או פעולה של TSC מחוץ לטווח הצפוי של קצב השעון. |
true_time_interval_uncertainty |
מבצע מעקב אחרי האפסילון של מרווח TrueTime. | כדאי לעקוב אחרי המדד הזה כדי לצמצם את זמן האחזור של העסקאות. רמת אי ודאות גבוהה מאריכה את זמני ההמתנה לאישור, מה שעלול להגדיל את זמן האחזור הכולל של הטרנזקציה. |