Потоковая репликация и непрерывное архивирование базы данных PostgreSQL - делюсь небольшим опытом |
27.10.17 23:58 |
Получил "в наследство" систему, в которой в качестве СУБД используется PostgreSQL на CentOS. Резервное копирование реализовано с помощью PostgreSQL Backup, которая запускает ночью задание, делает бекап двух баз и отправляет на ftp. Решил заморочиться отказоустойчивостью. Просто опишу вкратце что и в какой последовательности делалось по результатам изучения интернета и документации (спасибо postgrespro.ru), то есть не буду тут выкладывать много теории о том как работает PostgreSQL, что такое WAL файлы и т.д. 0. УСТАНОВКА PostgreSQL команды после # выполняются в системной консоли от пользователя root, Установить репозиторий и пакеты из него: Установить системную локаль в ru_RU.utf8: Инициализировать кластер СУБД: Для подключения к базе по сети: (если не знаете как редактировать файл, то проще всего установить, если не установлена, программу похожую на far: # yum -y install mc и запустите # mc) Закомментировать строку Запустить базу: Задать пароль пользователю СУБД postgres: Разрешить на фаерволе подключения к СУБД: Теперь сервер базы данных доступен, можно на сервере 1С предприятия создавать базы и т.д.
1. ПОТОКОВАЯ РЕПЛИКАЦИЯ Итак, теперь у нас есть работающая (боевая) СУБД PstgreSQL. Назовем ее MASTER, а сервер, на который будем реплицировать базу SLAVE.
Для обеспечения работы потоковой репликации на MASTER-е редактируем файл /var/lib/pgsql/9.6/data/postgresql.conf, добавляем следующие строки: wal_level = hot_standby (прочитайте про этот параметр в интернете и про WAL файлы в принципе) max_wal_senders = 4 (количество планируемых слейвов, число 4 - на всякий случай ) max_replication_slots = 4 ( здесь 4 - это количество replication slot'ов - равен максимальному количеству реплик) hot_standby = on (разрешить запросы на реплике) hot_standby_feedback = on (Определяет, будет ли сервер горячего резерва сообщать ведущему или вышестоящему резервному о запросах, которые он выполняет в данный момент) Параметры hot_standby = on и hot_standby_feedback = on на MASTER-е не играют никакой роли, но мы их определим уже сейчас, так как на одном из следующих этапов при выстраивании потоковой репликации мы скопируем по сути вес data каталог с MASTER-а на SLAVE, в том числе и этот конфигурационный файл, так что установим эти параметры уже сейчас.
На MASTER-е создаем пользователя repluser под которым SLAVE будет подключаться к MASTER-у и таскать WAL из слотов репликации. # sudo -u postgres psql postgres=# CREATE ROLE repluser WITH REPLICATION PASSWORD 'супер-секретный-пароль' LOGIN;\q
На MASTER-е редактируем /var/lib/pgsql/9.6/data/pg_hba.conf, то есть, обеспечиваем, чтобы в этом файле были такие строчки host all all <ip_MASTER>/32 md5 По сути, выше описанными разрешениями в файле pg_hba.conf мы разрешаем MASTER-у и SLAVE-у взаимно обращаться друг к другу, поэтому, как и в случае с файлом postgresql.conf, файл pg_hba.conf на обоих серверах может совпадать. Соответственно, в дальнейшем, при необходимости, MASTER может стать SLAVE-ом. рестарт базы или
ПЕРЕХОДИМ на SLAVE Выполняем все что в пункте 0. УСТАНОВКА PostgreSQL Останавливаем базу Удаляем все файлы в директории data: Копируем с MASTER-а базу (обратите внимание - запускаем pg_basebackup под пользователем postgres, под которым работает база) выше написанная команда делает следующее - подключается к MASTER-у под пользователем repluser (команда затребует пароль, его нужно ввести, скорей всего можно в команде этот пароль и прописать, но я не заморачивался), копирует целиком базу вместе с конфигурационными файлами, а так же создает минимально необходимый файл recovery.conf, в котором собственно прописано, что база работает в режиме реплики, а значит пока существует этот файл, то в режиме только для чтения! Привожу текст файла recovery.conf: Как я уже говорил выше, если остановить базу, и переименовать файл recovery.conf, и снова запустить, то база перестает быть репликой. Запускаем базу все :), SLAVE в теперь реплика, и регулярно таскает Что можно добавить? Эта репликация асинхронная. Есть возможность настройки синхронной потоковой репликации. А так же каскадной, а так же и т.д. и т.д. Читайте, изучайте. Все что сделано выше решит ситуацию, когда у вас внезапно взрывается MASTER - у вас есть актуальная копия, реплика. Примерный сценарий таков:
2. НЕПРЕРЫВНОЕ АРХИВИРОВАНИЕ Предположим MASTER не взорвался, а просто кто-то умный запустил обработку, которая перепилила и перекорежила данные и все это торжественно перелетело в реплику на SLAVE (см. все что написано выше). Решает организация непрерывного архивирования. Обязательно прочитайте (спасибо postgrespro.ru): чтобы иметь представление о том что такое WAL, файлы-сегменты WAL и т.д. Вкратце схема следующая: Опишу простейшую систему, когда архивируем на тот же дисковый массив, где и находится собственно база (что неправильно и вы конечно настройте копирование на другой диск, сервер, ftp и т.д.). На MASTER-е редактируем /var/lib/pgsql/9.6/data/pg_hba.conf, добавляем следующую строчку (или убеждаемся что она уже есть): Создаем папку archive, в которую будем копировать WAL файлы (обратите внимание - выполняем mkdir под пользователем postgres, чтобы установились нужные права на папку, и база был к ней доступ) Редактируем файл /var/lib/pgsql/9.6/data/postgresql.conf то есть, задаем желаемую команду оболочки в параметре archive_command. В archive_command символы %p заменяются полным путём к файлу, подлежащему архивации, а %f заменяются только именем файла. Поэтому когда WAL файл готов к копированию (заполнен) вызывается примерно следующая команда: ) # service postgresql-9.6 restart Создаем папку basebackups, в которую положим заархивированную базовую резервную копию (обратите внимание - выполняем mkdir под пользователем postgres, чтобы установились нужные права на папку, и база был к ней доступ) Делаем базовую резервную копию: здесь делаем базовую резервную копию и архивируем все в один файл. В принципе можно не архивировать. В общем изучите возможности pg_basebackup. Кстати, pg_basebackup в папке, куда мы копируем WAL файлы, создал такой файл. -rw------- 1 postgres postgres 308 окт 24 02:37 00000001000000150000006B.00000028.backup К сожалению процесс восстановления описать не могу, так как мне еще предстоит его протестировать, обкатать. Надеюсь найти время и дописать статью. P.S. это моя первая статья, не судите строго |