postgresql_cluster

Кластер PostgreSQL с высокой доступностью :слон: :искрящийся_сердце:

Лицензия GitHub Звезды на GitHub

Готовый к эксплуатации кластер PostgreSQL с высокой доступностью (на основе Patroni). Автоматизация с помощью Ansible.

postgresql_cluster автоматизирует развертывание и управление высокодоступными кластерами PostgreSQL в продуктивных средах. Это решение разработано для использования на выделенных физических серверах, виртуальных машинах, а также в локальных и облачных инфраструктурах.

Вы можете найти версию этой документации, которую проще искать и по которой легче навигировать на сайте postgresql-cluster.org

:trophy: Используйте программу спонсорства для получения персонализированной поддержки или просто для помощи в проекте.


Поддерживаемые конфигурации кластера Postgres

postgresql_cluster postgresql_cluster

Доступно три схемы развертывания:

1. Высокая доступность PostgreSQL только

Это простая схема без балансировщика нагрузки.

Компоненты высокой доступности:
  • Patroni — шаблон для создания настраиваемого решения высокой доступности с помощью Python и для максимальной доступности — распределенного конфигурационного хранилища, такого как ZooKeeper, etcd, Consul или Kubernetes. Используется для автоматического управления экземплярами PostgreSQL и автоматического переключения в случае сбоя.

  • etcd — распределенное надежное хранилище ключ-значение для самых критических данных распределенной системы. etcd написан на Go и использует алгоритм консенсуса Raft для управления высокодоступным реплицированным журналом. Он используется Patroni для хранения информации о состоянии кластера и параметрах конфигурации PostgreSQL. Что такое распределенный консенсус?

  • vip-manager (опционально, если указана переменная cluster_vip) — сервис, который запускается на всех узлах кластера и подключается к DCS. Если локальный узел владеет ключом лидера, vip-manager запускает настроенный VIP. В случае сбоя vip-manager удаляет VIP на старом лидере и соответствующий сервис на новом лидере запускает его там. Используется для предоставления одной точки доступа (VIP) к базе данных.

  • PgBouncer (опционально, если переменная pgbouncer_install равна true) — пул соединений для PostgreSQL.

2. Высокая доступность PostgreSQL с балансировкой нагрузки

Эта схема позволяет распределять нагрузку для операций чтения и также масштабировать кластер с помощью только для чтения реплик.

При развертывании в облачных провайдерах, таких как AWS, GCP, Azure, DigitalOcean и Hetzner Cloud, облачный балансировщик нагрузки автоматически создается по умолчанию для предоставления одной точки доступа к базе данных (управляется переменной cloud_load_balancer).

Для необлачных сред, таких как развертывание на ваших собственных машинах, доступен балансировщик нагрузки HAProxy. Чтобы его включить, установите with_haproxy_load_balancing: true в файле vars/main.yml.

:heavy_exclamation_mark: Примечание: ваше приложение должно поддерживать отправку запросов на чтение на пользовательский порт 5001 и запросов на запись на порт 5000.

  • порт 5000 (чтение / запись) мастер
  • порт 5001 (только чтение) все реплики
если переменная "synchronous_mode" равна 'true' (vars/main.yml):
  • порт 5002 (только чтение) только синхронная реплика
  • порт 5003 (только чтение) только асинхронные реплики
Компоненты балансировки нагрузки HAProxy:
  • HAProxy — бесплатное, очень быстрое и надежное решение, предлагающее высокую доступность, балансировку нагрузки и проксирование для приложений на основе TCP и HTTP.

  • confd управляет локальными файлами конфигурации приложений с использованием шаблонов и данных из etcd или consul. Используется для автоматизации управления файлом конфигурации HAProxy.

  • Keepalived (опционально, если указана переменная cluster_vip) предоставляет виртуальный высокодоступный IP-адрес (VIP) и единую точку доступа к базе данных. Реализует VRRP (Протокол избыточности виртуального маршрутизатора) для Linux. В нашей конфигурации keepalived проверяет состояние сервиса HAProxy и в случае сбоя передает VIP другому серверу в кластере.

3. Высокая доступность PostgreSQL с консультом сервисного обнаружения

Чтобы использовать эту схему, укажите dcs_type: consul в файле переменных vars/main.yml.

Эта схема подходит для доступа только к мастеру и для балансировки нагрузки (с использованием DNS) для чтения через реплики. Consul Сервисное обнаружение с разрешением DNS используется как клиентская точка доступа к базе данных.

Клиентская точка доступа (пример):

  • master.postgres-cluster.service.consul
  • replica.postgres-cluster.service.consul

Кроме того, это может быть полезно для распределенного кластера в разных центрах обработки данных. Мы можем заранее указать, в каком центре обработки данных расположен сервер базы данных, а затем использовать это для приложений, работающих в том же центре обработки данных.

Пример: replica.postgres-cluster.service.dc1.consul, replica.postgres-cluster.service.dc2.consul

