טקסט פענוח לוגי של commit דו-פאזי ב-PostgreSQL 14

עדכון: 2 ביולי 2023

טקסט פענוח לוגי של commit דו-פאזי ב-PostgreSQL 14

צוות Fujitsu OSS וקהילת הקוד הפתוח PostgreSQL שיתפו פעולה כדי להוסיף את הפונקציה של פענוח ה-commit הדו-פאזי בשכפול לוגי ב-PG14. בואו נסתכל מהי התכונה הזו?

רקע

התחייבות דו-שלבית היא מנגנון שבו עסקאות מבוצעות בשני שלבים. משמש בדרך כלל במסדי נתונים מבוזרים כדי להבטיח עקביות. שני השלבים של העסקה הם שלב ה-PREPARE ושלב ה-COMMIT/ROLLBACK. הפקודות שנשלחו בשני שלבים ב-PG הן:

הכן עסקה

ההתחייבות מוכנה

החזרה הוכנה

PG כבר תומך בהתחייבות דו-פאזית בגרסה 8.0, וגרסה 10.0 תומכת בשכפול לוגי. עם זאת, התחייבות דו-שלבית מעולם לא נתמכה בשכפול לוגי. הפקודות PREPARE TRANSACTION, COMMIT PREPARED ו-ROLLBACK PREPARED נתמכו במופע אחד, אך כאשר יש להעתיק פקודות אלו באופן הגיוני למחשב ההמתנה, הן אינן שומרות עוד על המשמעות המקורית. הפקודה PREPARE TRANSACTION מטופלת כאל NOP ואינה מפוענחת כלל. הפקודה COMMIT PREPARED נחשבת כ-COMMIT, והפקודה ROLLBACK PREPARED נחשבת כ-ABORT.

מהי התחייבות דו-שלבית

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

1) לג'ון יש 300$ בבנק A

2) למרק יש 100$ בבנק B

3) ג'ון רוצה להעביר 100$ למארק

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

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

ביצוע שלב אחר שלב של עסקאות מבוזרות

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

שלב 1

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

שלב 2

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

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

חשוב מאוד לתמוך בהתחייבות דו-פאזית בשכפול לוגי.

סקירה פונקציונלית

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

פענוח עסקה בעת ביצוע

השכפול הלוגי של PG14 תומך בפקודות PREPARE TRANSACTION, COMMIT PREPARED ו- ROOLBACK PREPARED. כאשר הפקודה PREPARE TRANSACTION מפוענחת, העסקה מפוענחת ומועתקת. PEPARE TRANSACTION מתחיל בשידור חוזר ופענוח של עסקאות בדיוק כמו COMMIT ב-WAL SENDER.

פענוח עסקה במהלך ההכנה

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

Callback

לתאר

מסנן_הכן_cb

אפשר לפלאגין לסנן עסקאות שאין צורך לפענח אותן בעת ​​הכנה לפי ה-GID המשמש בפקודת PREPARE TRANSACTION

להתחיל_להכין_cb

התחלת הכנת עסקה

להכין_cb

נקרא כאשר הפקודה PREPARE TRANSACTION מפוענחת

commit_prepared_cb

נקרא כאשר הפקודה COMMIT PREPARED מפוענחת

החזרה לאחור

נקרא כאשר הפקודה ROLLBACK PREPARED מפוענחת

שינוי פלאגין

פענוח בדיקה

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

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

שינוי ממשקי API

pg_create_logical_replication_חריץ()

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

pg_create_logical_replication_slot(חריץ_שם שם, שם תוסף [, בוליאני זמני, דו-פאזי בוליאני] )

מקרה לדוגמה

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

1) צור חריץ שכפול

השתמש ב-test_decoding כפלאגין הפלט, והעביר את ה-true כך שהחריץ תומך בהגשה ופענוח דו-שלביים.

postgres=# SELECT * FROM pg_create_logical_replication_slot('regression_slot', 'test_פענוח', false, true;

משבצת_name | lsn

-- -

חריץ רגרסיה | 0/16B1970

(1 שורה)

2) צור טבלה

postgres=# צור נתוני טבלה(מזהה מפתח ראשי טורי, טקסט נתונים);

צור טבלה

3) זהה את תוכן הפלט המפוענח של עסקת הכנה וביצוע עסקה

postgres=# BEGIN;

postgres=*# INSERT INTO data(נתונים) ערכים('5');

postgres=*# הכן עסקה 'בדיקה_הוכנה1';

postgres=# SELECT* FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL);

lsn | xid | נתונים

------

0/1689DC0 | 529 | BEGIN 529

0/1689DC0 | 529| טבלה ציבורית. נתונים: INSERT: מזהה[מספר שלם]:3 נתונים[טקסט]:'5'

0/1689FC0 | 529 | הכן עסקה 'מבחן_הוכן1', txid 529

(3 שורות)

postgres=# התחייבות מוכנה 'מבחן_הוכן1';

postgres=# בחר * מתוך pg_logical_slot_get_changes('regression_slot', NULL, NULL);

lsn | xid | נתונים

------

0/168A060 | 529 | התחייבות מוכנה 'בדיקה_הוכנה1', txid 529

(4 שורות)

postgres=# בחר * מתוך הנתונים;

id | נתונים

----+----–

1 | 5

(1 שורה)

עתיד

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

השלב הבא הוא ליישם את התמיכה הדו-שלבית לפלאגין הפענוח הלוגי הגדול ביותר ב-PG-הפלאגין pgoutput. תוסף זה תומך במצב PUBLISHER/SUBSCRIBER של שכפול לוגי. זהו הפלאגין הנפוץ ביותר בשכפול לוגי. צוות Fujitsu OSS עובד עם קהילת הקוד הפתוח כדי להוסיף תכונה זו ל-PG15.

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

  קישורים:

6mbi25l-120

rm500uz-2h