עיצוב סכמה לנתונים של סדרות זמנים

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

סדרת זמנים היא אוסף של נתונים שמורכב ממדידות ומהזמנים שבהם המדידות נרשמות. דוגמאות לסדרות זמן:

  • הגרף של השימוש בזיכרון במחשב
  • טמפרטורה לאורך זמן בכתבת חדשות
  • מחירי מניות בשוק לאורך תקופה

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

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

אלה דפוסי העיצוב הבסיסיים לאחסון נתונים של סדרות זמן ב-Bigtable:

נתונים לדוגמה

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

מדידה דוגמה
  1. חותמות הזמן בדף הזה מפורמטות כמו ‎ `tYYYY-MM-DD-HHMM` ‎ כדי שיהיה קל לקרוא אותן. בטבלת ייצור, חותמות הזמן מיוצגות בדרך כלל כמספר המיקרו-שניות מאז 1970-01-01 00:00:00 UTC, כמו ‎ `1616264288050807`‎.
לחץ (פסקל) 94587
טמפרטורה (במעלות צלזיוס) 9.5
לחות (אחוזים) 65
גובה (במטרים) 601
נתונים קשורים דוגמה
מזהה בלון 3698
מיקום asia-southeast1
חותמת זמן1 t2021-03-05-1204

קטגוריות זמן

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

גודל הבאקט שבו משתמשים – למשל דקה, שעה או יום – תלוי בשאילתות שמתכננים להשתמש בהן ובמגבלות הגודל של נתוני Bigtable. לדוגמה, אם שורות שמכילות נתונים של שעה גדלות יותר מהגודל המקסימלי המומלץ לכל שורה של 100MB, אז כנראה שעדיף לבחור בשורות שמייצגות חצי שעה או דקה.

היתרונות של דפוסי משבצות זמן כוללים:

  • תיהנו מביצועים טובים יותר. לדוגמה, אם מאחסנים 100 מדידות, Bigtable כותב וקורא את המדידות האלה מהר יותר אם הן בשורה אחת מאשר אם הן ב-100 שורות.

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

החסרונות כוללים:

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

הוספת עמודות חדשות לאירועים חדשים

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

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

בדוגמה הזו, אחרי שלוש דקות שורה יכולה להיראות כך:

מפתח שורה 94558 94122 95992
us-west2#3698#pressure#week1 ‪"" (t2021-03-05-1200) "" (t2021-03-05-1201) ‪"" (t2021-03-05-1202)

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

הוספת תאים חדשים לאירועים חדשים

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

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

בכל פעם שבלון שולח את המדידות שלו, האפליקציה כותבת ערכים חדשים בשורה שמכילה את הנתונים של הבלון מהשבוע הנוכחי, וכותבת תאים נוספים עם חותמת זמן בכל עמודה. בסוף השבוע, לכל עמודה בכל שורה יש מדידה אחת לכל דקה בשבוע, או 10,080 תאים (אם מדיניות איסוף האשפה שלך מאפשרת זאת).

כל עמודה בכל שורה מכילה מדידה לכל דקה בשבוע. במקרה הזה, אחרי שלוש דקות, שתי העמודות הראשונות בשורה יכולות להיראות כך:

מפתח שורה לחץ temp
asia-south2#3698#week1 ‫94558 (t2021-03-05-1200) ‫9.5 (t2021-03-05-1200)
94122 (t2021-03-05-1201) ‫9.4 (t2021-03-05-1201)
95992 (t2021-03-05-1202) ‫9.2 (t2021-03-05-1202)

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

  • אתם רוצים למדוד שינויים במדידות לאורך זמן.

שורות עם חותמת זמן אחת

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

סדרת נתונים עם חותמת זמן אחת

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

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

מפתח שורה measurements_blob
us-west2#3698#2021-03-05-1200 protobuf_1
us-west2#3698#2021-03-05-1201 protobuf_2
us-west2#3698#2021-03-05-1202 protobuf_3
us-west2#3698#2021-03-05-1203 protobuf_4

היתרונות של התבנית הזו כוללים:

  • יעילות האחסון

  • מהירות

החסרונות כוללים:

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

  • הצורך לבצע דה-סריאליזציה של הנתונים אחרי הקריאה

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

  • כמעט תמיד צריך לאחזר את כל המדידות של אירוע מסוים בו-זמנית.

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

  • כל אירוע מכיל כל כך הרבה מדידות, שאם מאחסנים את הנתונים בכמה עמודות, יכול להיות שתחרגו מהמגבלה של 100MB לכל שורה.

חותמת זמן יחידה לא סדרתית

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

היתרונות של התבנית הזו כוללים:

  • בדרך כלל קל יותר להטמיע אותו מאשר תבנית של קטגוריית זמן.

  • יכול להיות שתקדישו פחות זמן לשיפור הסכימה לפני שתשתמשו בה.

החסרונות של התבנית הזו לרוב עולים על היתרונות:

  • הביצועים של Bigtable פחות טובים עם הדפוס הזה.

  • הדחיסה של נתונים שמאוחסנים בדרך הזו פחות יעילה בהשוואה לדחיסה של נתונים בעמודות רחבות יותר.

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

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

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

  • אתם רוצים לאחסן מספר בלתי מוגבל של אירועים.

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

מפתח שורה לחץ טמפרטורה לחות גובה
us-west2#3698#2021-03-05-1200 94558 9.6 61 612
us-west2#3698#2021-03-05-1201 94122 9.7 62 611
us-west2#3698#2021-03-05-1202 95992 9.5 58 602
us-west2#3698#2021-03-05-1203 96025 9.5 66 598
us-west2#3698#2021-03-05-1204 96021 9.6 63 624

אסטרטגיות נוספות

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

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

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