Требуется установка консульта в клиентском режиме на каждом сервере приложения для разрешения DNS сервиса (или использование перенаправления DNS на удаленный консульский сервер вместо установки локального клиента консульта).

Совместимость

Дистрибутивы на базе RedHat и Debian (x86_64)

Поддерживаемые дистрибутивы Linux:
  • Debian: 11, 12
  • Ubuntu: 22.04, 24.04
  • CentOS Stream: 9
  • Oracle Linux: 8, 9
  • Rocky Linux: 8, 9
  • AlmaLinux: 8, 9
Версии PostgreSQL:

все поддерживаемые версии PostgreSQL

:white_check_mark: протестировано, работает нормально: PostgreSQL 10, 11, 12, 13, 14, 15, 16

Таблица результатов ежедневного автоматизированного тестирования развертывания кластера:

Дистрибутив Результат теста
Debian 11 Статус рабочего процесса GitHub
Debian 12 Статус рабочего процесса GitHub
Ubuntu 22.04 Статус рабочего процесса GitHub
Ubuntu 24.04 Статус рабочего процесса GitHub
CentOS Stream 9 Статус рабочего процесса GitHub
Oracle Linux 8 Статус рабочего процесса GitHub
Oracle Linux 9 Статус рабочего процесса GitHub
Rocky Linux 8 Статус рабочего процесса GitHub
Rocky Linux 9 Статус рабочего процесса GitHub
AlmaLinux 8 Статус рабочего процесса GitHub
AlmaLinux 9 Статус рабочего процесса GitHub
Версия Ansible

Минимально поддерживаемая версия Ansible: 8.0.0 (ansible-core 2.15.0)

Требования

Нажмите здесь, чтобы развернуть...

Этот плейбук требует прав администратора или sudo.

Ansible (Что такое Ansible?)

если dcs_type: "consul", пожалуйста, установите требования к ролям консульта на управляющем узле:

ansible-galaxy install -r roles/consul/requirements.yml

Требования к портам

Список необходимых TCP портов, которые должны быть открыты для кластера баз данных:

  • 5432 (postgresql)
  • 6432 (pgbouncer)
  • 8008 (patroni rest api)
  • 2379, 2380 (etcd)

для схемы "[Тип A] Высокая доступность PostgreSQL с балансировкой нагрузки":

  • 5000 (haproxy - (чтение/запись) мастер)
  • 5001 (haproxy - (только чтение) все реплики)
  • 5002 (haproxy - (только чтение) только синхронная реплика)
  • 5003 (haproxy - (только чтение) только асинхронные реплики)
  • 7000 (опционально, статистика haproxy)

для схемы "[Тип C] Высокая доступность PostgreSQL с консультом сервисного обнаружения (DNS)":

  • 8300 (RPC сервера Consul)
  • 8301 (Serf LAN Consul)
  • 8302 (Serf WAN Consul)
  • 8500 (HTTP API Consul)
  • 8600 (DNS сервер Consul)

Рекомендации

Нажмите здесь, чтобы развернуть...

  • linux (Операционная система):

Обновите вашу операционную систему на целевых серверах перед развертыванием;

Убедитесь, что у вас настроена синхронизация времени (NTP). Укажите ntp_enabled:'true' и ntp_servers, если вы хотите установить и настроить сервис ntp.

  • DCS (Распределенное хранилище консенсуса):

Быстрые диски и надежная сеть — самые важные факторы для производительности и стабильности кластера etcd (или consul).

Избегайте хранения данных etcd (или consul) на одном диске с другими процессами (такими как база данных), которые интенсивно используют ресурсы дисковой подсистемы! Храните данные etcd и postgresql на разных дисках (см. переменные etcd_data_dir, consul_data_path), используйте SSD-диски, если это возможно. Смотрите рекомендации по аппаратному обеспечению и настройка справочные документы.

Рекомендуется развертывать кластер DCS на выделенных серверах, отдельно от серверов баз данных.

  • Размещение членов кластера в разных центрах обработки данных:

Если вы предпочитаете настройку между разными центрами обработки данных, где реплицируемые базы данных располагаются в разных центрах, размещение членов etcd становится критичным.

Есть много нюансов, которые следует учитывать, если вы хотите создать действительно надежный кластер etcd, но есть одно правило: не размещайте всех членов etcd в вашем основном центре обработки данных. Смотрите некоторые примеры.

  • Как предотвратить потерю данных в случае автоматического переключения (synchronous_modes):

По причине производительности синхронная репликация по умолчанию отключена.

Чтобы минимизировать риск потери данных при автоматическом переключении, вы можете настроить параметры следующим образом:

  • synchronous_mode: 'true'
  • synchronous_mode_strict: 'true'
  • synchronous_commit: 'on' (или 'remote_apply')

Начало работы

Чтобы запустить консоль кластера PostgreSQL, выполните следующую команду:

