הגדרות פריסה

במאמר הזה מתוארות הגדרות פריסה של Spanner Omni במכונות וירטואליות (VM) או בשרתי מתכת חשופה. במאמר מוסבר על המבנה ואפשרויות ההגדרה של קובץ הגדרות הפריסה ב-YAML ‏(deployment.yaml) שמשמש להגדרת טופולוגיות של פריסת מכונות וירטואליות ופרמטרים של זמן ריצה כשמשתמשים ב-Spanner Omni CLI.

כדי ללמוד איך ליצור פריסה, אפשר לעיין באחד מהמאמרים הבאים:

סקירה כללית של הגדרת הפריסה

כשיוצרים פריסה במכונות וירטואליות או בשרתי מתכת חשופה, מעבירים את קובץ ההגדרות הזה לפקודה spanner deployment create ב-CLI של Spanner Omni:

spanner deployment create --config-file=deployment.yaml

הגדרות הפריסה מגדירות את הרכיבים העיקריים הבאים:

  • מצב שרת יחיד: מצב אופטימיזציה שמגביל את כל הפריסה לשרת יחיד לצורך פיתוח ובדיקה.
  • ‫Locations: אתרים פיזיים או אזורים בענן שבהם נמצאים השרתים שלכם.
  • מרחקי מיקום: השהיות ברשת בין זוגות של מיקומים.
  • אזורים: קבוצות לוגיות של שרתים שמייצגות עותקים משוכפלים של Paxos.
  • שרתי Root: שרתים ייעודיים שאחראים על מטא-נתונים של אזורים ועל קוורום של חברים.
  • ‫Replica types: תפקידים לכל אזור (קריאה-כתיבה, עדות או קריאה בלבד).
  • הסכם רמת שירות (SLA) של השעון: פרמטרים של סנכרון TrueTime, כולל תנודות בשעון ושגיאה בשיעור הסחיפה.
  • הגדרות פריסה: הגדרות גלובליות כמו מיקומי מנהיגים מועדפים והגדרות אבטחה של אימות.

מבנה קובץ התצורה

בדוגמה הבאה מוצג המבנה ברמה העליונה של קובץ הגדרות פריסה:

# Deployment name
name: regional-deployment

# Restrict the entire deployment to a single server (optional, default: false)
single_server: false

# Physical or logical locations (regions)
location:
  - name: us-central1

# Network distances between locations (optional)
location_distance:
  - src: us-central1
    dest: us-east1
    latency_ms: 30

# Zones and root servers in the deployment
zone:
  - name: us-central1-a
    location: us-central1
    single_server: false
    replica_type: READ_WRITE
    root_server:
      - host: rootserver1.example.internal
        port_base: 15000

# Clock synchronization SLA parameters (optional)
clock_sla:
  jitter_in_s: 0.005
  rate_error_in_ppm: 200

# Deployment settings (optional)
deployment_settings:
  preferred_leader_location: us-central1
  security_settings:
    insecure_mode: true

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

הגדרות הפריסה תומכות בשדות הבאים ברמה העליונה:

שדה סוג תיאור
name String שם הפריסה, למשל prod, staging או regional-deployment.
single_server בוליאני זה שינוי אופציונלי. אם הערך הוא true, כל הפריסה היא פריסה של שרת יחיד, והיא מוגבלת לאזור אחד ולשרת אחד. אי אפשר להוסיף אזורים או שרתים לפריסות שנוצרו באמצעות single_server: true אחרי שהן נוצרו. אם רוצים להריץ את Spanner Omni במצב של שרת יחיד, לא צריך ליצור את ההגדרה הזו באופן ידני כי Spanner Omni יוצר אותה באופן אוטומטי כשמריצים את הפקודה spanner start-single-server. ברירת המחדל היא false.
location רשימת אובייקטים המיקומים הפיזיים או הלוגיים (אזורים) בפריסה.
location_distance רשימת אובייקטים זה שינוי אופציונלי. זמן האחזור ברשת בין זוגות של מיקומים.
zone רשימת אובייקטים חובה. האזורים שמרכיבים את הפריסה. צריך לציין לפחות אזור אחד.
clock_sla אובייקט זה שינוי אופציונלי. הפרמטרים של הסכם רמת השירות (SLA) של שירות סנכרון השעון לתוכנת TrueTime.
deployment_settings אובייקט זה שינוי אופציונלי. הגדרות זמן ריצה למיקום מועדף של שרת ראשי ולאימות אבטחה.

