Предисловие
pgbackrest
- утилита для создания backup в postgresql. Создавать backup это конечно хорошо, но нужно еще и мониторить это всё дело. Мониторить pgbackrest
не самая простая задача, так как в лог файле не всегда понятно что происходит
Возможные варианты
Есть 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. После чего запрос выполнится и выдаст результат. Далее нужно нажать next.
- Name - удобочитаемое имя для вас
- Execution Frequency - тут в какое время или через какой интервал запускать запрос
- Host - можно переназначить имя сервера, которое будет отображаться в splunk search
- Source - имя источника событий
- Source Type - тип источника событий
- Index - индекс
splunk
Добавить 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"
Готовые запросы
Комментарии