Τι είναι τα WAL στη PostgreSQL και πώς τα ρυθμίζουμε

Τι είναι τα WAL στη PostgreSQL και πώς τα ρυθμίζουμε
Τι είναι τα WAL στη PostgreSQL και πώς τα ρυθμίζουμε

Σε αυτό το άρθρο θα δούμε τον μηχανισμό που συνδέει τη μνήμη με τον δίσκο και εξασφαλίζει ότι δεν θα χάσουμε δεδομένα αν πέσει η βάση δεδομένων (π.χ. απο ρεύμα): τα Write-Ahead Logs (WAL) και τα Checkpoints.

Όταν εκτελούμε ένα INSERT, UPDATE ή DELETE, η αλλαγή γίνεται αρχικά στη μνήμη (shared_buffer) και αμέσως μετά καταγράφεται στο WAL file στο δίσκο, ώστε να επιβεβαιωθεί ότι η συναλλαγή ολοκληρώθηκε. Αν ο server κρασάρει, η PostgreSQL στην επανεκκίνηση διαβάζει τα WAL files και ξαναπερνάει όσες αλλαγές δεν είχαν προλάβει να γραφτούν μόνιμα στους πίνακες.

Για όσους προέρχονται από Oracle, τα WAL files είναι το αντίστοιχο των Redo Logs, ενώ στον SQL Server είναι το Transaction Log. Στην PostgreSQL βρισκονται στον φάκελο pg_wal ως αρχεία των 16MB.

Τι είναι το Checkpoint;

Δεν μπορούμε να κρατάμε τις αλλαγές μόνο στη μνήμη, γιατί αν έπεφτε το ρεύμα, η επανεκκίνηση θα έπαιρνε ώρες διαβάζοντας WAL files ημερών. Το Checkpoint είναι η διαδικασία κατά την οποία η PostgreSQL παίρνει όλες τις αλλαγές από τη μνήμη και τις γράφει φυσικά στους πίνακες στο δίσκο. Μόλις τελειώσει, τα παλιά WAL files που δεν χρειάζονται άλλο διαγράφονται.

Αν το checkpoint γράψει πολύ όγκο δεδομένων απότομα, ο δίσκος φτάνει στο 100% και η βάση δεδομένων κολλάει. Γι’ αυτό χρειάζεται σωστό tuning.

Πώς τα ρυθμίζουμε στο service της PostgreSQL

Οι προεπιλεγμένες ρυθμίσεις της PostgreSQL είναι πολύ χαμηλές, σε παραγωγικές βάσεις δεδομένων προσαρμόζουμε τις βασικές παραμέτρους στο postgresql.conf, οι οποίες ειναι δυναμικές δεν χρειάζεται να πέσει το service απλά reload μέσω SQL (SELECT pg_reload_conf();):

max_wal_size

Ορίζει πόσος όγκος WAL επιτρέπεται να μαζευτεί πριν η βάση αναγκαστεί να κάνει Checkpoint. Το 1GB (default) είναι πολύ μικρό και αναγκάζει τη βάση να κάνει συνεχώς checkpoints. Σε παραγωγικά συστήματα το ανεβάζουμε σε 16GB που ειναι το standard, σε πολύ βάσεις με χιλιάδες εγγραφές μπορεί να χρειαστεί να το παμε 32GB ή ακόμα και 64GB.

checkpoint_timeout

Ορίζει τον μέγιστο χρόνο ανάμεσα σε δύο checkpoints. Τα 5 λεπτά (default) είναι πολύ συχνό διάστημα, οπότε το ανεβάζουμε σε 15m για να αραιώσουμε τις εγγραφές στο δίσκο.

checkpoint_completion_target

Ορίζει σε πόσο ποσοστό του χρόνου checkpoint_timeout πρέπει να απλωθεί η εγγραφή των δεδομένων. Με τιμή 0.9 και checkpoint_timeout 15, η PostgreSQL γράφει σταδιακά τα δεδομένα μέσα σε 13.5 λεπτά. Αυτό απλώνει την εγραφή και εξαφανίζει τα κολλήματα. Στις νέες εκδόσεις είναι ήδη 0.9 και το αφήνουμε εκεί.

Παράδειγμα:

vi $PGDATA/postgresql.conf
checkpoint_timeout = 15m 
max_wal_size = 16GB 
min_wal_size = 2GB 
checkpoint_completion_target = 0.9

Πώς βλέπουμε αν χρειάζεται tuning

Για να δούμε αν τα checkpoints γίνονται στην ώρα τους ή αν εξαναγκάζονται επειδή γεμίζει το max_wal_size, τρέχουμε το παρακάτω query:

SELECT 
    checkpoints_timed,
    checkpoints_req,
    checkpoint_write_time,
    checkpoint_sync_time,
    ROUND(100.0 * checkpoints_req / NULLIF(checkpoints_timed + checkpoints_req, 0), 2) AS forced_checkpoint_pct
FROM pg_stat_bgwriter;
Τι είναι τα WAL στη PostgreSQL και πώς τα ρυθμίζουμε

Στα αποτελέσματα, το checkpoints_timed δείχνει τα checkpoints που έγιναν κανονικά βάσει χρόνου, ενώ το checkpoints_req δείχνει τα αναγκαστικά επειδή γεμίσαμε το max_wal_size.

Στόχος μας είναι το ποσοστό forced_checkpoint_pct να είναι κάτω από 10%. Αν βλέπετε μεγαλύτερο ποσοστό, σημαίνει ότι η βάση δεδομένων παράγει WAL πολύ γρήγορα και πρέπει να αυξήσετε το max_wal_size.

Πηγές:

PostgreSQL 18.4 Documentation

Μοιράσου το

Αφήστε μία απάντηση