docker run -d --name pg-console \
  --publish 80:80 \
  --publish 8080:8080 \
  --env PG_CONSOLE_API_URL=http://localhost:8080/api/v1 \
  --env PG_CONSOLE_AUTHORIZATION_TOKEN=secret_token \
  --volume console_postgres:/var/lib/postgresql \
  --volume /var/run/docker.sock:/var/run/docker.sock \
  --volume /tmp/ansible:/tmp/ansible \
  --restart=unless-stopped \
  vitabaks/postgresql_cluster_console:2.0.0

Примечание: Рекомендуется запускать консоль в одной сети с вашими серверами баз данных, чтобы включить мониторинг состояния кластера. В этом случае замените localhost на IP-адрес вашего сервера в переменной PG_CONSOLE_API_URL.

Откройте пользовательский интерфейс консоли

Перейдите на http://localhost/ и используйте secret_token для авторизации.

Примечание: Если вы настроили консоль на другом сервере, замените 'localhost' на адрес сервера. Используйте значение вашего токена, если вы переопределили его в переменной PG_CONSOLE_AUTHORIZATION_TOKEN.

Нажмите здесь, чтобы развернуть... если вы предпочитаете командную строку.

Командная строка

  1. Установите Ansible на одном управляющем узле (что будет легко ноутбук)
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
  1. Загрузите или клонируйте этот репозиторий
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. Перейдите в каталог плейбука
cd postgresql_cluster/automation
  1. Отредактируйте файл инвентаря
Укажите (непубличные) IP-адреса и параметры подключения (ansible_user, ansible_ssh_pass или ansible_ssh_private_key_file для вашей среды)
nano inventory
  1. Отредактируйте файл переменных vars/main.yml
nano vars/main.yml
Минимальный набор переменных:
  • proxy_env # если требуется (для загрузки пакетов)
  • cluster_vip # для клиентского доступа к базам данных в кластере (опционально)
  • patroni_cluster_name
  • postgresql_version
  • postgresql_data_dir
  • with_haproxy_load_balancing 'true' (Тип A) или 'false'/по умолчанию (Тип B)
  • dcs_type # "etcd" (по умолчанию) или "consul" (Тип C)

Смотрите файлы vars/main.yml, system.yml и (Debian.yml или RedHat.yml) для получения дополнительных деталей.

если dcs_type: "consul", пожалуйста, установите требования к ролям консульта на управляющем узле:

ansible-galaxy install -r roles/consul/requirements.yml
  1. Попробуйте подключиться к узлам
ansible all -m ping
  1. Запустите плейбук:
ansible-playbook deploy_pgcluster.yml

Развертывание кластера с TimescaleDB

Чтобы развернуть кластер PostgreSQL с высокой доступностью с расширением TimescaleDB, вам просто нужно добавить переменную enable_timescale.

Пример:

ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"

asciicast

Как начать с нуля

Если вы хотите начать с самого начала, вы можете использовать плейбук remove_cluster.yml.

Доступные переменные:

  • remove_postgres: остановить сервис PostgreSQL и удалить данные.
  • remove_etcd: остановить сервис ETCD и удалить данные.
  • remove_consul: остановить сервис Consul и удалить данные.

Запустите следующую команду, чтобы удалить определенные компоненты:

ansible-playbook remove_cluster.yml -e "remove_postgres=true remove_etcd=true"

Эта команда удалит указанные компоненты, позволяя вам начать новую установку с нуля.

:warning: Осторожно: будьте осторожны при запуске этой команды в продуктивной среде.

Оцените нас

Если вы находите наш проект полезным, подумайте о том, чтобы дать ему звезду на GitHub! Ваша поддержка помогает нам расти и мотивирует нас продолжать улучшение. Оценка проекта — это простой, но эффективный способ выразить свою благодарность и помочь другим его найти.

График истории звезд

Спонсируйте этот проект

Спонсируя наш проект, вы напрямую вносите вклад в его непрерывное улучшение и инновации. В качестве спонсора вы получите эксклюзивные преимущества, включая персонализированную поддержку, ранний доступ к новым функциям и возможность влиять на направление проекта. Ваше спонсорство для нас бесценно и помогает обеспечить устойчивость и прогресс проекта.

Станьте спонсором сегодня и помогите нам вывести этот проект на новый уровень!

Поддержите нашу работу через GitHub Sponsors

GitHub Sponsors

Поддержите нашу работу через Patreon

Поддержите меня на Patreon

Поддержите нашу работу через криптовалютный кошелек:

USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj

Лицензия

Лицензировано под MIT. См. файл LICENSE для подробностей.

Автор

Виталий Кухарик (DBA PostgreSQL)
vitabaks@gmail.com

Обратная связь, отчеты об ошибках, запросы, ...

Приветствуются!

О проекте

PostgreSQL High-Availability Cluster (based on Patroni)

Установить
ansible-galaxy install vitabaks/postgresql_cluster
Лицензия
mit
Загрузки
622
Владелец