יומן הטרנזקציות (Write-Ahead Log) ונקודות הבקרה (Checkpoints)

יומן הטרנזקציות של PostgreSQL עובד כדלקמן: שינוים בקבצי הנתונים (טבלאות ו אינדקסים) נעשים רק לאחר

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

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

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

 

צמצום מספר נקודות בקרה: checkpoint_segments

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

אנחנו צריכים להגדיל את מספר מגזרי יומן הטרנזקציות (checkpoint_segments) כדי להגדיל את המרווח בין הבקרות. פרמטר זה קובע את מספר המגזרים של היומן  (כל אחד של 16 MB) בין הבקרות. פרמטר זה לא משפיע על מסד הנתונים, מיועד בעיקר לקריאה, אבל הגדלת פרמטר זה עשויה להיות חיוני למסד הנתונים עם טרנזקציות מרובות. בהתאם לכמות הנתונים, תגדירו פרמטר זה בטווח של 12-256 במגזרים, ואם ביומן הופיעה אזהרה (warning) כי המחסומים מתרחשים לעתים קרובות מדי, תעלו אותה בהדרגה.

שטח הדיסק הדרוש, מחושב על פי הנוסחה

(checkpoint_segments * 2 + 1) * 16 МB

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

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

 

נמשיך עם fsync ו synchronous_commit