זרם שינויים עוקב אחרי שינויים בנתונים במסד נתונים של Spanner – הוספות, עדכונים ומחיקות – ומזרים אותם כמעט בזמן אמת.
בדף הזה מוצגת סקירה כללית של פידים לשינויים ב-Spanner: מה הם עושים ואיך הם פועלים. כדי ללמוד איך ליצור ולנהל סנכרון שינויים בזרמי נתונים במסד הנתונים ולקשר אותם לשירותים אחרים, אפשר לעיין בקישורים שבקטע השלבים הבאים.
המטרה של סנכרון שינויים בזרמי נתונים
סנכרון שינויים בזרמי נתונים מאפשר להזרים שינויים בנתונים לשירותים אחרים בצורה גמישה וניתנת להרחבה. תרחישים נפוצים לדוגמה:
שכפול שינויים בנתוני Spanner למחסן נתונים, כמו BigQuery, לצורך ניתוח.
הפעלת לוגיקה של אפליקציה על סמך שינויים בנתונים שנשלחים לתור הודעות, כמו Pub/Sub.
אחסון שינויים בנתונים ב-Cloud Storage, לצורכי תאימות או ארכיון.
שינוי ההגדרות של השידור
ב-Spanner, סנכרון שינויים בזרמי נתונים נחשב לאובייקט של סכימה, בדומה לטבלאות ולאינדקסים. לכן, יוצרים, משנים ומוחקים סנכרון שינויים בזרמי נתונים באמצעות הצהרות DDL, ואפשר לראות את סנכרון שינויים בזרמי נתונים של מסד נתונים בדיוק כמו אובייקטים אחרים של סכימה שמנוהלים על ידי DDL.
אפשר להגדיר את זרם השינויים כך שיעקוב אחרי שינויים בנתונים במסד נתונים שלם, או להגביל את ההיקף שלו לטבלאות ולעמודות ספציפיות. במסד נתונים יכולים להיות כמה סנכרוני שינויים בזרמי נתונים, ובטבלה או בעמודה מסוימת יכולים להיות כמה זרמים שעוקבים אחריהם, במסגרת המגבלות.
אפשר גם להגדיר את זרם השינויים עם האפשרויות הבאות:
- מציינים את תקופת שמירת הנתונים כדי לשנות את תקופת השמירה שמוגדרת כברירת מחדל, שהיא יום אחד.
- מציינים את סוג לכידת הערך כדי לשנות את סוג לכידת הערך שמוגדר כברירת מחדל
OLD_AND_NEW_VALUES. - החלת מסנן מחיקות מבוסס-TTL כדי לסנן מחיקות מבוססות-TTL מסנכרון שינויים בזרמי נתונים.
- החלת מסנן של שינויים בטבלה כדי להחריג את כל השינויים בטבלה מסוג
INSERT,UPDATEאוDELETE. - הפעלת החרגה של רשומות ברמת הטרנזקציה כדי להחריג טרנזקציות מסוימות מסנכרון שינויים בזרמי נתונים.
הפעלת ה-DDL שיוצר את זרם השינויים מתחילה פעולה ארוכת טווח. כשהתהליך מסתיים, זרם השינויים החדש מתחיל מיד לעקוב אחרי הטבלאות והעמודות שהוקצו לו.
צפייה בטבלאות ובעמודות באופן מרומז
כשמשתמשים בסנכרון שינויים בזרמי נתונים כדי לעקוב אחרי טבלה שלמה, המערכת עוקבת באופן מרומז אחרי כל העמודות בטבלה, גם אם הגדרת הטבלה מתעדכנת. לדוגמה, כשמוסיפים עמודות חדשות לטבלה, זרם השינויים מתחיל לעקוב אחרי העמודות החדשות באופן אוטומטי, בלי שצריך לשנות את ההגדרות של זרם השינויים. באופן דומה, הסטרימינג של השינויים מפסיק אוטומטית את המעקב אחרי עמודות שמוסרות מהטבלה.
סנכרון שינויים בזרמי נתונים של מסד נתונים שלם פועלים באותו אופן. הם עוקבים באופן מרומז אחרי כל עמודה בכל טבלה, עוקבים אוטומטית אחרי כל טבלה או עמודה שנוספו אחרי יצירת זרם השינויים, ומפסיקים לעקוב אחרי כל טבלה או עמודה שהוסרו.
צפייה מפורשת בטבלאות ובעמודות
אם מגדירים את זרם השינויים כך שיעקוב רק אחרי עמודות מסוימות בטבלה, ואחר כך מוסיפים עמודות לטבלה הזו, זרם השינויים לא יתחיל לעקוב אחרי העמודות האלה אלא אם תגדירו מחדש את זרם השינויים כך שיעקוב אחריהן.
בסכימת מסד הנתונים, סנכרון שינויים בזרמי נתונים נחשבים לאובייקטים שתלויים בעמודות או בטבלאות שהם עוקבים אחריהם באופן מפורש. כדי להסיר עמודה או טבלה כאלה, צריך להסיר אותן ידנית מההגדרה של כל פיד שינויים שעוקב אחריהן באופן מפורש.
סוגי שינויים בנתונים שסנכרון שינויים בזרמי נתונים עוקב אחריהם
השינויים בנתונים שזרם השינויים עוקב אחריהם כוללים את כל ההוספות, העדכונים והמחיקות שבוצעו בטבלאות ובעמודות שהוא עוקב אחריהן. השינויים האלה יכולים להגיע מהמקורות הבאים:
מחיקות מדורגות בטבלאות צאצא משולבות
מחיקות שנובעות מכללי אורך חיים (TTL)
סנכרון שינויים בזרמי נתונים יכול לעקוב אחרי שינויים בנתונים רק בעמודות ובטבלאות שנוצרו על ידי משתמשים. הם לא עוקבים אחרי אינדקסים, תצוגות, סנכרון שינויים בזרמי נתונים אחרים או טבלאות מערכת כמו סכימת המידע או טבלאות הנתונים הסטטיסטיים. השינויים בנתונים לא מתייחסים לעמודות שנוצרו, אלא אם העמודה היא חלק מהמפתח הראשי. המעקב מתבצע תמיד אחרי עמודות של מפתח ראשי.
בנוסף, סנכרון שינויים בזרמי נתונים לא עוקב אחרי שינויים בסכימה או אחרי שינויים בנתונים שנובעים ישירות משינויים בסכימה, למעט מילוי חוזר של ערכי ברירת מחדל. לדוגמה, בזרם שינויים שעוקב אחרי מסד נתונים שלם, מחיקה של טבלה לא נחשבת לשינוי בנתונים ולא מתועדת ככזו, למרות שהפעולה הזו מוחקת את כל הנתונים של הטבלה ממסד הנתונים.
איך Spanner כותב ומאחסן סנכרון שינויים בזרמי נתונים
בכל פעם שמערכת Spanner מזהה שינוי בנתונים בעמודה שנמצאת במעקב על ידי זרם שינויים, היא כותבת רשומה של שינוי בנתונים באחסון הפנימי שלה. הכתיבה של שינוי הנתונים והרישום של שינוי הנתונים מתבצעים באותה טרנזקציה. Spanner ממקם את שתי פעולות הכתיבה האלה באותו מקום כדי שהן יעובדו על ידי אותו שרת, וכך מצמצם את עיבוד הכתיבה. לאחר מכן, הטרנזקציה משוכפלת ברפליקות של מסד הנתונים, ולכן היא כרוכה בעלויות אחסון ושיכפול. מידע נוסף מפורט במאמר תמחור של Spanner.
תוכן של רשומה של שינוי בנתונים
כל רשומה של שינוי נתונים שנכתבת על ידי מקור נתונים לשינויים כוללת את המידע הבא על שינוי הנתונים:
השם של הטבלה המושפעת
השמות, הערכים וסוגי הנתונים של המפתחות הראשיים שמזהים את השורה שהשתנתה
השמות וסוגי הנתונים של העמודות בשורה שהשתנתה, שנאספו על סמך ההגדרה של הזרם לתיעוד שינויים.
הערכים הישנים של העמודות בשורה. הזמינות של הערכים הישנים והתוכן שהם עוקבים אחריו, שיכול להיות רק העמודות ששונו או כל השורה שעוקבים אחריה, תלויה בסוג לכידת הערכים שהמשתמש הגדיר.
הערכים החדשים של העמודות בשורה. הזמינות של הערכים החדשים והתוכן שהם עוקבים אחריו תלויה בסוג הערך לתיעוד שהמשתמש הגדיר.
סוג השינוי (הוספה, עדכון או מחיקה)
חותמת הזמן של השמירה
מזהה העסקה
מספר הרצף של הרשומה
סוג הלכידה של הערך ברשומה של שינוי הנתונים.
למידע נוסף על מבנה הרשומות של שינויי נתונים, אפשר לעיין במאמר רשומות של שינויי נתונים.
שמירת נתונים
במקור נתונים לשינויים נשמרים רשומות של שינויים בנתונים למשך תקופה של יום אחד עד 30 יום. אפשר להשתמש ב-DDL כדי לציין מגבלה על שמירת נתונים ששונה ממגבלת ברירת המחדל של יום אחד כשיוצרים לראשונה שידור שינויים, או כדי לשנות את המגבלה בכל שלב בעתיד. חשוב לדעת: אם תקטינו את מגבלת השמירה של נתונים בזרם שינויים, כל נתוני השינויים ההיסטוריים שגילם גבוה מהמגבלה החדשה לא יהיו זמינים יותר לקוראי זרם השינויים הזה, באופן מיידי וקבוע.
תקופת השמירה הזו של הנתונים היא פשרה: תקופת שמירה ארוכה יותר דורשת יותר נפח אחסון במסד הנתונים של הזרם.
סוג לכידת הערך
אפשרות ההגדרה value capture type (סוג לכידת הערך) של שינוי הנתונים בזמן אמת קובעת את האופן שבו הערכים של שורה שהשתנתה מאוחסנים. אפשר להשתמש ב-DDL כדי לציין אחד מסוגי הלכידה הבאים של ערכים בזרם שינויים:
OLD_AND_NEW_VALUES: מתעדת את הערכים הישנים והחדשים של העמודות ששונו בשורה.
NEW_VALUES: מתעד רק את הערכים החדשים של העמודות שאינן מפתח, אבל לא את הערכים הישנים.
NEW_ROW: מתעד את כל הערכים החדשים של העמודות שבמעקב, גם אם הן שונו וגם אם לא, בכל פעם שמתבצע שינוי באחת מהעמודות האלה. לא נשמרים ערכים ישנים.
NEW_ROW_AND_OLD_VALUES: מתעד את כל הערכים החדשים של העמודות ששונו ושל העמודות שלא שונו, ואת הערכים הישנים של העמודות ששונו.
החרגה של מחיקות שמבוססות על זמן החיים (TTL)
ב-Spanner, time-to-live (TTL) מאפשר להגדיר מדיניות למחיקה תקופתית של נתונים מטבלאות ב-Spanner.
כברירת מחדל, סנכרון שינויים בזרמי נתונים כולל את כל המחיקות שמבוססות על TTL. אפשר להשתמש בפרמטר
exclude_ttl_deletes כדי להגדיר את עדכון השינויים כך שלא יכלול מחיקות שמבוססות על TTL.
כשמגדירים את המסנן הזה כך שיחריג מחיקות שמבוססות על TTL, רק מחיקות עתידיות שמבוססות על TTL יוחרגו מזרם השינויים.
ערך ברירת המחדל של המסנן הזה הוא false. כדי להחריג מחיקות שמבוססות על TTL, מגדירים את המסנן לערך true. אפשר להוסיף את המסנן כשיוצרים את זרם השינויים או לשנות זרם שינויים קיים כדי לכלול את המסנן.
סוג השינוי בטבלה
כברירת מחדל, שינויים בטבלה כמו הוספות, עדכונים ומחיקות נכללים בסנכרון שינויים בזרמי נתונים. אפשר לסנן שינוי אחד או יותר בטבלה מהיקף השינויים בפיד באמצעות אפשרויות הסינון הבאות:
-
exclude_insert: לא לכלול את כל השינויים בטבלהINSERT -
exclude_update: לא לכלול את כל השינויים בטבלהUPDATE -
exclude_delete: לא לכלול את כל השינויים בטבלהDELETE
ערך ברירת המחדל של המסננים האלה הוא false. כדי להחריג סוג ספציפי של שינוי בטבלה, מגדירים את המסנן ל-true. אפשר להגדיר מסנן אחד או יותר בו-זמנית.
אפשר להוסיף מסנן לסוג שינוי בטבלה כשיוצרים זרם שינויים, או לשנות את המסנן לסוג שינוי בטבלה בזרם שינויים קיים.
החרגה של רשומות ברמת העסקה
כברירת מחדל, שינוי הנתונים בזמן אמת עוקב אחרי כל עסקאות הכתיבה במסד הנתונים כי האפשרות allow_txn_exclusion DDL מוגדרת ל-false. אפשר להגדיר את האפשרות allow_txn_exclusion לערך true כדי לאפשר לזרם השינויים להתעלם מרשומות מתוך טרנזקציות כתיבה שצוינו. אם לא מגדירים את האפשרות הזו לערך true, כל עסקאות הכתיבה נצפות, גם אם משתמשים בפרמטר exclude_txn_from_change_streams בעסקת הכתיבה.
אתם יכולים להפעיל את האפשרות הזו כשאתם יוצרים שידור שינויים או לשנות שידור שינויים קיים.
החרגת עסקת כתיבה מסנכרון שינויים בזרמי נתונים
כדי לא לכלול טרנזקציית כתיבה בפידים של שינויים, צריך להגדיר את הפרמטר exclude_txn_from_change_streams לערך true. הפרמטר הזה הוא חלק מהשיטות TransactionOptions ו-BatchWriteRequest. ערך ברירת המחדל של הפרמטר הזה הוא false. אפשר להגדיר את הפרמטר הזה באמצעות ה-API ל-RPC, ה-API בארכיטקטורת REST או באמצעות ספריות הלקוח. מידע נוסף זמין במאמר הגדרת טרנזקציית כתיבה להחרגה מסנכרון שינויים בזרמי נתונים.
אי אפשר להגדיר את הפרמטר הזה לערך true לעסקאות עם הרשאת קריאה בלבד. אם תעשו את זה, ה-API יחזיר שגיאה של ארגומנט לא תקין.
כשעוקבים אחרי שינויים בעמודות שמשתנות בעקבות טרנזקציות, אם exclude_txn_from_change_streams מוגדר כ-true, יכולים לקרות שני תרחישים:
- אם אפשרות ה-DDL
allow_txn_exclusionמוגדרת ל-true, העדכונים שבוצעו בעסקה הזו לא מתועדים בזרם השינויים. - אם לא מגדירים את האפשרות DDL
allow_txn_exclusionאו אם היא מוגדרת ל-false, העדכונים שבוצעו בתוך העסקה הזו מתועדים בפיד השינויים.
אם לא מגדירים את האפשרות exclude_txn_from_change_streams או אם היא מוגדרת לערך false, אז כל שינוי בעמודות שמתבצע על ידי טרנזקציות יתועד בסנכרון שינויים בזרמי נתונים.
קריאת סנכרון שינויים בזרמי נתונים
ב-Spanner יש כמה דרכים לקרוא את הנתונים של סנכרון שינויים בזרמי נתונים:
באמצעות Dataflow, באמצעות המחבר Apache Beam SpannerIO. זה הפתרון המומלץ שלנו לרוב האפליקציות של זרם השינויים. Google מספקת גם תבניות Dataflow לתרחישים נפוצים.
באופן ישיר, באמצעות Spanner API. השיטה הזו מאפשרת להשיג מהירות וגמישות מקסימליות, אבל היא לא כוללת את ההפשטה והיכולות של צינורות עיבוד נתונים של Dataflow.
באמצעות מחבר Kafka שמבוסס על Debezium לסנכרון שינויים בזרמי נתונים ב-Spanner. המחבר הזה מעביר בסטרימינג רשומות של שינויים ישירות לנושאים ב-Kafka.
שימוש ב-Datastream כדי להזרים את השינויים ישירות ל-BigQuery, לטבלאות Iceberg ב-BigLake או ל-Cloud Storage.
אפשר לספק בידוד חלקי לקריאות של סנכרון שינויים בזרמי נתונים באמצעות קריאות מופנות. קריאות ממוקדות יכולות לעזור למזער את ההשפעה על עומסי עבודה טרנזקציוניים במסד הנתונים. אפשר להשתמש ב-Spanner API כדי לנתב קריאות של זרמי שינויים לסוג רפליקה או לאזור ספציפיים בהגדרת מופע מרובה אזורים או בהגדרה אזורית מותאמת אישית עם אזורים אופציונליים לקריאה בלבד. מידע נוסף זמין במאמר בנושא קריאות מונחות.
שימוש ב-Dataflow
אתם יכולים להשתמש במחבר Apache Beam SpannerIO כדי לבנות צינורות עיבוד נתונים של Dataflow שקוראים מסנכרון שינויים בזרמי נתונים. אחרי שמגדירים את המחבר עם פרטים על שינוי ספציפי בזרם, הוא מוציא באופן אוטומטי רשומות חדשות של שינויי נתונים למערך נתונים יחיד ובלתי מוגבל של PCollection, שמוכן לעיבוד נוסף על ידי טרנספורמציות עוקבות בצינור Dataflow.
ב-Dataflow נעשה שימוש בפונקציות של חלונות כדי לחלק אוספים לא מוגבלים לרכיבים לוגיים, או חלונות. כתוצאה מכך, Dataflow מספק סטרימינג כמעט בזמן אמת כשקוראים מסנכרון שינויים בזרמי נתונים.
Google מספקת תבניות שמאפשרות ליצור במהירות צינורות עיבוד נתונים של Dataflow לתרחישי שימוש נפוצים בסנכרון שינויים בזרמי נתונים, כולל שליחת כל השינויים בנתונים של זרם למערך נתונים ב-BigQuery או העתקה שלהם לקטגוריה של Cloud Storage.
לסקירה מפורטת יותר על האופן שבו סנכרון שינויים בזרמי נתונים ו-Dataflow פועלים יחד, אפשר לעיין במאמר פיתוח פתרונות סנכרון שינויים בזרמי נתונים באמצעות Dataflow.
שימוש ב-API
במקום להשתמש ב-Dataflow כדי ליצור צינורות לעיבוד נתונים של סנכרון שינויים בזרמי נתונים, אפשר לכתוב קוד שמשתמש ב-Spanner API כדי לקרוא ישירות את הרשומות של סנכרון שינויים בזרמי נתונים. כך תוכלו לקרוא רשומות של שינויי נתונים באותו אופן שבו מחבר SpannerIO עושה זאת, על ידי מתן השהיות הנמוכות ביותר האפשריות בעת קריאת נתונים של זרם שינויים, במקום לספק את הגמישות של Dataflow.
מידע נוסף זמין במאמר סנכרון שינויים בזרמי נתונים. לדיון מפורט יותר על שליחת שאילתות לסנכרון שינויים בזרמי נתונים ועל פענוח הרשומות שמוחזרות, אפשר לעיין במאמר מחיצות, רשומות ושאילתות של סנכרון שינויים בזרמי נתונים.
שימוש במחבר Kafka
מחבר Kafka מוציא ישירות רשומות של זרם שינויים לנושא Kafka. הוא מסתיר את הפרטים של שאילתות של סנכרון שינויים בזרמי נתונים באמצעות Spanner API.
מידע נוסף על אופן הפעולה של סנכרון שינויים בזרמי נתונים ומחבר Kafka זמין במאמר פיתוח פתרונות סנכרון שינויים בזרמי נתונים באמצעות מחבר Kafka.
שימוש ב-Datastream
אפשר להשתמש ב-Datastream, שירות ללא שרת (serverless) קל לשימוש לסימון נתונים שהשתנו (CDC) וליצירת רפליקות, שזמין ב- Google Cloud. Datastream תומך בסנכרון שינויים בזרמי נתונים ב-Spanner, ומאפשר לקרוא את נתוני השינויים ולהזרים אותם ליעדים שונים.
מידע נוסף על התמיכה של Datastream ב-Spanner לקריאה ולהזרמה של נתונים משתנים זמין במאמר Spanner כמקור.
מגבלות
יש כמה מגבלות על סנכרון שינויים בזרמי נתונים, כולל המספר המקסימלי של סנכרון שינויים בזרמי נתונים שיכולים להיות במסד נתונים, והמספר המקסימלי של זרמי נתונים שיכולים לעקוב אחרי עמודה אחת. רשימה מלאה מופיעה במאמר מגבלות של עדכון נתונים בזמן אמת.
הרשאות
סנכרון שינויים בזרמי נתונים משתמש ברכיבים הבאים:
כדי ליצור, לעדכן או להסיר סנכרון שינויים בזרמי נתונים, צריך
spanner.databases.updateDdl.כדי לקרוא את הנתונים של מקור נתונים לשינויים צריך
spanner.databases.select.
אם משתמשים במחבר SpannerIO, לבעלים של משימת Dataflow שקוראת נתונים ממקור נתונים לשינויים נדרשות הרשאות נוספות של ניהול זהויות וגישה (IAM), במסד הנתונים של האפליקציה או במסד נתונים נפרד של מטא-נתונים. אפשר לעיין במאמר בנושא יצירת מסד נתונים של מטא-נתונים.
המאמרים הבאים
איך יוצרים ומנהלים מקורות נתונים לשינויים באמצעות תחביר DDL
אפשר להשתמש בסנכרון שינויים בזרמי נתונים ובתבניות כדי לבצע רפליקציה של שינויים מ-Spanner ל-BigQuery או ל-Cloud Storage.
מידע נוסף על יצירת צינורות Dataflow לעיבוד נתונים של שינויים
מידע נוסף על סנכרון שינויים בזרמי נתונים, כולל פרטים נוספים על הארכיטקטורה של סנכרון שינויים בזרמי נתונים, על אופן השאילתה של סנכרון שינויים בזרמי נתונים באמצעות ה-API ועל אופן הפרשנות של הרשומות שמוחזרות.
מידע נוסף על שימוש במחבר Kafka לעיבוד נתונים של מקורות נתונים לשינויים