PostgreSQL cluster for development and testing
Last updated
Last updated
https://habr.com/ru/companies/first/articles/699644/
Сегодня СУБД PostgreSQL является одной из самых известных и популярных систем управления баз данными в мире. Открытый исходный код, отсутствие платы за использование, контроль целостности, репликация – это далеко не все преимущества данной СУБД. В современных реалиях, когда тема импортозамещения особенно актуальна, PostgreSQL может оказаться подходящим вариантом.
Обычно PostgreSQL разворачивают в качестве кластера – системы, которая состоит из нескольких связанных между собой компьютеров (серверов) с целью обеспечения отказоустойчивости.
Как правило, при развертывании кластеров PostgreSQL используют сторонние инструменты такие как Patroni, stolon, repmgr.
В статье будет описана установка кластера PostgreSQL с помощью Ansible – инструмента, предназначенного для автоматизации настройки и развертывания программного обеспечения, а также инструмента repmgr, предназначенного для управления репликами и отказоустойчивостью в кластерах PostgreSQL.
В компаниях не всегда имеется возможность быстро выделить ресурсы для разворачивания ВМ, чтобы организовать рабочую среду для разработки или тестирования. Чтобы избежать излишней бюрократии, если такая имеет место быть, можно локально поднять систему и сразу приступить к работе с ней. Поэтому в статье в качестве примера приведен также алгоритм по установке и работе с утилитой Vagrant, которая позволяет быстро решить эту задачу.
В качестве примера будет использоваться виртуальная машина с установленной операционной системой Ubuntu 20.04.3 LTS. Узлы кластера будут представлены в виде 3 виртуальных машин под управлением ОС Ubuntu 18.04 Bionic Beaver, которые будут запущены на гипервизоре VirtualBox. Сами ВМ будут развернуты при помощи Vagrant – утилиты, предназначенной для создания и конфигурирования виртуальных окружений (под виртуальным окружением понимается более стандартное понятие – виртуальная машина). Ниже описаны хосты, которые будут использоваться в качестве кластера PostgreSQL:
node1 192.168.56.11 Роль primary, она же мастер-нода;
node2 192.168.56.12 Роль standby. Обычная рабочая нода;
node3 192.168.56.13 Роль witness. В терминологии repmgr witness это нода, которая не является частью кластера и предназначена для выбора новой мастер-ноды в случае возникновения проблем с кластером.
Ниже перечислено ПО, которое будет использоваться в статье:
Ansible;
Vagrant;
VirtualBox;
PostgreSQL;
repmgr.
Сначала на управляющий хост (основной хост, с которого будет вестись управление Vagrant и Ansible) необходимо установить Ansible, Vagrant и VirtualBox.
Произвести установку Ansible можно разными способами. В данном примере установка будет произведена при помощи официального репозитория ansible. Для этого необходимо выполнить следующие шаги:
Обновить списки пакетов:
Установить пакет software-properties-common:
Добавить официальный репозиторий Ansible:
Установить Ansible:
После того как установка будет завершена, можно проверить, что Ansible установился корректно, путем вывода его версии. Для этого достаточно выполнить команду:
Если команда отобразила версию (первая строка с названием ansible [core <версия>]), значит, пакет успешно и без ошибок установлен в системе.
Далее необходимо установить Vagrant. Установка производится из официального репозитория. Шаги по установке Vagrant:
Добавить gpg ключ от официального репозитория Vagrant:
Добавить официальный репозиторий hashicorp:
Обновить список репозиториев и установить пакет vagrant:
После установки необходимо убедиться, что установка прошла успешно. Для этого в терминале необходимо ввести команду:
Если команда вернула список команд и их описание, значит установка vagrant прошла успешно.
Последний шаг – установка VirtualBox. Необходимые пакеты уже присутствуют в официальных репозиториях. Для установки достаточно выполнить одну команду:
Для создания виртуальных машин в vagrant используется специальный файл – vagranfile. Для его создания необходимо выполнить команду:
Команда сгенерирует специальный шаблон, где указываются ВМ, которые будут созданы. Также в этом файле прописываются имена хостов, IP адреса хостов и способ подключения к ним.
Содержимое файла будет следующим
Где:
define.ssh.insert_key – если выставлен в false, то vagrant не будет автоматически создавать и использовать собственные SSH ключи;
define.vm.box – задает имя образа для ВМ. Образы хранятся на сайте Vagrant Cloud;
define.vm.hostname – задает hostname виртуальным машинам;
define.vm.network – задает тип сети и диапазон IP адресов;
v.cpus – задает количество ядер, которое будет выделено для ВМ;
v.memory – задает количество оперативной памяти, которое будет выделено для ВМ;
ansible.playbook – прописывается полный путь до playbook Ansible. Vagrant имеет полную поддержку и интеграцию с Ansible;
ansible.host_vars – в данном блоке прописываются хосты, на которых будет запущен playbook Ansible. Эквивалентен файлу инвентаризации в Ansible.
Так как для установки и настройки кластера необходимо выполнить много действий, они будут разбиты на роли.
Роли в Ansible – это способ логического разбиения файлов или, проще говоря, независимая сущность, решающая какой-то набор задач. С технической точки зрения роль – это директория с поддиректориями и файлами, где расположены задачи.
Для удобства создадим директорию с именем postgres-cluster:
Далее необходимо перейти в созданный каталог и создать следующие директории:
В директории roles будут храниться все необходимые роли. В ней необходимо создать:
Начнем заполнять директории файлами с описанием необходимых действий (в терминологии Ansible каждая задача называется task). Но сначала необходимо заполнить файл с переменными. Они будут храниться в директории group_vars в файле с именем all.yaml.
Содержимое файла представлено ниже:
В переменных с именем node прописаны IP-адреса, которые будут присвоены виртуальным машинам. Переменная pg_version содержит версию PostgreSQL, которая будет установлена на хосты. В данном примере будет использоваться 12 версия.
Далее описываются роли. Для каждой роли в своей директории будет создана еще одна директория с именем roles, в которой будет находиться файл с именем main.yaml.
Первая роль предназначена для установки PostgreSQL
Порядок действий, описанный в роли, следующий:
Добавление ключа от официального репозитория postgres;
Добавление официального репозитория postgres;
Установка PostgreSQL 12;
Копирование и использование конфигурационного файла full_postgresql.conf.j2,который заменит стандартный конфигурационный файл postgresql.conf;
Копирование и использование конфигурационного файла pg_hba.conf.j2*,*который заменит стандартный конфигурационный файл pg_hba.conf.
Конфигурационные файлы full_postgresql.conf.j2и pg_hba.conf.j2будут находиться по следующему пути: roles/postgres_12/templates.
Содержимое файлов описано ниже
Строки под комментарием # repmgr относятся к настройкам утилиты repmgr и предназначены для настройки репликации.
В конфигурационном файле pg_hba.conf.j2 прописаны сетевые доступы до всех нод кластера.
Следующая задача – создание SSH ключей для подключения к виртуальным машинам. Сначала на хостовой ОС необходимо сгенерировать SSH ключи. Команда ниже эквивалента команде ssh-keygen с той лишь разницей, что команда ниже сгенерирует ключи без интерактивного режима:
Закрытый (id_rsa) и открытый (id_rsa.pub) ключи будут сохранены по умолчанию — в домашней директории пользователя в скрытой директории .ssh
Далее необходимо скопировать файл с открытым и закрытым ключом в директорию /roles/ssh/files/keys Итого в поддиректории keys будет два файла — id_rsa и id_rsa.pub.
Роль по использованию SSH ключей описана ниже
Порядок действий, описанный в роли, следующий:
Установка пакета OpenSSH.
Создание директории, где будут храниться SSH ключи - /var/lib/postgresql/.ssh/;
Копирование закрытого ключа в директорию /var/lib/postgresql/.ssh/;
Копирование открытого ключа в директорию /var/lib/postgresql/.ssh/;
Добавление открытого ключа в файл authorized_key;
Перезапуск демона sshd.
Следующая задача – установка и настройка repmgr.
Посмотреть
Порядок действий, описанный в роли, следующий:
Скачивание установщика, содержащего официальный репозиторий repmgr;
Запуск скачанного установщика;
Установка пакета repmgr для 12 версии PostgreSQL;
Инициализация и создание репликационного кластера;
Копирование и использование конфигурационного файла repmgr.conf.j2, который заменит стандартный конфигурационный файл repmgr.conf;
Перезапуск демона PostgreSQL.
Конфигурационный файл repmgr.conf.j2 будет находиться по следующему пути roles/repmgr/templates
Содержимое файла описано ниже
Последняя роль – это присвоение ролей нодам кластера.
Посмотреть
Порядок действий, описанный в роли, следующий:
Регистрация primary ноды (она же мастер-нода).
Остановка демона PostgreSQL.
Удаление всех данных из директории /var/lib/postgresql/12/main.
Регистрация stan-by ноды.
Запуск демона PostgreSQL.
Запуск демона repmrg.
Чтобы собрать все задачи воедино, необходимо создать один общий playbook, в который будут включены все задачи и файлы, что были созданы ранее. Для этого в корневой директории (в данном примере это директория с именем postgres-cluster) необходимо создать файл с именем playbook.yaml со следующим содержанием:
В параметре roles перечислены все роли, которые будут запущены на хостах. Обратите внимание на порядок ролей.
В итоге получится следующая структура файлов:
Также в корневой директории присутствует ранее созданный Vagrantfile.
Когда все файлы будут созданы, можно запускать установку виртуальных машин и playbook Ansible. Для этого достаточно выполнить одну команду:
Начнется процесс установки (см. скриншот ниже). Сначала будут созданы 3 виртуальные машины, далее будет запущен playbook, который установит СУБД PostgreSQL, утилиту repmgr и настроит репликацию.
Ниже показан процесс запуска ролей Ansible:
После того как установка будет завершена, можно подключиться к любой из 3 созданных ВМ для проверки статуса репликации. Для этого необходимо ввести команду vagrant ssh node1, где node1 — это имя хоста одной из ВМ:
При подключении по SSH пароль вводить не нужно, так как был настроен вход по SSH ключам.
Для проверки статуса кластера и репликации необходимо выполнить команду:
Как видно из вывода команды, у нас создался кластер PostgreSQL с 3 нодами. У каждой ноды своя роль (столбец Role).
Созданный кластер можно использовать в качестве тестовой инсталляции, а также для знакомства с утилитой репликации repmgr. Роли нод кластера при желании можно поменять. Также можно легко производить горизонтальное масштабирование – добавлять новые ноды кластера.