Настройка бекапа PostgreSQL в Ubuntu Server при помощи pgBackRest с копированием на Windows Share

Настройка доступа из Linux к сетевой шаре бекапного сервера Windows:

Источник: https://www.hippolab.ru/kak-podklyuchit-setevoy-disk-windows-v-linux

  1. В домене Windows создаем доменного пользователя (например pgbackup) с паролем, под этим пользователем с Linux будем заходить на шару.
  2. На Windows Server создаем директорию под бекапы и настраиваем шару — пользователю выдаем права на шару и на NTFS на запись и чтение.
  3. На сервере Linux (Ubuntu) ставим пакет cifs-utils:
    sudo apt-get install cifs-utils
  4. Проверяем доступность бекапного сервера и порта 445 (samba) с Linux (ping + telnet)
  5. Создаем директорию в mnt в которую будем монтировать шару и копировать бекапы:
    sudo mkdir /mnt/pgbackup
  6. Подключаемся к шаре монтируя ее в созданную директорию:
    sudo mount.cifs //WindowsServerName_OR_IP/WindowsShare /mnt/pgbackup -o username=pgbackup,password=pass,domain=domain_name
    При таком подключении доступ к шаре будет только у суперпользователя. Для того чтобы дать доступ конкретному пользователю (нам необходимо дать права пользователю postgres) — необходимо сначала узнать uid и gid этого пользователя в системе, а затем примонтировать шару с указанием этих ID. Для этого выполнить команду:
    id postgres
    Размонтируем шару:
    sudo umount -lf /mnt/pgbackup
    Монтируем с доступами для пользователя postgres:
    sudo mount.cifs //WindowsServerName_OR_IP/WindowsShare /mnt/pgbackup -o username=pgbackup,password=pass,domain=domain_name,uid=postgres_uid,gid=postgres_gid
  7. Проверяем что у пользователя postgres есть права на запись и чтение на шаре (создаем, копируем на шару/с шары файлы из под пользователя postgres). Так же проверяем что шара примонтирована верно и владелец директории /mnt/pgbackup теперь пользователь postgres и группа postgres:
    ls -l /mnt
  8. Если все ОК, создаем файл credentials чтобы в файле настроек монтирования не светить паролем:
    sudo nano /etc/credentials-pgbackup
    В нем прописываем:
    username=pgbackup password=pass domain=domain_name
    Делаем его доступным для чтения и записи только для суперпользователя:
    sudo chmod 600 /etc/credentials-pgbackup
  9. Редактируем файл /etc/fstab — дописываем в конец файла автоматическое монтирование шары:
    sudo nano /etc/fstab
    Добавляем запись:
    //WindowsServerName_OR_IP/WindowsShare /mnt/pgbackup cifs credentials=/etc/credentials-pgbackup,uid=postgres_uid,gid=postgres_gid 0 0
    Теперь шара будет монтироваться автоматически при загрузке системы (если все параметры указаны верно и шара доступна по сети). Для проверки можно перезагрузить систему и проверить наличие примонтированной шары. (Если требуется чтобы кроме суперпользователя и postgres был доступ к шаре на запись и другим пользователям, то в параметрах подключения нужно добавить dir_mode=0777,file_mode=0777)
  10. Создаем на шаре директорию для бекапов:
    sudo mkdir /mnt/pgbackup/backup_name

Настройка бекапов pgBackRest:

