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, המונה הזה הוא מונה חותמות הזמן (TSC).
- שגיאה בקצב השעון עם גבולות: שעונים מקומיים צריכים לפעול בתוך שגיאה ידועה ומוגבלת בקצב מהתדר הנומינלי שלהם. אפשר לעקוב אחרי הפרות של שגיאת קצב השעון באמצעות המדד
sla_tester_violation_count. מידע נוסף זמין במאמר בנושא יכולת הצפייה ב-TrueTime.
מגבלות
TrueTime לא נתמך במהלך מיגרציות פעילות של מכונות וירטואליות (VM) או של קונטיינרים שמופעל בהם 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 |
מציין בעיות פוטנציאליות בהתנהגות השעון או הפרות של דרישות החומרה. | בודקים כדי לזהות את הסיבה להפרות. הגורמים האפשריים לכך הם מיגרציות פעילות, השהיות של מכונות וירטואליות או פעולה של TSC מחוץ לטווח הצפוי של קצב השעון. |
true_time_interval_uncertainty |
מעקב אחרי אפסילון של מרווח הזמן של TrueTime. | כדאי לעקוב אחרי המדד הזה כדי לצמצם את זמן האחזור של העסקאות. אי ודאות גבוהה מאריכה את זמני ההמתנה לאישור, מה שיכול להאריך את זמן האחזור הכולל של הטרנזקציה. |