שם הפריסה

בשדה name מצוין שם שהמשתמש בחר לפריסה. אפשר להשתמש בכל מחרוזת שמזהה את הפריסה, כמו prod, staging או regional-deployment.

מצב שרת יחיד

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

אם רוצים להריץ את Spanner Omni במצב של שרת יחיד, לא צריך ליצור את ההגדרה הזו באופן ידני. כשמריצים את הפקודה spanner start-single-server, ‏ Spanner Omni יוצר את ההגדרה הזו באופן אוטומטי. מידע נוסף זמין במאמר אפשרות א': פריסה של שרת יחיד.

השדה single_server ברמה העליונה שונה מהשדה single_server ברמת האזור:

  • השדה ברמה העליונה single_server חל על כל הפריסה.
  • השדה zone-level single_server רלוונטי רק לאזור ספציפי בפריסה. מידע נוסף מופיע במאמר בנושא אזורים עם שרת יחיד.

מיקומים

מיקום מייצג מרכז נתונים פיזי או אזור בענן שבו נמצאים המכונות (שווה לאזור ב- Google Cloud).

מגדירים מיקומים ברשימה location:

location:
  - name: us-central1
  - name: europe-west2

שמות המיקומים צריכים לעמוד בדרישות הבאות:

  • הוא חייב להתחיל באות ולהסתיים באות או בספרה.
  • הוא יכול להכיל רק אותיות, ספרות, קווים תחתונים (_) ומקפים (-).
  • אפשר גם לכלול קידומת דומיין ואחריה נקודתיים (לדוגמה, cloud.google.com:us-east1 או onprem:datacenter1).
  • אי אפשר להשתמש בשם השמור default.
  • חייב להיות ייחודי בכל הפריסה.

מרחקים מהמיקום

הרשימה location_distance מציינת את זמן האחזור ברשת בין זוגות של מיקומים. ‫Spanner Omni משתמש במידע הזה כדי לבצע אופטימיזציה של השכפול וניתוב השאילתות.

location_distance:
  - src: us-central1
    dest: europe-west2
    latency_ms: 105
  - src: europe-west2
    dest: us-central1
    latency_ms: 110

כל אובייקט של מרחק ממיקום מכיל את השדות הבאים:

  • ‫src: חובה. השם של מיקום המקור. הערך צריך להיות זהה למיקום מוגדר ברשימה location.
  • ‫dest: חובה. שם מיקום היעד. הערך צריך להיות זהה למיקום מוגדר, ולא יכול להיות זהה לערך src.
  • ‫latency_ms: זמן האחזור ברשת באלפיות השנייה. הערך חייב להיות מספר שלם לא שלילי. אם לא מציינים את הערך הזה, Spanner Omni מניח שההשהיה זניחה (פחות ממילי-שנייה).

השהיית הרשת ברשתות פיזיות לא תמיד סימטרית. אם מציינים גם את (src, dest) וגם את (dest, src), ‏ Spanner Omni יתייחס לשני המדדים. אם מספקים רק כיוון אחד, Spanner Omni מניח שההשהיה בכיוון ההפוך זהה.

תחומים

תחום (zone) הוא קיבוץ לוגי של שרת אחד או יותר במיקום מסוים. לשכפול נתונים, כל אזור מייצג עותק Paxos. פריסה חייבת לכלול לפחות אזור אחד.

zone:
  - name: us-central1-a
    location: us-central1
    single_server: false
    replica_type: READ_WRITE
    root_server:
      - host: rootserver1.example.internal
        port_base: 15000
      - host: rootserver2.example.internal
        port_base: 15000
      - host: rootserver3.example.internal
        port_base: 15000

כל אובייקט של אזור תומך בשדות הבאים:

שדה סוג תיאור
name String חובה. שם האזור. השם צריך לעמוד באותם כללים כמו שמות של מיקומים. חייב להיות ייחודי בכל הפריסה.
location String השם של המיקום שבו נמצא האזור. הערך צריך להיות זהה למיקום מוגדר ברשימה location. אם לא מציינים אזור, Spanner Omni מקצה את האזור למיקום default.
single_server בוליאני זה שינוי אופציונלי. אם הערך הוא true, המשמעות היא שלאזור הזה יש רק שרת אחד (יכול להיות רק שרת בסיס אחד ולא שרתים אחרים). מבטל את התקורה של שכפול מטא-נתונים של אזור בתוך האזור. בפריסה של כמה אזורים, אפשר להגדיר את הערך הזה ל-true עבור אזורים ספציפיים, כמו אזור רפליקה WITNESS שלא מאחסן נתוני משתמשים, בעוד שאזורים אחרים כוללים כמה שרתים. ברירת המחדל היא false.
replica_type מחרוזת enum תפקיד הרפליקה של האזור בקוורומים של Paxos. הערכים הנתמכים הם READ_WRITE,‏ WITNESS ו-READ_ONLY. ברירת המחדל היא READ_WRITE.
root_server רשימת אובייקטים חובה. רשימת שרתי הבסיס באזור.

