Скрипт не претендует на истину первой инстанции
Да, я знаю что есть способ ${the_best_pg_backup_method}
Это просто скрипт которым я поделился - хочешь пользуйся, не хочешь - иди мимо
| { | |
| "version": "10", | |
| "aliases": { | |
| "minio": { | |
| "url": "{{ minio_url }}", | |
| "accessKey": "{{ postgres_ha_minio_access_key }}", | |
| "secretKey": "{{ postgres_ha_minio_secret_key }}", | |
| "api": "s3v4", | |
| "path": "auto" | |
| } | |
| } | |
| } |
| - name: Collect only facts returned by facter | |
| setup: filter=ansible_distribution* | |
| - name: setup minio backup | |
| when: postgres_ha_enable_minio_backup | bool | |
| block: | |
| - name: set usr bin path | |
| set_fact: | |
| usr_bin_path: "{% if 'Flatcar' in ansible_distribution %}/opt/bin{% else %}/usr/local/bin{% endif %}" | |
| - name: ensure mc binary | |
| get_url: | |
| url: https://dl.min.io/client/mc/release/linux-amd64/mc | |
| dest: "{{ usr_bin_path }}" | |
| mode: 0755 | |
| - name: ensure mc dir | |
| file: | |
| path: /root/.mc | |
| state: directory | |
| - name: ensure minio config | |
| template: | |
| src: config.json | |
| dest: /root/.mc/config.json | |
| mode: 0400 | |
| owner: root | |
| group: root | |
| - name: ensure minio backup script | |
| template: | |
| src: postgres-backup.sh | |
| dest: "{{ usr_bin_path }}" | |
| mode: 0755 | |
| - name: ensure postgres-backup service | |
| copy: | |
| dest: /etc/systemd/system/postgres-backup.service | |
| content: | | |
| [Unit] | |
| Description=postgres backup on minio | |
| [Service] | |
| Type=oneshot | |
| ExecStart=/bin/sh -c '{{ usr_bin_path }}/postgres-backup.sh' | |
| - name: ensure postgres-backup timer | |
| copy: | |
| dest: /etc/systemd/system/postgres-backup.timer | |
| content: | | |
| [Unit] | |
| Description=backup postgresql databases every night at 3am | |
| [Timer] | |
| OnCalendar=*-*-* 3:00:00 | |
| - name: enable and start systemd timer | |
| systemd: | |
| name: postgres-backup.timer | |
| state: started | |
| enabled: yes |
| #!/bin/sh | |
| databases="{{ postgres_ha_minio_databases_to_backup }}" | |
| prom_file="postgres_backup_exporter.prom" | |
| TEXTFILE_COLLECTOR_DIR="/var/prometheus/textfile_exporter" | |
| if [ "$(docker exec patroni /usr/bin/python3 /var/lib/postgresql/.local/bin/patronictl -c /etc/patroni/patroni.yml list | awk '$0 ~ /.*Leader.*running.*/ {print $2}' | head -1)" == "$(hostname)" ]; then | |
| # doing backup | |
| for db in ${databases}; do | |
| echo "running backup of ${db}"; | |
| docker exec patroni pg_dump -Z 4 -Fc ${db} | {{ usr_bin_path }}/mc --insecure pipe --attr "bug=fix" minio/{{ postgres_ha_minio_bucket }}/${db}-$(date +%Y-%b-%d-%X).sql; | |
| done | |
| # inform monitoring about backups state | |
| rm ${TEXTFILE_COLLECTOR_DIR}/${prom_file}.* 2>/dev/null || true | |
| echo "# HELP postgres_backup_time_created timestamp when backup was created" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| echo "# TYPE postgres_backup_time_created gauge" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| for db in ${databases}; do | |
| raw_backup_time=$({{ usr_bin_path }}/mc --insecure ls minio/{{ postgres_ha_minio_bucket }}/${db}- | tail -n 1 | grep -oP '(?<=\[).*(?=\])' ) | |
| backup_time=$(date -d "${raw_backup_time}" +%s) | |
| if [ "x${backup_time}" == "x" ]; then backup_time="0"; fi | |
| echo "postgres_backup_time_created{db=\"${db}\"} ${backup_time}" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| done | |
| echo "# HELP postgres_backup_size size of backup in bytes" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| echo "# TYPE postgres_backup_size gauge" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| for db in ${databases}; do | |
| size=$({{ usr_bin_path }}/mc --insecure ls minio/{{ postgres_ha_minio_bucket }}/${db}- --json | tail -n 1 | grep -oP '(?<=size":).*(?=,"key)') | |
| echo "postgres_backup_size{db=\"${db}\"} ${size}" >> "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" | |
| done | |
| mv "${TEXTFILE_COLLECTOR_DIR}/${prom_file}.$$" "${TEXTFILE_COLLECTOR_DIR}/${prom_file}" | |
| # doing cleanup of old backups | |
| for db in ${databases}; do | |
| {{ usr_bin_path }}/mc --insecure ls minio/{{ postgres_ha_minio_bucket }}/${db}- | tac | tail -n +11 | awk '{print "minio/{{ postgres_ha_minio_bucket }}/"$5}' | {{ usr_bin_path }}/mc rm --insecure --stdin --force | |
| done | |
| fi |
| - alert: PostgresBackupSeemsTooSmall | |
| expr: postgres_backup_size < 100 | |
| for: 5m | |
| labels: | |
| severity: WARNING | |
| annotations: | |
| summary: Postgres backup size < 100bytes | |
| instance: "{{ $labels.instance }}" | |
| value: "{{ $value }} bytes" | |
| - alert: PostgresBackupOldThan28h | |
| expr: time() - postgres_backup_time_created > 100500 | |
| for: 5m | |
| labels: | |
| severity: WARNING | |
| annotations: | |
| summary: Postgres backup was made later than 28h | |
| instance: "{{ $labels.instance }}" | |
| database: "{{ $labels.db }}" | |
| value: "{{ $value }} seconds" |