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:

Требования

  • 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

Зависимости

Пример инвентаря

Смотрите 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
Лицензия
mit
Загрузки
643
Владелец
DevOps Engineer ~ Ansible lover & CI/CD builder. I'm learning to more effectively deploy and monitor apps every day.