אירועים ושידורים

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

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

מידע על אירועים

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

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

נתוני האירוע

נתוני אירועים הם המטען הייעודי (payload) של כל שינוי באובייקט נתון שמקורו במקור נתונים.

האירועים הם בפורמט Avro או JSON.

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

כשעובדים עם פורמט JSON, האירוע מכיל את השם והערך של כל עמודה.

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

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

מטא-נתונים כלליים

המטא-נתונים האלה זהים בכל סוגי השידורים.

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

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

הערכים האפשריים כוללים:

  • cdc
  • backfill
  • oracle-cdc-logminer
  • oracle-backfill
  • oracle-supplementation
  • mysql-cdc-binlog
  • mysql-backfill-incremental
  • mysql-backfill-fulldump
  • postgres-cdc-wal
  • postgresql-backfill
  • sqlserver-cdc
  • sqlserver-backfill
  • salesforce-cdc
  • salesforce-backfill
object מחרוזת מחרוזת השם שמשמש לקיבוץ סוגים שונים של אירועים, בדרך כלל השם של הטבלה או האובייקט במקור.
schema_key מחרוזת מחרוזת מזהה ייחודי של הסכימה המאוחדת של האירוע.
uuid מחרוזת מחרוזת מזהה ייחודי לאירוע שנוצר על ידי Datastream.
read_timestamp timestamp-millis מחרוזת חותמת הזמן (UTC) שבה הרשומה נקראה על ידי Datastream (חותמת הזמן של מערכת Unix באלפיות השנייה).
source_timestamp timestamp-millis מחרוזת חותמת הזמן (UTC) שבה הרשומה השתנתה במקור (חותמת הזמן של מערכת Unix באלפיות השנייה).
sort_keys {"type": "array", "items": ["string", "long"]} מערך מערך של ערכים שאפשר להשתמש בהם כדי למיין אירועים לפי הסדר שבו הם התרחשו.

מטא-נתונים ספציפיים למקור

המטא-נתונים האלה משויכים לאירועי CDC ומילוי חוסרים ממסד נתונים של מקור. כדי לראות את המטא-נתונים האלה, בוחרים מקור מהתפריט הנפתח הבא.

מקור שדה סוג Avro סוג JSON תיאור
MySQL log_file מחרוזת מחרוזת קובץ היומן שממנו Datastream שולף אירועים ברפליקציית CDC כשמשתמשים ברפליקציה שמבוססת על binlog.
MySQL log_position ארוך ארוך מיקום היומן (היסט) ביומן הבינארי של MySQL כשמשתמשים ברפליקציה שמבוססת על binlog.
MySQL binlog_file מחרוזת מחרוזת קובץ היומן הבינארי שממנו Datastream שולף אירועים ברפליקציית CDC כשמשתמשים ברפליקציה שמבוססת על GTID.
MySQL binlog_position ארוך ארוך המיקום (היסט) ביומן הבינארי של MySQL כשמשתמשים ברפליקציה שמבוססת על GTID.
MySQL gtid מחרוזת מחרוזת מזהה העסקה הגלובלי (GTID) שמזהה באופן ייחודי את העסקה של האירוע, כשמשתמשים ברפליקציה שמבוססת על GTID.
MySQL datastream_master_server_uuid מחרוזת מחרוזת ה-UUID של מכונת שרת המקור ב-MySQL שממנה Datastream קורא אירועים כשמשתמשים ברפליקציה שמבוססת על GTID.
MySQL datastream_master_server_id ארוך ארוך מזהה השרת של מכונת שרת המקור ב-MySQL שממנה Datastream קורא אירועים כשמשתמשים ברפליקציה שמבוססת על GTID.
MySQL primary_keys מערך מחרוזות מערך מחרוזות רשימת השמות של העמודות (אחת או יותר) שמרכיבות את המפתח הראשי של הטבלה. אם לטבלה אין מפתח ראשי, השדה הזה ריק.
MySQL is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
MySQL database מחרוזת מחרוזת מסד הנתונים שמשויך לאירוע.
MySQL table מחרוזת מחרוזת הטבלה שמשויכת לאירוע.
MySQL change_type מחרוזת מחרוזת

סוג השינוי (INSERT,‏ UPDATE-INSERT,‏ UPDATE-DELETE ו-DELETE) שהאירוע מייצג.

