Insgesamt finden drei Vorgänge statt, die mit dem Sicherungsverzeichnis interagieren:
- Der archive_command von PostgreSQL, welcher das WAL wegkopiert.
- Ein Cronjob von Barman, der einmal pro Minute Aufräumarbeiten vornimmt.
- Ein Skript, welches das Backup-Verzeichnis alle 15 Minuten auf S3 hochlädt.
Ich habe das folgendermassen implementiert:
Der archive_command ist folgendermassen formuliert:
Code: Alles auswählen
test ! -f /var/lib/barman/pg/incoming/%f && flock -n /tmp/barman-cron cp %p /var/lib/barman/pg/incoming/%f
Der Barman-Cronjob sieht folgendermassen aus:
Code: Alles auswählen
*/1 * * * * flock -n /tmp/barman-cron /opt/barman/bin/barman cron
Und schliesslich der S3-Upload, den ich hier etwas vereinfacht wiedergebe:
Code: Alles auswählen
flock -F /tmp/barman-cron flock -n /tmp/some-other-mutex-for-some-reason ionice -c2 -n6 nice -n 5 /usr/local/bin/s3-backup /var/lib/barman/pg
Schliesslich wird das Skript mit ionice und nice gestartet, um das Backup herunterzupriorisieren. (Das ganze S3-Setup war schon früher da, ich habe nur den ersten Mutex hinzugefügt.)
Nun ist das S3-Skript schlau genug, um Änderungen während des Hochladevorgangs zu bemerken. Solche Änderungen passieren, wenn ein anderer Prozess schreibend auf /var/lib/barman/pg zugreift. Und leider passieren solche Änderungen doch ab und zu, wodurch ich mehrmals die Woche eine entsprechende Warnung erhalte. Der Mutex funktioniert offenbar nicht wie gewünscht.
Sieht jemand meinen Denk- bzw. Umsetzungsfehler?