הגדרת NTP במכונת מחשוב

הרבה מערכות תוכנה שתלויות ברצף מדויק של אירועים מסתמכות על שעון מערכת יציב ועקבי. במערכות האלה נעשה לרוב שימוש ביומני מערכת עם חותמות זמן כדי לוודא שהזמן מסונכרן ולנפות באגים בזמן שהם מתרחשים. כדי לשמור על סנכרון של שעוני המערכת, המופעים של Compute Engine מוגדרים מראש לשימוש ב-Network Time Protocol ‏ (NTP), פתרון משולב של חומרה ותוכנה לסנכרון זמן.

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

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

סקירה כללית על שרתי NTP של Google ועל leap smearing

בדרך כלל, כדי להטמיע שניות מעוברות במערכת הפעלה של Unix, חוזרים על השנייה האחרונה של היום. הדבר עלול לגרום לבעיות בתוכנות שמצפות שחותמות הזמן רק יגדלו. כדי לפתור את הבעיה הזו, שרתי הזמן Cloud de Confiance by S3NSמפזרים את השנייה הנוספת על פני 24 שעות – 12 שעות לפני אירוע השנייה המעוברת ו-12 שעות אחריו – כדי שהמחשבים לא יראו את השנייה הנוספת בבת אחת כחותמת זמן חוזרת. כך אפשר להפחית את הסיכון במערכות שתלויות בחותמת זמן עקבית. מומלץ להגדיר את כל מופעי החישוב לשימוש בשירותי ה-NTP הפנימיים של Google.

המלצה שלא להשתמש בשירותי NTP חיצוניים

Cloud de Confiance לא יכול לחזות איך שירותי NTP חיצוניים, כמו pool.ntp.org, מטפלים בשניות מעוברות. מומלץ מאוד לא להשתמש במקורות NTP חיצוניים עם מופעי המחשוב. אם משתמשים גם בשירות NTP של Google וגם בשירות חיצוני, יכולים להתרחש שינויים בלתי צפויים בשעון המערכת. עדיף להשתמש במקור NTP חיצוני יחיד מאשר בשילוב של כמה מקורות, אבל שירותי NTP חיצוניים, כמו pool.ntp.org, משתמשים לעיתים קרובות בשיטת stepping כדי לטפל בשניות מעוברות. כתוצאה מכך, יכול להיות שיופיעו חותמות זמן חוזרות במופעים שלכם.

הגישה הבטוחה ביותר היא להגדיר את מופעי המחשוב כך שישתמשו בשרת NTP יחיד – שרת ה-NTP הפנימי ש-Google מספקת. מידע נוסף על שרת ה-NTP הפנימי ש-Google מספקת זמין בשאלות הנפוצות על Google Public NTP.

שימוש בשיטת ההחלקה של יום מעובר במערכות חיצוניות ל- Cloud de Confiance by S3NS

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

כדי לסנכרן מכשירים מחוץ ל- Cloud de Confiance by S3NS עם זמן מרוח, אפשר להשתמש ב-Google Public NTP במכשירים האלה. ‫Google Public NTP משתמש באותה שיטה של מריחת שניות מעוברות שמועברת למכונות של Compute Engine.

הגדרת NTP למופעים

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

‫Linux (chrony)

