postgresql_ha
PostgreSQL HA
Установите и настройте кластер PostgreSQL с высокой доступностью, управляемый с помощью repmgr. Добавьте зависимости, расширения, базы данных и пользователей. Также работает для автономных установок.
Проверено с:
- Debian 10.x :heavy_check_mark:
- Debian 11.x :heavy_check_mark:
- Ubuntu 18.04.x :heavy_check_mark:
- Ubuntu 20.04.x :heavy_check_mark:
- PostgreSQL HA
- Полезные команды для выполнения после первой установки
- Регистрация предыдущего основного узла как резервного после автоматического переключения
- Лицензия
Требования
- Python >=3.8
- Ansible-core >=2.12
Смотрите ./requirements.txt для подробных зависимостей, используемых для разработки роли.
Рекомендуется для каждого хоста PostgreSQL
- Python3 в PATH
- Pip3 в PATH
- psycopg2-binary (требует apt-пакет libpq-dev)
Вы можете взглянуть на prepare.yml, чтобы увидеть пример настройки для Python 3.
Установка
Шелл
ansible-galaxy collection install community.crypto
ansible-galaxy install fidanf.postgresql_ha
Файл требований
---
roles:
- src: https://github.com/fidanf/ansible-role-postgresql-ha
name: fidanf.postgresql_ha
version: master
collections:
- community.crypto
Зависимости
- cryptography (хост Ansible)
Пример инвентаря
Смотрите inventory.yml для подробных переменных групп и хостов.
Переменные роли
Переменные по умолчанию для роли разделены на два файла:
Чтобы точно выяснить назначение и допустимые значения для каждой из этих переменных, не стесняйтесь просмотреть все шаблоны Jinja в директории templates. Оригинальные файлы конфигурации по умолчанию также включены (.orig
).
Пример плейбука
---
- hosts: pgcluster
gather_facts: yes
become: yes
roles:
- name: fidanf.postgresql_ha
vars:
# Обязательные элементы конфигурации
repmgr_target_group: pgcluster
repmgr_master: pgsql01
repmgr_failover: automatic
repmgr_promote_command: /usr/bin/repmgr standby promote -f /etc/repmgr.conf --log-to-file
repmgr_follow_command: /usr/bin/repmgr standby follow -f /etc/repmgr.conf --log-to-file --upstream-node-id=%n
repmgr_monitoring_history: "yes"
repmgr_connection_check_type: query
repmgr_log_level: DEBUG
repmgr_reconnect_attempts: 2
repmgr_reconnect_interval: 10
# Основные настройки
postgresql_version: 13
postgresql_cluster_name: main
postgresql_cluster_reset: false # TODO: нужно протестировать для repmgr
postgresql_listen_addresses: "*"
postgresql_port: 5432
postgresql_wal_level: "replica"
postgresql_max_wal_senders: 10
postgresql_max_replication_slots: 10
postgresql_wal_keep_segments: 100
postgresql_hot_standby: on
postgresql_archive_mode: on
postgresql_archive_command: "test ! -f /tmp/%f && cp %p /tmp/%f"
postgresql_ext_install_repmgr: yes
postgresql_shared_preload_libraries:
- repmgr
# Логирование PostgreSQL
postgresql_log_checkpoints: on
postgresql_log_connections: on
postgresql_log_disconnections: on
postgresql_log_temp_files: 0
# pg_hba.conf
postgresql_pg_hba_custom:
- { type: "host", database: "all", user: "all", address: "192.168.56.0/24", method: "md5" }
- { type: "host", database: "replication", user: "{{ repmgr_user }}", address: "192.168.56.0/24", method: "trust" }
- { type: "host", database: "replication", user: "{{ repmgr_user }}", address: "127.0.0.1/32", method: "trust" }
- { type: "host", database: "{{ repmgr_database }}", user: "{{ repmgr_user }}", address: "127.0.0.1/32", method: "trust" }
- { type: "host", database: "{{ repmgr_database }}", user: "{{ repmgr_user }}", address: "192.168.56.0/32", method: "trust" }
# Базы данных
postgresql_databases:
- name: "{{ repmgr_database }}"
owner: "{{ repmgr_user }}"
encoding: "UTF-8"
- name: testdb
owner: admin
encoding: "UTF-8"
# Пользователи
postgresql_users:
- name: "{{ repmgr_user }}"
pass: "{{ repmgr_password }}"
- name: admin
pass: secret # postgresql >=10 не принимает незашифрованные пароли
encrypted: yes
# Роли
postgresql_user_privileges:
- name: "{{ repmgr_user }}"
db: "{{ repmgr_database }}"
priv: "ALL"
role_attr_flags: "SUPERUSER,REPLICATION"
- name: admin
db: testdb
role_attr_flags: "SUPERUSER"
Полезные команды для выполнения после первой установки
Проверка функциональности кластера
ansible pgcluster -b --become-user postgres -m shell -a "repmgr cluster crosscheck"
Показать статус кластера
ansible pgcluster -b --become-user postgres -m shell -a "repmgr cluster show"
Список узлов и их атрибутов
ansible pgcluster -b --become-user postgres -m shell -a "repmgr node status"
Регистрация (клонирование) дополнительного резервного узла
# Предполагая, что текущий основной хост называется pgsql01
ansible-playbook myplaybook.yml -l 'pgsql04' -e 'repmgr_primary_hostname=pgsql01' -vv
Регистрация предыдущего основного узла как резервного после автоматического переключения
postgres@pgsql01:~$ pg_ctlcluster 13 main stop
postgres@pgsql01:~$ repmgr standby clone --force -h pgsql02 -U repmgr -d repmgr
postgres@pgsql01:~$ pg_ctlcluster 13 main start
postgres@pgsql01:~$ repmgr standby register --force
Или вы можете использовать повторное присоединение узла repmgr с pg_rewind
repmgr node rejoin -d repmgr -U repmgr -h pgsql02 --verbose --force-rewind=/usr/lib/postgresql/13/bin/pg_rewind
Лицензия
MIT / BSD
Install and configure PostgreSQL cluster managed with repmgr. Add dependencies, extensions, databases and users.
ansible-galaxy install fidanf/ansible-role-postgresql-ha