Oracle log_file מחרוזת מחרוזת קובץ היומן שממנו Datastream שולף אירועים ברפליקציית CDC.
Oracle scn ארוך ארוך מיקום היומן (היסט) ביומן הטרנזקציות של Oracle.
Oracle row_id מחרוזת מחרוזת ‫row_id של Oracle.
Oracle is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
Oracle database מחרוזת מחרוזת מסד הנתונים שמשויך לאירוע.
Oracle schema מחרוזת מחרוזת הסכימה שמשויכת לטבלה מהאירוע.
Oracle table מחרוזת מחרוזת הטבלה שמשויכת לאירוע.
Oracle change_type מחרוזת מחרוזת

סוג השינוי (INSERT,‏ UPDATE-INSERT,‏ UPDATE-DELETE ו-DELETE) שהאירוע מייצג.

Oracle tx_id מחרוזת מחרוזת מזהה העסקה שהאירוע שייך אליה.
Oracle rs_id מחרוזת מחרוזת המזהה של קבוצת הרשומות. השילוב של rs_id ו-ssn מזהה באופן ייחודי שורה ב-V$LOGMNR_CONTENTS. ‫rs_id מזהה באופן ייחודי את רשומת ה-redo שיצרה את השורה.
Oracle ssn ארוך ארוך מספר סידורי של SQL. המספר הזה משמש עם rs_id ומזהה באופן ייחודי שורה ב-V$LOGMNR_CONTENTS.
PostgreSQL schema מחרוזת מחרוזת הסכימה שמשויכת לטבלה מהאירוע.
PostgreSQL table מחרוזת מחרוזת הטבלה שמשויכת לאירוע.
PostgreSQL is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
PostgreSQL change_type מחרוזת מחרוזת סוג השינוי (INSERT, UPDATE, DELETE) שהאירוע מייצג.
PostgreSQL tx_id מחרוזת מחרוזת מזהה העסקה שהאירוע שייך אליה.
PostgreSQL lsn מחרוזת מחרוזת מספר הרצף ביומן של הרשומה הנוכחית.
PostgreSQL primary_keys מערך מחרוזות מערך מחרוזות רשימת השמות של העמודות (אחת או יותר) שמרכיבות את המפתח הראשי של הטבלה. אם לטבלה אין מפתח ראשי, השדה הזה ריק.
שרת SQL table מחרוזת מחרוזת הטבלה שמשויכת לאירוע.
שרת SQL database ארוך ארוך מסד הנתונים שמשויך לאירוע.
שרת SQL schema מערך מחרוזות מערך מחרוזות הסכימה שמשויכת לטבלה מהאירוע.
שרת SQL is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
שרת SQL lsn מחרוזת מחרוזת המספר הסידורי של האירוע ביומן.
שרת SQL tx_id מחרוזת מחרוזת מזהה העסקה שהאירוע שייך אליה.
שרת SQL physical_location מערך של מספרים שלמים מערך של מספרים שלמים המיקום הפיזי של רשומת היומן, שמתואר על ידי שלושה מספרים שלמים: מזהה הקובץ, מזהה הדף ומזהה המשבצת של הרשומה.
שרת SQL replication_index מערך מחרוזות מערך מחרוזות רשימת שמות העמודות של אינדקס שיכול לזהות באופן ייחודי שורה בטבלה.
שרת SQL change_type מחרוזת מחרוזת

סוג השינוי (INSERT, UPDATE, DELETE) שהאירוע מייצג.

Spanner commit_timestamp timestamp-micros מחרוזת חותמת הזמן של השמירה של האירוע.
Spanner snapshot בוליאני בוליאני אם האירוע הוא אירוע של תמונת מצב למילוי חוסרים.
Spanner project_id מחרוזת מחרוזת מזהה הפרויקט ב-Spanner.
Spanner instance_id מחרוזת מחרוזת המזהה של מכונת Spanner.
Spanner database_id מחרוזת מחרוזת המזהה של מסד הנתונים ב-Spanner.
Spanner schema מחרוזת מחרוזת הסכימה שמשויכת לטבלה מהאירוע. השדה ריק אם הטבלה לא נמצאת בסכימה עם שם.
Spanner table מחרוזת מחרוזת טבלת Spanner.
Spanner change_stream_name מחרוזת מחרוזת סנכרון שינויים בזרמי נתונים של Spanner.
Spanner server_transaction_id מחרוזת מחרוזת מזהה העסקה שמשויך לאירוע.
Spanner record_sequence long או string long או string רצף הרשומות שמשויך לאירוע. בסנכרון שינויים בזרמי נתונים שנוצרו במצב המחיצה IMMUTABLE_KEY_RANGE, הערך הוא מספר סידורי מסוג long. בסנכרון שינויים בזרמי נתונים שנוצר במצב המחיצה MUTABLE_KEY_RANGE, הערך הוא המחרוזת record_sequence מרשומת השינויים בנתונים, למשל 1cac8f3f38eeaf53-00000000.
Spanner mod_number ארוך ארוך מספר השינוי שמשויך לאירוע.
Spanner transaction_tag מחרוזת מחרוזת התג של העסקה המשויכת.
Spanner number_of_records_in_transaction ארוך ארוך מספר הרשומות בעסקה המשויכת.
Spanner value_capture_type מחרוזת מחרוזת סוג תיעוד הערכים של סנכרון השינויים בזרמי הנתונים. הערכים האפשריים הם NEW_ROW ו-NEW_ROW_AND_OLD_VALUES.
Spanner change_type מחרוזת מחרוזת סוג השינוי (INSERT,‏ UPDATE או DELETE) שהאירוע מייצג.
Spanner primary_keys מערך מחרוזות מערך מחרוזות רשימת העמודות של המפתח הראשי בטבלה.
Spanner is_deleted בוליאני בוליאני אם השינוי מייצג אירוע DELETE.
Salesforce object_name מחרוזת מחרוזת