כברירת מחדל, ברוב הגרסאות של Linux נעשה שימוש ב-chrony כדי לנהל את הגדרות ה-NTP ואת סנכרון השעה. כדי לוודא ש-chrony משתמש רק בשירות NTP פנימי, בודקים את ההגדרה של chrony ומסירים שרתי NTP חיצוניים.

  1. משתמשים ב-ssh כדי להתחבר למופע של Compute.

    המסוף

    כדי להשתמש במסוף כדי להתחבר למופע של Compute באמצעות SSH, פועלים לפי השלבים הבאים:

    1. נכנסים לדף VM instances במסוף Cloud de Confiance .

      כניסה לדף VM instances

    2. לוחצים על הלחצן SSH של המכונה שרוצים להגדיר.

      לחצן SSH.

    gcloud

    כדי להשתמש ב-Google Cloud CLI כדי להתחבר למופע של Compute באמצעות SSH, מריצים את הפקודה הבאה:

    gcloud compute instances ssh INSTANCE_NAME
    

    מחליפים את INSTANCE_NAME בשם המכונה שאליה מתחברים.

  2. במופע, מריצים את הפקודה chronyc sources כדי לבדוק את המצב הנוכחי של הגדרת ה-NTP:

    $ chronyc sources
    

    הפלט אמור להיראות כך:

     210 Number of sources = 2
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   6   377     4    -14us[  -28us] +/-  257us
     ^- 38.229.53.9                   2   6    37     4   -283us[ -297us] +/-   28ms
    

    אם מופיע רשומה אחת שמצביעה על metadata.google או על metadata.google.internal, לא צריך לבצע שינויים. אם אתם רואים כמה מקורות, חלקם metadata.google ומקור ציבורי כמו pool.ntp.org, צריך לעדכן את המקורות כדי להסיר שרתים חיצוניים של NTP.

    בדוגמה של הפלט, יש שתי רשומות: אחת שמפנה אל metadata.google.internal ואחת שמפנה אל כתובת חיצונית. מכיוון שיש כמה מקורות, צריך לעדכן את שרתי ה-NTP כדי להסיר את כתובת 38.229.53.9, כמו שמתואר בשלב הבא.

  3. צריך להגדיר את שרתי ה-NTP כך ששרתי NTP חיצוניים יוסרו.

    כדי להסיר את שרת ה-NTP הנוסף מהרשימה, עורכים את הקובץ /etc/chrony/chrony.conf באמצעות כלי לעריכת טקסט. מאתרים את כל השורות שמתחילות ב-server external_source_ip_or_name ומסירים אותן.

    אחרי עריכת הקובץ /etc/chrony/chrony.conf, מפעילים מחדש את השירות chrony. הפקודה להפעלה מחדש עשויה להשתנות בהתאם להפצת Linux, כמו בדוגמאות הבאות:

    sudo service chrony restart
    
    sudo systemctl restart chrony
    
  4. כדי לוודא שההגדרות תקינות, מריצים שוב את הפקודה chronyc sources:

    $ chronyc sources
    

    הפלט אמור להיראות כך:

     210 Number of sources = 1
     MS Name/IP address         Stratum Poll Reach LastRx Last sample
     ===============================================================================
     ^* metadata.google.internal      2   7   377    98  -1343ns[-1588ns] +/-  396us
    

