Предисловие

pgbackrest - утилита для создания backup в postgresql. Создавать backup это конечно хорошо, но нужно еще и мониторить это всё дело. Мониторить pgbackrest не самая простая задача, так как в лог файле не всегда понятно что происходит

Возможные варианты

Есть 2 типа:

  1. Через лог файл ( от него я отказался, так как очень муторно )
  2. Это использовать pgbackrest info с созданием функции в postgresql

Установка postgresql

По ссылке link выбираем версию ОС и по мануалу ставим postgresql. Я буду ставить на centos 7

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm  
sudo yum install -y postgresql12-server postgresql-devel postgresql-contrib postgresql12-server
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb  
sudo systemctl enable postgresql-12  
sudo systemctl start postgresql-12
sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --reload

Установка pgbackrest

sudo yum install pgbackrest
sudo -u postgres pgbackrest

Добавление STANZA

Если кратко то STANZA это наша нода с postgresql, которую нужно бэкапить

sudo vi /etc/pgbackrest.conf
	[global]
	#тут путь к хранению бэкап файлов
	repo1-path=/var/lib/pgbackrest
	repo1-type=cifs
	#тут сколько дифоф хранить
	repo1-retention-diff=4
	#тут сколько фулов хранить
	repo1-retention-full=2
	process-max=4
	log-level-console=info
	log-level-file=detail
	start-fast=y
	compress=y
	compress-level=3
	
	[demo]  
	pg1-path=/var/lib/pgsql/12/data

Подготавливаем директорию для backup

sudo mkdir -p /var/lib/pgbackrest
sudo chmod 750 /var/lib/pgbackrest
sudo chown postgres:postgres /var/lib/pgbackrest

Конфигурация WAL архивации

sudo vi /var/lib/pgsql/12/data/postgresql.conf
	archive_command = 'pgbackrest --stanza=demo archive-push %p'  
	archive_mode = on  
	listen_addresses = '*'  
	log_filename = 'postgresql.log'  
	log_line_prefix = ''  
	max_wal_senders = 3  
	wal_level = replica

sudo systemctl restart postgresql-12.service	

Создание STANZA

sudo -u postgres pgbackrest --stanza=demo --log-level-console=info stanza-create
#проверка конфигурации
sudo -u postgres pgbackrest --stanza=demo --log-level-console=info check

Создание backup

#для full
sudo -u postgres pgbackrest --stanza=demo --log-level-console=info backup
#для diff
sudo -u postgres pgbackrest --stanza=demo --type=diff --log-level-console=info backup

Добавление в Cron

Естественно backup должен запускаться сам без вашего участия. Для этого добавляем его в cron.

sudo crontab -e
	30 06  *   *   0     pgbackrest --type=full --stanza=demo backup
	30 06  *   *   1-6   pgbackrest --type=diff --stanza=demo backup

Создание функции для мониторинга через postgresql

Для этого выкачиваем файл link и запускаем sql скрипт.

sudo cd /tmp
sudo wget https://github.com/ynwasg90/postgresql/blob/main/files/pgsql-pgbackrest-info.sql
sudo -u postgres psql -f /tmp/pgsql-pgbackrest-info.sql

Проверка функции monitor.pgbackrest_info

Для этого логинимся в postgresql и вызываем функцию.

sudo su - postgres
psql
select monitor.pgbackrest_info();

В выводе должны получить json список с бэкапами.

[{"db": [{"id": 1, "version": "12", "system-id": 6899011579127733640}], "name": "demo", "backup": [{"info": {"size": 42312422, "delta": 42312422, "repository": {"size": 3369587, "delta": 3369587}}, "type": "full", "
label": "20201125-171516F", "prior": null, "archive": {"stop": "000000010000000000000003", "start": "000000010000000000000003"}, "backrest": {"format": 5, "version": "2.30"}, "database": {"id": 1}, "reference": null, "timestamp": {"stop"
: 1606302918, "start": 1606302916}}, {"info": {"size": 42314065, "delta": 16910394, "repository": {"size": 3369694, "delta": 78253}}, "type": "incr", "label": "20201125-171516F_20201125-171527I", "prior": "20201125-171516F", "archive": {
"stop": "000000010000000000000004", "start": "000000010000000000000004"}, "backrest": {"format": 5, "version": "2.30"}, "database": {"id": 1}, "reference": ["20201125-171516F"], "timestamp": {"stop": 1606302929, "start": 1606302927}}, {"
info": {"size": 51549488, "delta": 30054558, "repository": {"size": 4592491, "delta": 1799806}}, "type": "incr", "label": "20201125-171516F_20201203-110242I", "prior": "20201125-171516F_20201125-171527I", "archive": {"stop": "00000001000
000000000000C", "start": "00000001000000000000000C"}, "backrest": {"format": 5, "version": "2.30"}, "database": {"id": 1}, "reference": ["20201125-171516F"], "timestamp": {"stop": 1606971764, "start": 1606971762}}], "cipher": "none", "st
atus": {"code": 0, "lock": {"backup": {"held": false}}, "message": "ok"}, "archive": [{"id": "12-1", "max": "00000001000000000000000C", "min": "000000010000000000000001", "database": {"id": 1}}]}]

Мониторинг в splunk

Создание connection в splunk db connect

splunk db connect - модуль для splunk который позволяет выполнять запросы на серверах бд и записывать вывод сразу в splunk. Идём в Splunk DB Connect -> Configuration -> Identities -> New Identity

  • Identity Name - удобочитаемое имя для вас
  • Username - логин пользователя, которому разрешено подключаться к бд postgres, а также выдана роль pg_execute_server_program ( grant role pg_execute_server_program to user_name )
  • Password - пароль пользователя

Идём в Splunk DB Connect -> Configuration -> New Connection

  • Connection Name- удобочитаемое имя для вас
  • Identity - тот самый пользователь которого создавали
  • Connection Type: Postgresql - вид бд ( mssql, postgresql, mysql )
  • Timezone - временная зона
  • Host - ip сервера с бд
  • Port: 5432 - порт для подключения к серверу
  • Default Database: postgres - база, к которой подключаться по умолчанию
  • Read Only: yes - указываем что пользователь не может делать запись

Создание input в splunk db connect

Идём в Splunk DB Connect -> Configuration -> Inputs-> New Input

  • Connection - тот что создавался
  • SQL Editor: select monitor.pgbackrest_info(); - запрос, который будет выполнятся на сервере с бд

Далее нужно нажать execute. После чего запрос выполнится и выдаст результат. execute Далее нужно нажать next. next

  • Name - удобочитаемое имя для вас
  • Execution Frequency - тут в какое время или через какой интервал запускать запрос
  • Host - можно переназначить имя сервера, которое будет отображаться в splunk search
  • Source - имя источника событий
  • Source Type - тип источника событий
  • Index - индекс splunk next

Добавить SEDCMD

Про SEDCMD можно почитать link. Выполнять на splunk heavy forwarder.

sudo vi $SPLUNK_HOME/etc/system/local/props.conf
	[source::pg_sql:db_backup]
	SEDCMD-Backups = s/.*pgbackrest_info="(.*)"/{"pg":\1}/g

Суть в том что по умолчанию splunk db connect записывает весь вывод в переменную pgbackrest_info. Через SEDCMD убирается переменная и создаётся валидный json.

Просмотр логов в splunk

Идём в Splunk -> Search

index=databases source="pg_sql:db_backup" 

Готовые запросы

diff

full

all