השם של אובייקט Salesforce שמשויך לאירוע.

Salesforce domain מחרוזת מחרוזת

שם הדומיין שמשויך לאירוע.

Salesforce is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
Salesforce change_type מחרוזת מחרוזת

סוג השינוי (INSERT, UPDATE, DELETE) שהאירוע מייצג.

Salesforce primary_keys מערך מחרוזות מערך מחרוזות רשימת שמות העמודות שמרכיבות את המפתח הראשי של הטבלה. אם לטבלה אין מפתח ראשי, השדה הזה ריק.
MongoDB database מחרוזת מחרוזת מסד הנתונים שמשויך לאירוע.
MongoDB collection מחרוזת מחרוזת האוסף שמשויך לאירוע. אוספים דומים לטבלאות במסדי נתונים רלציוניים.
MongoDB change_type מחרוזת מחרוזת סוג השינוי (CREATE, UPDATE ו-DELETE) שהאירוע מייצג.
MongoDB is_deleted בוליאני בוליאני
  • הערך true מציין שהשורה נמחקה במקור.
  • הערך false מציין שהשורה לא נמחקה.
MongoDB primary_keys מערך מחרוזות מערך מחרוזות השדה _id שמשמש כמפתח הראשי לכל מסמך באוסף.

דוגמה לתהליך של אירוע

התרשים הזה ממחיש את האירועים שנוצרו על ידי שלוש פעולות עוקבות: INSERT,‏ UPDATE ו-DELETE, בשורה אחת בטבלה SAMPLE של מסד נתונים במקור.

שעה THIS_IS_MY_PK (int) FIELD1 (nchar nullable) FIELD2 (nchar לא ריק)>
0 1231535353 foo TLV
1 1231535353 NULL TLV

INSERT (T0)

המטען הייעודי (payload) של ההודעה מורכב מכל השורה החדשה.

{
  "stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
  "read_method": "oracle-cdc-logminer",
  "object": "SAMPLE.TBL",
  "uuid": "d7989206-380f-0e81-8056-240501101100",
  "read_timestamp": "2019-11-07T07:37:16.808Z",
  "source_timestamp": "2019-11-07T02:15:39",  
  "source_metadata": {
    "log_file": ""
    "scn": 15869116216871,
    "row_id": "AAAPwRAALAAMzMBABD",
    "is_deleted": false,
    "database": "DB1",
    "schema": "ROOT",
    "table": "SAMPLE"
    "change_type": "INSERT",
    "tx_id": 
    "rs_id": "0x0073c9.000a4e4c.01d0",
    "ssn": 67,
  },
  "payload": {
    "THIS_IS_MY_PK": "1231535353",
    "FIELD1": "foo",
    "FIELD2": "TLV",
  }
}

עדכון (T1)

המטען הייעודי (payload) של ההודעה מורכב מכל השורה החדשה. הוא לא כולל ערכים קודמים.

{
  "stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
  "read_method": "oracle-cdc-logminer",
  "object": "SAMPLE.TBL",
  "uuid": "e6067366-1efc-0a10-a084-0d8701101101",
  "read_timestamp": "2019-11-07T07:37:18.808Z",
  "source_timestamp": "2019-11-07T02:17:39",  
  "source_metadata": {
    "log_file": 
    "scn": 15869150473224,
    "row_id": "AAAGYPAATAAPIC5AAB",
    "is_deleted": false,
    "database":
    "schema": "ROOT",
    "table": "SAMPLE"
    "change_type": "UPDATE",
    "tx_id":
    "rs_id": "0x006cf4.00056b26.0010",
    "ssn": 0,
  },
  "payload": {
    "THIS_IS_MY_PK": "1231535353",
    "FIELD1": null,
    "FIELD2": "TLV",
  }
}

