היררכיית הנתונים ב-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. |
| MySQL | log_position |
ארוך | ארוך | המיקום ביומן (ההיסט) ביומן הבינארי של MySQL. |
| 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 |
מחרוזת | מחרוזת | חותמת הזמן של האירוע ב-commit. |
| Spanner | snapshot |
בוליאני | בוליאני | האם האירוע הוא אירוע של תמונת מצב של מילוי חוסרים. |
| Spanner | project_id |
מחרוזת | מחרוזת | מזהה הפרויקט ב-Spanner. |
| Spanner | instance_id |
מחרוזת | מחרוזת | מזהה מכונת Spanner. |
| Spanner | database_id |
מחרוזת | מחרוזת | מזהה מסד הנתונים של Spanner. |
| Spanner | change_stream_name |
מחרוזת | מחרוזת | השינוי בשידור הנתונים ב-Spanner. |
| Spanner | table |
מחרוזת | מחרוזת | טבלת Spanner. |
| Spanner | server_transaction_id |
מחרוזת | מחרוזת | מזהה העסקה שמשויך לאירוע. |
| Spanner | record_sequence |
מחרוזת | מחרוזת | רצף הרשומות שמשויך לאירוע. |
| Spanner | mod_index |
מחרוזת | מחרוזת | מספר השינוי שמשויך לאירוע. |
| Spanner | transaction_tag |
מחרוזת | מחרוזת | התג של העסקה המשויכת. |
| Spanner | system_transaction |
מחרוזת | מחרוזת | אם העסקה היא עסקה של המערכת. |
| Spanner | number_of_records_in_transaction |
ארוך | ארוך | מספר הרשומות בעסקה המשויכת. |
| Spanner | value_capture_type |
enum | enum | סוג לכידת הערך של נתוני השינוי. |
| Spanner | mod_type |
enum | enum | אם הרשומה הייתה 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 non-null)> |
|---|---|---|---|
| 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",
}
}
DELETE (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 לא מבטיח סדר, אבל כל אירוע מכיל את שורת הנתונים המלאה ואת חותמת הזמן של מועד כתיבת הנתונים במקור. ב-BigQuery, אירועים לא מסודרים משולבים ברצף הנכון באופן אוטומטי. מערכת BigQuery משתמשת במטא-נתונים של האירועים ובמספר רצף שינויים (CSN) פנימי כדי להחיל את האירועים על הטבלה בסדר הנכון. ב-Cloud Storage, אירועים מאותו זמן יכולים להתפרס על פני יותר מקובץ אחד.
אירועים שנוצרים לא לפי הסדר הם תופעה שמתרחשת בכוונה כשממלאים חוסרים בנתונים שנוצרים כשמפעילים את מקור הנתונים.
אפשר להסיק את הסדר מכל מקור בנפרד.
| מקור | תיאור |
|---|---|
| MySQL | השדה האירועים שמשתתפים בשכפול המתמשך כוללים את השדה אפשר להסיק את הסדר מהשילוב של השדה |
| Oracle | השדה האירועים שמשתתפים בשכפול המתמשך כוללים את השדה אפשר להסיק את הסדר מהשילוב של השדה |
| PostgreSQL | השדה האירועים שמשתתפים בשכפול המתמשך כוללים את השדה אפשר להסיק את הסדר מהשילוב של השדה |
| שרת SQL |
השדה האירועים שמשתתפים בשכפול המתמשך כוללים את השדה אפשר להסיק את הסדר מהשילוב של השדה כשמשכפלים ל-BigQuery, משתמשים גם בזמן היצירה של מסד הנתונים כדי להבטיח סדר נכון. זה חשוב בתרחישים שבהם יכול להיות שמופע מסד הנתונים של המקור ישתנה, למשל במהלך העברות או מעבר לגיבוי במקרה של כשל. |
| Salesforce |
אפשר לקבוע את הסדר באמצעות |
| MongoDB |
אפשר לקבוע את הסדר באמצעות השדה |
| Spanner |
אפשר לקבוע את הסדר באמצעות שילוב של השדות |
עקביות
הזרמת נתונים מוודאת שהנתונים ממסד הנתונים של המקור יועברו ליעד לפחות פעם אחת. לא מפספסים אף אירוע, אבל יכול להיות שיהיו אירועים כפולים בזרם. החלון לזיהוי אירועים כפולים צריך להיות בסדר גודל של דקות, ואפשר להשתמש במזהה הייחודי האוניברסלי (UUID) של האירוע במטא-נתונים של האירוע כדי לזהות כפילויות.
כשקובצי יומן של מסד נתונים מכילים עסקאות שלא אושרו, אם מתבצעת החזרה של עסקאות, מסד הנתונים משקף זאת בקובצי היומן כפעולות של שפת מניפולציה של נתונים (DML) מסוג 'הפוך'. לדוגמה, לפעולה INSERT שהוחזרה למצב קודם תהיה פעולה תואמת DELETE. הפעולות האלה נקראות על ידי Datastream מקובצי היומן.
מידע על מקורות נתונים
לכל מקור נתונים יש מטא-נתונים שמתארים גם את מקור הנתונים וגם את המקור שממנו הוא שולף נתונים. המטא-נתונים האלה כוללים מידע כמו שם הזרם, פרופילי החיבור של המקור והיעד.
הגדרה מלאה של אובייקט הזרם מופיעה במסמכי הפניית ה-API.
מצב וסטטוס השידור
סטרימינג יכול להיות באחד מהמצבים הבאים:
Not startedStartingRunningDrainingPausedFailedFailed permanently
אפשר להשתמש ביומנים כדי למצוא מידע נוסף על הסטטוס, כמו מילוי חוזר של הטבלאות או מספר השורות שעברו עיבוד. אפשר גם להשתמש ב-API של
FetchStreamErrors כדי לאחזר שגיאות.
מטא-נתונים של אובייקטים שזמינים באמצעות ה-API של Discover
ה-API של גילוי מחזיר אובייקטים שמייצגים את המבנה של האובייקטים שמוגדרים במקור הנתונים או ביעד שמיוצגים על ידי פרופיל החיבור. לכל אובייקט יש מטא-נתונים על האובייקט עצמו, וגם על כל שדה נתונים שהוא מאחזר. המטא-נתונים האלה זמינים באמצעות Discover API.
המאמרים הבאים
- מידע נוסף על סטרימינג זמין במאמר בנושא מחזור החיים של סטרימינג.
- במאמר יצירת זרם מוסבר איך ליצור זרם.