Источник: http://pgbackrest.org/user-guide.html

  1. Устанавливаем пакеты необходимые для pgBackRest:
    sudo apt-get install libdbd-pg-perl libio-socket-ssl-perl libxml-libxml-perl
  2. Скачиваем и устанавливаем pgBackRest:
    sudo wget https://launchpad.net/ubuntu/+archive/primary/+files/pgbackrest_1.22-1_amd64.deb
    sudo dpkg -i pgbackrest_1.22-1_amd64.deb

    В Ubuntu начиная с 16.10 pgBackRest есть в репозиториях и устанавливается командой:
    sudo apt-get install pgbackrest
    Проверить что pgBackRest установлен успешно можно запустив команду:
    pgbackrest
    В результате на экран должна быть выведена версия pgBackRest и список доступных команд.
  3. Смотрим где расположены файлы баз данных кластера PostgreSQL — находим файл конфигурации postgresql.conf и в нем нам необходимо значение параметра data_directory.
    Можно так же посмотреть расположение файлов запущенного PostgreSQL выполнив команду:
    ps -ax | grep postgres
    Файл конфигурации может располагаться например:
    nano /etc/postgresql/9.6/main/postgresql.conf
    Ищем параметр расположения файлов data_directory.
    Копируем значение этого параметра (например /var/lib/postgresql/9.6/main). По умолчанию в Ubuntu БД хранятся в директории /var/lib/postgresql/[version]/[cluster].
  4. Проверяем что у владельца БД, пользователя postgres есть доступ на чтение файла /etc/pgbackrest.conf:
    sudo su - postgres nano /etc/pgbackrest.conf
    Выходим из под пользователя postgres:
    exit
  5. Редактируем конфиг /etc/pgbackrest.conf:
    sudo nano /etc/pgbackrest.conf
    И добавляем там строки (в db-path указываем наш путь к файлам БД):
    [backup_name] db-path=/var/lib/postgresql/9.6/main
    Где [backup_name] это stanza — псевдоним кластера который используется для выполнения команд по бекапу/восстановлению над кластером.
  6. Создаем репозиторий для хранения бекапов в нашей windows шаре:
    sudo mkdir /mnt/pgbackup/backup_name
    Так как шара примаплена под для пользователя и группы *postgres*, все директории и файлы принадлежат пользователю *postgres* и никакие дополнительные права выдавать не нужно. Создаем локальную директорию для бекапов (репозиторий) (может уже быть создана при установке, тогда проверяем что все права выданы верно):
    sudo mkdir /var/lib/pgbackrest
    sudo chmod 750 /var/lib/pgbackrest
    sudo chown postgres:postgres /var/lib/pgbackrest
  7. Правим путь к репозиторию в конфиге /etc/pgbackrest.conf:
    [global] repo-path=/var/lib/pgbackrest
    Настраиваем Retention — количество копий бекапа которые будем хранить и параметры запуска/остановки бекапа, добавив запись в [global] после параметра repo-path (количество хранящихся копий retention устанавливаем столько сколько нам необходимо):
    retention-diff=6
    retention-full=3
    start-fast=y
    stop-auto=y
  8. Редактируем конфиг postgresql.conf, указываем значения параметров (перед этим создаем резервную копию конфига):
    sudo cp /etc/postgresql/9.6/main/postgresql.conf /etc/postgresql/9.6/main/postgresql.conf.bak
    sudo nano /etc/postgresql/9.6/main/postgresql.conf

    Нужные нам параметры:
    archive_command = 'pgbackrest --stanza=alipay archive-push %p'
    archive_mode = on
    max_wal_senders = 3
    wal_level = hot_standby

    После этого перезапускаем PostgreSQL:
    sudo service postgresql restart
    Проверяем что PostgreSQL запустился (команда должна выдать несколько процессов):
    ps -ax | grep postgres
  9. Создаем Stanza (строфу). Команда stanza-create должна быть создана на хосте на котором расположен репозиторий для инициализации stanza. Так как у нас шара, запускаем на нашем хосте с PostgreSQL:
    sudo -u postgres pgbackrest --stanza=backup_name --log-level-console=info stanza-create
    После создания делаем проверку:
    sudo -u postgres pgbackrest --stanza=backup_name --log-level-console=info check
  10. Сделаем тестовый full-backup:
    sudo -u postgres pgbackrest --stanza=backup_name --type=full --log-level-console=info backup
    Файлы бекапа появятся в репозитории (локальная директория /var/lib/pgbackrest).
    Посмотреть список доступных бекапов можно командой:
    sudo -u postgres pgbackrest info
  11. Выполним full-backup с последующим архивированием всех файлов репозитория и копированием архива на шару. При каждом бекапе pgBackRest проводит ротацию старых бекапов и удяляет самые старые оставляя только то количество копий которое указано в файле конфигурации /etc/pgbackrest.conf. На шаре будем хранить 2 полные копии репозитория pgBackRest в виде архивов. Все старые файлы архива репозитория на шаре будем удалять.
    Команды надо выполнить от имени пользователя postgres, для удобства (чтобы не писать перед каждой командой sudo -u postgres) переключимся на пользователя postgres:
    sudo su - postgres
    Выполним скрипт:
    pgbackrest --stanza=backup_name --type=full backup && tar -czf /mnt/pgbackup/backup_name/backup_`date +%d%m%y_%H%M%S`.tar.gz /var/lib/pgbackrest && cd /mnt/pgbackup/backup_name && ls -t -Ietc* | tail -n+3 | xargs -I{} rm {}
    В итоге выполнился full-backup, после этого весь репозиторий /var/lib/pgbackrest был заархивирован на шару /mnt/pgbackup/backup_name (она же windows-шара) в файл бекапа формата backup_ddmmyy_HHMMSS.tar.gz, после чего самые старые файлы архива были удалены и оставлены только 2 самых свежих.Выходим из под пользователя postgres:
    exit
  12. Создаем 3 скрипта в директории /etc/cron.daily для запуска бекапов при помощи cron:
    sudo nano /etc/cron.daily/pgbackup-full
    В нем запишем скрипт для full-backup:
    #!/bin/bash
    pgbackrest --stanza=backup_name --type=full backup && tar -czf /mnt/pgbackup/backupName/backup_`date +%d%m%y_%H%M%S`.tar.gz /var/lib/pgbackrest && cd /mnt/pgbackup/backup_name && ls -t -Ietc* | tail -n+3 | xargs -I{} rm {}

    После этого выдадим на него права:
    sudo chmod 755 /etc/cron.daily/pgbackup-full
    По аналогии создаем еще два таких же файла в директории /etc/cron.daily — pgbackup-diff и pgbackup-incr. В них меняем в скрипте —type=full на —type=diff и —type=incr соответственно. И выдаем те же права 755.
    (Вместо создания файлов, при желании скрипты можно поместить сразу в задания cron).
  13. Проверяем что все 3 скрипта отрабатывают верно. Запустим их поочередно и проверим появились ли эти бекапы в репозитории pgBackRest:
    sudo -u postgres /etc/cron.daily/pgbackup-full
    sudo -u postgres /etc/cron.daily/pgbackup-diff
    sudo -u postgres /etc/cron.daily/pgbackup-incr
    sudo -u postgres pgbackrest info

    Последними в списке должны быть 3 наши бекапа, последовательно: full, diff, incr.
  14. Добавим задания для бекапов в cron.
    Поскольку задания бекапа мы будем выполнять от имени пользователя postgres, переключимся на него:
    sudo su - postgres
    Далее, для редактирования заданий cron именно пользователя postgres выполним команду:
    crontab -e
    Выбираем редактор файла заданий. Теперь запишем в задания расписание запусков скриптов бекапа:
    0 1 * * 6 /etc/cron.daily/pgbackup-full
    0 1 * * 0-5 /etc/cron.daily/pgbackup-diff
    0 */3 * * * /etc/cron.daily/pgbackup-incr

    То есть full backup выполняем каждую субботу в 1 час ночи, diff backup выполняем воскресенье-пятница тоже в 1 час ночи, incr backup запускаем каждые 3 часа.
    Выйдем из под пользователя postgres:
    exit
    Выполним напоследок полный бекап (от него начнут отталкиваться инкрементальные бекапы):
    sudo -u postgres /etc/cron.daily/pgbackup-full

Настройка завершена.

Минус в том, что бекапить сразу на шару (то есть указать в качестве репозитория не локальную папку, а директорию на шаре /mnt/pgbackup/alipay) не удается — во время создания stanza появляются ошибки синхронизации директорий, хотя на уровне файловой системы все доступы есть). Но зато бекапы хранятся в двух местах — локально и на бекапном сервере.

 

 

0

Добавить комментарий

Ваш e-mail не будет опубликован.