ב-Datastream, הנתונים המשוכפלים מאורגנים בהיררכיה של שלוש רמות: מקורות נתונים, אובייקטים ואירועים. סטרים מקשר בין מקור נתונים ליעד, ואובייקט מייצג ישות מקור ספציפית בסטרים הזה, כמו טבלה במסד נתונים. אירוע מתעד שינוי נתונים יחיד מאובייקט, כמו הוספה של מסד נתונים.
כל אירוע כולל נתונים ומטא-נתונים שמזהים את מקור הנתונים ואת האובייקט שלו. אתם יכולים להשתמש במטא-נתונים האלה כדי לעקוב אחרי מקורות השינויים, להסיר רשומות כפולות ביעד ולשמור על הסדר בין הצרכנים במורד הזרם.
מידע על אירועים
כל אירוע מורכב משלושה סוגי נתונים:
- נתוני אירועים: השינוי בנתונים עצמם מהאובייקט שמקורו במקור הנתונים. כל אירוע מכיל את כל השורה שהשתנתה.
- מטא-נתונים כלליים: המטא-נתונים האלה מופיעים בכל אירוע שנוצר על ידי Datastream, ומשמשים לפעולות כמו הסרת נתונים כפולים ביעד.
- מטא-נתונים ספציפיים למקור: המטא-נתונים האלה מופיעים בכל אירוע שנוצר על ידי מקור סטרימינג ספציפי. המטא-נתונים האלה משתנים בהתאם למקור.
נתוני האירוע
נתוני אירועים הם המטען הייעודי (payload) של כל שינוי באובייקט נתון שמקורו במקור נתונים.
האירועים הם בפורמט Avro או JSON.
כשעובדים עם פורמט Avro, האירוע מכיל את האינדקס והערך של כל עמודה. באמצעות אינדקס העמודה, אפשר לאחזר את שם העמודה ואת הסוג המאוחד מהסכימה בכותרת Avro.
כשעובדים עם פורמט JSON, האירוע מכיל את השם והערך של כל עמודה.
אפשר להשתמש במטא-נתונים של אירועים כדי לאסוף מידע על מקור האירוע, וגם כדי להסיר נתונים כפולים ביעד ולסדר את האירועים לפי הצרכן במורד הזרם.
בטבלאות הבאות מפורטים ומתוארים השדות וסוגי הנתונים של מטא-נתונים של אירועים כלליים וספציפיים למקור.
מטא-נתונים כלליים
המטא-נתונים האלה זהים בכל סוגי השידורים.
| שדה | סוג Avro | סוג JSON | תיאור |
|---|---|---|---|
stream_name |
מחרוזת | מחרוזת | השם הייחודי של מקור הנתונים, כפי שהוגדר בזמן היצירה. |
read_method |
מחרוזת | מחרוזת | מציין אם הנתונים נקראו מהמקור באמצעות שיטת סימון נתונים שהשתנו (CDC), כחלק ממילוי היסטורי או כחלק ממשימת השלמה שנוצרת כשטרנזקציה מגולגלת לאחור במהלך רפליקציה של CDC. הערכים האפשריים כוללים:
|
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 |
בוליאני | בוליאני |
|
| MySQL | database |
מחרוזת | מחרוזת | מסד הנתונים שמשויך לאירוע. |
| MySQL | table |
מחרוזת | מחרוזת | הטבלה שמשויכת לאירוע. |
| MySQL | change_type |
מחרוזת | מחרוזת | סוג השינוי ( |
| Oracle | log_file |
מחרוזת | מחרוזת | קובץ היומן שממנו Datastream שולף אירועים ברפליקציית CDC. |
| Oracle | scn |
ארוך | ארוך | מיקום היומן (היסט) ביומן הטרנזקציות של Oracle. |
| Oracle | row_id |
מחרוזת | מחרוזת | row_id של Oracle. |
| Oracle | is_deleted |
בוליאני | בוליאני |
|
| Oracle | database |
מחרוזת | מחרוזת | מסד הנתונים שמשויך לאירוע. |
| Oracle | schema |
מחרוזת | מחרוזת | הסכימה שמשויכת לטבלה מהאירוע. |
| Oracle | table |
מחרוזת | מחרוזת | הטבלה שמשויכת לאירוע. |
| Oracle | change_type |
מחרוזת | מחרוזת | סוג השינוי ( |
| 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 |
בוליאני | בוליאני |
|
| PostgreSQL | change_type |
מחרוזת | מחרוזת | סוג השינוי (INSERT, UPDATE, DELETE) שהאירוע מייצג.
|
| PostgreSQL | tx_id |
מחרוזת | מחרוזת | מזהה העסקה שהאירוע שייך אליה. |
| PostgreSQL | lsn |
מחרוזת | מחרוזת | מספר הרצף ביומן של הרשומה הנוכחית. |
| PostgreSQL | primary_keys |
מערך מחרוזות | מערך מחרוזות | רשימת השמות של העמודות (אחת או יותר) שמרכיבות את המפתח הראשי של הטבלה. אם לטבלה אין מפתח ראשי, השדה הזה ריק. |
| שרת SQL | table |
מחרוזת | מחרוזת | הטבלה שמשויכת לאירוע. |
| שרת SQL | database |
ארוך | ארוך | מסד הנתונים שמשויך לאירוע. |
| שרת SQL | schema |
מערך מחרוזות | מערך מחרוזות | הסכימה שמשויכת לטבלה מהאירוע. |
| שרת SQL | is_deleted |
בוליאני | בוליאני |
|
| שרת SQL | lsn |
מחרוזת | מחרוזת | המספר הסידורי של האירוע ביומן. |
| שרת SQL | tx_id |
מחרוזת | מחרוזת | מזהה העסקה שהאירוע שייך אליה. |
| שרת SQL | physical_location |
מערך של מספרים שלמים | מערך של מספרים שלמים | המיקום הפיזי של רשומת היומן, שמתואר על ידי שלושה מספרים שלמים: מזהה הקובץ, מזהה הדף ומזהה המשבצת של הרשומה. |
| שרת SQL | replication_index |
מערך מחרוזות | מערך מחרוזות | רשימת שמות העמודות של אינדקס שיכול לזהות באופן ייחודי שורה בטבלה. |
| שרת SQL | change_type |
מחרוזת | מחרוזת | סוג השינוי ( |
| 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 |
בוליאני | בוליאני |
|
| Salesforce | change_type |
מחרוזת | מחרוזת | סוג השינוי ( |
| Salesforce | primary_keys |
מערך מחרוזות | מערך מחרוזות | רשימת שמות העמודות שמרכיבות את המפתח הראשי של הטבלה. אם לטבלה אין מפתח ראשי, השדה הזה ריק. |
| MongoDB | database |
מחרוזת | מחרוזת | מסד הנתונים שמשויך לאירוע. |
| MongoDB | collection |
מחרוזת | מחרוזת | האוסף שמשויך לאירוע. אוספים דומים לטבלאות במסדי נתונים רלציוניים. |
| MongoDB | change_type |
מחרוזת | מחרוזת | סוג השינוי (CREATE, UPDATE ו-DELETE) שהאירוע מייצג. |
| MongoDB | is_deleted |
בוליאני | בוליאני |
|
| 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 תלוי במצב הכתיבה שהגדרתם לסטרימינג:
|
| Cloud Storage |
ב-Cloud Storage, אירועים מאותה תקופה יכולים להתפרס על פני יותר מקובץ אחד. כדי לקבוע את הסדר שבו האירועים התרחשו במקור, ממיינים את האירועים באמצעות השדה של המערך |
עקביות
Datastream מבטיח שהנתונים ממסד הנתונים של המקור יועברו ליעד לפחות פעם אחת. לא תפספסו אף אירוע, אבל יכול להיות שיהיו אירועים כפולים בסטרימינג. חלון הזמן לאירועים כפולים צריך להיות בסדר גודל של דקות, ואפשר להשתמש במזהה הייחודי האוניברסלי (UUID) של האירוע במטא-נתונים של האירוע כדי לזהות כפילויות.
עם זאת, אל תסתמכו רק על ה-UUID כדי לבטל כפילויות של אירועים בהמשך. אם יש הפרעה בצינור עיבוד הנתונים, Datastream קורא מחדש את יומן המקור מנקודת הבדיקה האחרונה שנשמרה כדי להבטיח את ההעברה. מכיוון ש-Datastream יוצר באופן דינמי מזהי UUID כשהוא קורא אירוע, סוג כזה של ניסיון חוזר גורם ליצירת מזהי UUID חדשים לאותם נתוני מקור בדיוק. בנוסף, במהלך פעולות בכמות גדולה במסד הנתונים של המקור, יכול להיות שלכמה שורות נפרדות יהיה אותו מספר רצף שינויים (CSN).
כדי לבטל כפילויות מהנתונים בצורה מהימנה, צריך לחלק את האירועים לפי המפתחות הראשיים של טבלת המקור, ולקבץ אותם באמצעות המספר הסידורי של השינוי (CSN) (השדה change_sequence_number). כך אפשר לוודא שניסיונות חוזרים של אותו אירוע יכווצו בצורה נכונה, תוך שמירה על עדכוני שורות נפרדים לגיטימיים מעסקאות בכמות גדולה.
כשקובצי היומן של מסד הנתונים מכילים טרנזקציות שלא בוצעו, אם טרנזקציות כלשהן מבוטלות, מסד הנתונים משקף זאת בקובצי היומן כפעולות "הפוכות" של שפת טיפול בנתונים (DML). לדוגמה, לפעולת INSERT שבוטלה תהיה פעולת DELETE תואמת. Datastream קורא את הפעולות האלה מקובצי היומן.
מידע על שידורים
לכל מקור נתונים יש מטא-נתונים שמתארים גם את מקור הנתונים וגם את המקור שממנו הוא שולף נתונים. המטא-נתונים האלה כוללים מידע כמו שם ה-stream, פרופילי החיבור של המקור והיעד.
כדי לראות את ההגדרה המלאה של אובייקט ה-Stream, עיינו במאמרי העזרה של ה-API.
מצב וסטטוס השידור
לשידור יכול להיות אחד מהסטטוסים הבאים:
Not startedStartingRunningDrainingPausedFailedFailed permanently
אפשר להשתמש ביומנים כדי למצוא מידע נוסף על הסטטוס, כמו מילוי חוסרים בטבלאות או מספר השורות שעובדו. אפשר גם להשתמש ב-API של FetchStreamErrors כדי לאחזר שגיאות.
מטא-נתונים של אובייקטים שזמינים באמצעות Discovery API
ה-API של הגילוי מחזיר אובייקטים שמייצגים את מבנה האובייקטים שמוגדרים במקור הנתונים או ביעד שמיוצגים על ידי פרופיל החיבור. לכל אובייקט יש מטא-נתונים על האובייקט עצמו, וגם על כל שדה של נתונים שהוא שולף. המטא-נתונים האלה זמינים באמצעות discover API.
המאמרים הבאים
- למידע נוסף על שידורים, ראו מחזור החיים של שידור.
- איך יוצרים שידור