‫Linux ‏ (ntpd)

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

  1. משתמשים ב-ssh כדי להתחבר למופע של Compute.

    המסוף

    כדי להשתמש במסוף כדי להתחבר למופע של Compute באמצעות SSH, פועלים לפי השלבים הבאים:

    1. נכנסים לדף VM instances במסוף Cloud de Confiance .

      כניסה לדף VM instances

    2. לוחצים על הלחצן SSH של המכונה שרוצים להגדיר.

      לחצן SSH.

    gcloud

    כדי להשתמש ב-Google Cloud CLI כדי להתחבר למופע של Compute באמצעות SSH, מריצים את הפקודה הבאה:

    gcloud compute instances ssh INSTANCE_NAME
    

    מחליפים את INSTANCE_NAME בשם המכונה שאליה מתחברים.

  2. במופע, מריצים את הפקודה ntpq -p כדי לבדוק את המצב הנוכחי של הגדרת ה-NTP:

    $ ntpq -p
    

    הפלט אמור להיראות כך:

    remote           refid           st t when poll reach   delay   offset  jitter
    
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    *217.162.232.173 130.149.17.8     2 u  191 1024  176   79.245    3.589  27.454
    

    אם מופיע רשומה אחת שמצביעה על metadata.google או על metadata.google.internal, לא צריך לבצע שינויים. אם מופיעים כמה מקורות, חלקם metadata.google וחלקם מקורות ציבוריים כמו pool.ntp.org, צריך לעדכן את המקורות כדי להסיר את כל שרתי ה-NTP החיצוניים.

    בדוגמה של הפלט, יש שתי רשומות: אחת שמפנה אל metadata.google ואחת שמפנה אל כתובת חיצונית. מכיוון שיש כמה מקורות, צריך לעדכן את שרתי ה-NTP כדי להסיר את הכתובת *217.162.232.173, כמו שמתואר בשלב הבא.

  3. מגדירים את שרתי ה-NTP כך שיוסרו מקורות חיצוניים.

    כדי להגדיר את שרתי ה-NTP, עורכים את הקובץ /etc/ntp.conf באמצעות עורך הטקסט המועדף. מאתרים את הקטע servers בהגדרות ומסירים את כל מקורות ה-NTP שאינם של Google, לדוגמה:

    vim /etc/ntp.conf
    
    # You do need to talk to an NTP server or two (or three).
    #server ntp.your-provider.example
    ...
    server metadata.google.internal iburst
    

    אחרי עריכת הקובץ /etc/ntp.conf, מפעילים מחדש את שירות ה-NTP. הפקודה להפעלה מחדש עשויה להיות שונה מהדוגמה הבאה, בהתאם להפצת Linux שלכם:

    sudo service ntp reload
    
  4. כדי לוודא שההגדרות תקינות, מריצים שוב את הפקודה ntpq -p:

    ntpq -p
    
    remote           refid           st t when poll reach   delay   offset  jitter
    ==============================================================================
    *metadata.google 255.28.23.83     2 u   27   64    1    0.634   -2.537   2.285
    

Windows

  1. נכנסים לדף VM instances במסוף Cloud de Confiance .

    כניסה לדף VM instances

  2. לוחצים על הלחצן RDP לצד מופע Windows שאליו רוצים להתחבר.

    לחצן SSH.

  3. אחרי שמתחברים, לוחצים לחיצה ימנית על סמל PowerShell ובוחרים באפשרות הפעלה כמנהל מערכת.

    הסמל של PowerShell.

  4. כששורת הפקודה נטענת, מריצים את הפקודה הבאה כדי לראות את הגדרת ה-NTP הנוכחית:

    w32tm /query /configuration
    
    [Configuration]
    ...
    Type: NTP (Local)
    NtpServer: metadata.google.internal,
    ...
    

    אם מופיע רשומה אחת שמצביעה על metadata.google או על metadata.google.internal, לא צריך לבצע שינויים. אם מופיעים כמה מקורות, חלקם metadata.google וחלקם מקור ציבורי, צריך להסיר את השרת החיצוני. פועלים לפי המדריך של Windows להגדרת שרת NTP.

  5. כדי להבטיח את התאימות הרחבה ביותר של תוכנות במכונות וירטואליות של Windows,‏ Google ממליצה להשתמש במנהל ההתקן gVNIC כדי להבטיח דיוק של NTP ברמת אלפית השנייה עם metadata.google.

    אם אתם חייבים להשתמש ב-VirtIO עם מכונת Windows וירטואלית, כדי לקבל דיוק של פחות מאלפית השנייה עם שרתי NTP, Google ממליצה לא להשתמש בשירות Windows Time (צריך לעצור ולבטל את הרישום של w32tm).

    1. מפסיקים את שירות הזמן של Windows:

      net stop w32time
      
    2. מסירים את שירות הזמן של Windows מהרישום:

      w32tm /unregister
      
    3. אחרי שמפסיקים את שירות הזמן של Windows ומסירים אותו מהרישום, מתקינים את לקוח Meinberg NTP.

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

    4. מגדירים את שרת ה-NTP עבור לקוח ה-NTP של Meinberg כ-metadata.google.internal.

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

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

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