סוגי רפליקות

‫Spanner Omni תומך בשלושה סוגים של עותקים משוכפלים לאזורים:

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

כשמגדירים סוגי רפליקות, צריך לוודא שהפריסה עומדת בכללים הבאים:

  • הפריסה חייבת להכיל לפחות אזור READ_WRITE אחד.
  • מספר האזורים של READ_WRITE חייב להיות גדול ממספר האזורים של WITNESS.

שרתי בסיס

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

כשמגדירים שרתי בסיס ב-deployment.yaml, חשוב לזכור את ההנחיות הבאות:

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

כל אובייקט של שרת שורש תומך בשדות הבאים:

  • ‫host: חובה. שם המארח או כתובת ה-IP של המכונה שבה פועל השרת.
  • ‫port_base: אופציונלי. מספר היציאה ההתחלתי של השרת. ברירת המחדל היא 15000. היציאה הזו הופכת ליציאת ה-gRPC הציבורית לחיבורי לקוחות. צריך להזמין יציאות בטווח [port_base + 1, port_base + 31] (לדוגמה, 15001 עד 15031) לתהליכים פנימיים של Spanner Omni.

אזורים של שרת יחיד

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

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

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

  • שני התחומים READ_WRITE מכילים כמה שרתים (single_server: false) כדי לספק זמינות גבוהה ולהרחיב את יכולות המחשוב והאחסון של נתוני המשתמשים.
  • אפשר להגדיר את אזור WITNESS כאזור עם שרת יחיד או כאזור עם כמה שרתים, בהתאם לנפח ההצבעה של Paxos:
    • עומסי עבודה קטנים עד בינוניים: אם למכונה וירטואלית או לשרת יחיד יש מספיק קיבולת לעיבוד כל התנועה של הצבעות Paxos לפריסה, מגדירים את single_server: true. מכיוון שרפליקות של עדים רק מצביעות ולא שומרות נתוני משתמשים, השימוש בשרת יחיד מבטל את התקורה של שכפול מטא-נתונים בתוך אזור.
    • פריסות בקנה מידה גדול: אם יש לכם תפוקת כתיבה גבוהה או הרבה שרתים בכל אזור READ_WRITE (לדוגמה, עשרות או מאות צמתים), שרת יחיד עלול להיות עמוס מדי ולגרום לכשלים בהסכמה של Paxos. מגדירים את אזור WITNESS עם כמה שרתים (single_server: false) כדי לחלק את עומס העבודה של ההצבעה.

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

הסכם רמת שירות (SLA) של שעון

‫Spanner Omni מסתמך על תוכנת TrueTime כדי לספק עקביות חיצונית בלי לדרוש חומרת GPS מיוחדת או שעונים אטומיים. אובייקט clock_sla מגדיר את גבולות הסנכרון הצפויים לשעוני השרתים בכל הפריסה:

clock_sla:
  jitter_in_s: 0.005
  rate_error_in_ppm: 200

ההגדרה clock_sla כוללת את השדות הבאים:

  • ‫jitter_in_s: השגיאה המקסימלית הצפויה בשעון, בשניות. חייב להיות מספר בשיטת נקודה צפה לא שלילי (>= 0).
  • ‫rate_error_in_ppm: השגיאה המקסימלית בקצב סחיפת השעון בחלקים למיליון (ppm). הערך צריך להיות בין 0 ל-10000.

מידע נוסף על סנכרון זמן מופיע במאמר בנושא TrueTime ועקביות חיצונית.

הגדרות הפריסה

אובייקט deployment_settings מגדיר את אופן הפריסה הגלובלי, כולל העדפה למיקום של השרת הראשי ואבטחת הרשת:

deployment_settings:
  preferred_leader_location: us-central1
  security_settings:
    insecure_mode: false
    authentication_methods:
      - AUTHENTICATION_METHOD_PASSWORD
      - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
    password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE

מיקום מועדף של מנהיג

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

כשמגדירים את preferred_leader_location, חשוב לוודא את הפרטים הבאים:

  • המיקום שצוין צריך להיות זהה למיקום שמוגדר ברשימה location (או default).
  • המיקום המיועד חייב להכיל לפחות אזור READ_WRITE אחד.

הגדרות אבטחה

אובייקט security_settings מגדיר מצבי אימות והצפנה:

  • ‫insecure_mode: בוליאני. אם הערך הוא true, האימות וההרשאה של חיבורים נכנסים מושבתים. המצב הזה מיועד ליצירת אב טיפוס ולהערכה בלבד. ברירת המחדל היא false.
  • ‫authentication_methods: רשימה של שיטות אימות שמופעלות. חובה אם הערך של insecure_mode הוא false. ערכים נתמכים:
    • ‫AUTHENTICATION_METHOD_PASSWORD: הפעלה של אימות באמצעות שם משתמש וסיסמה.
    • ‫AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: הפעלה של אימות אישורי לקוח באמצעות TLS הדדי (mTLS).
  • ‫password_authentication_protocol: הפרוטוקול שמשמש לאימות הסיסמה. חובה אם המאפיין AUTHENTICATION_METHOD_PASSWORD נכלל במאפיין authentication_methods. ערך נתמך:
    • ‫PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: משתמש בפרוטוקול OPAQUE אסימטרי להחלפת מפתחות מאומתת באמצעות סיסמה.

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

דוגמאות להגדרות פריסה

בדוגמאות הבאות מוסבר על תבניות פריסה נפוצות.

פריסה אזורית מרובת אזורים

ההגדרה הבאה יוצרת פריסה אזורית של זמינות גבוהה בשלושה אזורים במיקום יחיד:

name: regional-prod
location:
  - name: us-central1
zone:
  - name: us-central1-a
    location: us-central1
    replica_type: READ_WRITE
    root_server:
      - host: root-a1.example.internal
      - host: root-a2.example.internal
      - host: root-a3.example.internal
  - name: us-central1-b
    location: us-central1
    replica_type: READ_WRITE
    root_server:
      - host: root-b1.example.internal
      - host: root-b2.example.internal
      - host: root-b3.example.internal
  - name: us-central1-c
    location: us-central1
    replica_type: READ_WRITE
    root_server:
      - host: root-c1.example.internal
      - host: root-c2.example.internal
      - host: root-c3.example.internal

פריסה בכמה מיקומים עם רפליקה של עד

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

name: multi-site-deployment
location:
  - name: datacenter-east
  - name: datacenter-west
  - name: datacenter-central
location_distance:
  - src: datacenter-east
    dest: datacenter-central
    latency_ms: 25
  - src: datacenter-central
    dest: datacenter-east
    latency_ms: 27
  - src: datacenter-central
    dest: datacenter-west
    latency_ms: 30
  - src: datacenter-west
    dest: datacenter-central
    latency_ms: 32
  - src: datacenter-east
    dest: datacenter-west
    latency_ms: 55
  - src: datacenter-west
    dest: datacenter-east
    latency_ms: 58
zone:
  - name: east-zone-1
    location: datacenter-east
    replica_type: READ_WRITE
    root_server:
      - host: east-root-1.example.internal
      - host: east-root-2.example.internal
      - host: east-root-3.example.internal
  - name: west-zone-1
    location: datacenter-west
    replica_type: READ_WRITE
    root_server:
      - host: west-root-1.example.internal
      - host: west-root-2.example.internal
      - host: west-root-3.example.internal
  - name: central-witness-zone
    location: datacenter-central
    single_server: true
    replica_type: WITNESS
    root_server:
      - host: witness-root-1.example.internal
deployment_settings:
  preferred_leader_location: datacenter-east

פריסה מאובטחת עם TLS ואימות

ההגדרה הבאה מגדירה פריסה עם mTLS ואימות באמצעות סיסמה:

name: secure-deployment
location:
  - name: us-central1
zone:
  - name: us-central1-a
    location: us-central1
    replica_type: READ_WRITE
    root_server:
      - host: server-1.example.internal
        port_base: 15000
      - host: server-2.example.internal
        port_base: 15000
      - host: server-3.example.internal
        port_base: 15000
deployment_settings:
  security_settings:
    insecure_mode: false
    authentication_methods:
      - AUTHENTICATION_METHOD_PASSWORD
      - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
    password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE

המאמרים הבאים