מחיקה (T2)

המטען הייעודי (payload) של ההודעה מורכב מכל השורה החדשה.

{
  "stream_name": "projects/myProj/locations/myLoc/streams/Oracle-to-Source",
  "read_method": "oracle-cdc-logminer",
  "object": "SAMPLE.TBL",
  "uuid": "c504f4bc-0ffc-4a1a-84df-6aba382fa651",
  "read_timestamp": "2019-11-07T07:37:20.808Z",
  "source_timestamp": "2019-11-07T02:19:39",
  "source_metadata": {
    "log_file": 
    "scn": 158691504732555,
    "row_id": "AAAGYPAATAAPIC5AAC",
    "is_deleted": true,
    "database":
    "schema": "ROOT",
    "table": "SAMPLE"
    "change_type": "DELETE",
    "tx_id":
    "rs_id": "0x006cf4.00056b26.0011",
    "ssn": 0,
  },
  "payload": {
    "THIS_IS_MY_PK": "1231535353",
    "FIELD1": null,
    "FIELD2": "TLV",
  }
}

סדר ועקביות

בקטע הזה מוסבר איך Datastream מטפל בסדר ובעקביות.

הזמנה

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

באירועים שהם חלק ממילוי חוסרים ראשוני, השדה read_method מוגדר לערך backfill או מסתיים ב--backfill, ב--fulldump או ב--incremental. אירועי מילוי חוסרים נוצרים בכוונה בסדר לא כרונולוגי, ואפשר לצרוך אותם בכל סדר.

באירועים שהם חלק מרפליקציה מתמשכת של סימון נתונים שהשתנו (CDC), השדה read_method מוגדר לערך cdc או לערך CDC ספציפי למקור, כמו mysql-cdc-binlog,‏ oracle-cdc-logminer,‏ postgres-cdc-wal,‏ sqlserver-cdc או salesforce-cdc. האופן שבו אתם מסדרים את אירועי הרפליקציה המתמשכים בכל המקורות תלוי ביעד:

יעד תיאור
BigQuery

הסדר של האירועים ב-BigQuery תלוי במצב הכתיבה שהגדרתם לסטרימינג:

  • מצב כתיבה של מיזוג: BigQuery ממזג באופן אוטומטי אירועים לא סדורים ברצף הנכון, באמצעות המטא-נתונים של האירוע ומספר סידורי של שינויים (CSN) פנימי. טבלאות בלי מפתח ראשי נכתבות במצב הוספה בלבד.
  • מצב כתיבה של הוספה בלבד, כולל טבלאות Apache Iceberg: Datastream מוסיף אירועי שינוי לטבלת היעד ומאכלס את העמודה datastream_metadata STRUCT. כדי לקבוע את סדר האירועים במקור, ממיינים את האירועים באמצעות השדה datastream_metadata.change_sequence_number או השדה של המערך datastream_metadata.sort_keys.
Cloud Storage

ב-Cloud Storage, אירועים מאותה תקופה יכולים להתפרס על פני יותר מקובץ אחד. כדי לקבוע את הסדר שבו האירועים התרחשו במקור, ממיינים את האירועים באמצעות השדה של המערך sort_keys במטא-נתונים הגנריים.

עקביות

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

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

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

כשקובצי היומן של מסד הנתונים מכילים טרנזקציות שלא בוצעו, אם טרנזקציות כלשהן מבוטלות, מסד הנתונים משקף זאת בקובצי היומן כפעולות "הפוכות" של שפת טיפול בנתונים (DML). לדוגמה, לפעולת INSERT שבוטלה תהיה פעולת DELETE תואמת. ‫Datastream קורא את הפעולות האלה מקובצי היומן.

מידע על שידורים

לכל מקור נתונים יש מטא-נתונים שמתארים גם את מקור הנתונים וגם את המקור שממנו הוא שולף נתונים. המטא-נתונים האלה כוללים מידע כמו שם ה-stream, פרופילי החיבור של המקור והיעד.

כדי לראות את ההגדרה המלאה של אובייקט ה-Stream, עיינו במאמרי העזרה של ה-API.

מצב וסטטוס השידור

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

  • Not started
  • Starting
  • Running
  • Draining
  • Paused
  • Failed
  • Failed permanently

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

מטא-נתונים של אובייקטים שזמינים באמצעות Discovery API

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

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