postgresql_cluster
Кластер PostgreSQL с высокой доступностью :слон: :искрящийся_сердце:
Готовый к эксплуатации кластер PostgreSQL с высокой доступностью (на основе Patroni). Автоматизация с помощью Ansible.
postgresql_cluster
автоматизирует развертывание и управление высокодоступными кластерами PostgreSQL в продуктивных средах. Это решение разработано для использования на выделенных физических серверах, виртуальных машинах, а также в локальных и облачных инфраструктурах.
Вы можете найти версию этой документации, которую проще искать и по которой легче навигировать на сайте postgresql-cluster.org
:trophy: Используйте программу спонсорства для получения персонализированной поддержки или просто для помощи в проекте.
Поддерживаемые конфигурации кластера Postgres
Доступно три схемы развертывания:
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 | |
Debian 12 | |
Ubuntu 22.04 | |
Ubuntu 24.04 | |
CentOS Stream 9 | |
Oracle Linux 8 | |
Oracle Linux 9 | |
Rocky Linux 8 | |
Rocky Linux 9 | |
AlmaLinux 8 | |
AlmaLinux 9 |
Версия 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.
Нажмите здесь, чтобы развернуть... если вы предпочитаете командную строку.
Командная строка
- Установите Ansible на одном управляющем узле (что будет легко ноутбук)
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
- Загрузите или клонируйте этот репозиторий
git clone https://github.com/vitabaks/postgresql_cluster.git
- Перейдите в каталог плейбука
cd postgresql_cluster/automation
- Отредактируйте файл инвентаря
Укажите (непубличные) IP-адреса и параметры подключения (ansible_user
, ansible_ssh_pass
или ansible_ssh_private_key_file
для вашей среды)
nano inventory
- Отредактируйте файл переменных 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
- Попробуйте подключиться к узлам
ansible all -m ping
- Запустите плейбук:
ansible-playbook deploy_pgcluster.yml
Развертывание кластера с TimescaleDB
Чтобы развернуть кластер PostgreSQL с высокой доступностью с расширением TimescaleDB, вам просто нужно добавить переменную enable_timescale
.
Пример:
ansible-playbook deploy_pgcluster.yml -e "enable_timescale=true"
Как начать с нуля
Если вы хотите начать с самого начала, вы можете использовать плейбук 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
Поддержите нашу работу через Patreon
Поддержите нашу работу через криптовалютный кошелек:
USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj
Лицензия
Лицензировано под MIT. См. файл LICENSE для подробностей.
Автор
Виталий Кухарик (DBA PostgreSQL)
vitabaks@gmail.com
Обратная связь, отчеты об ошибках, запросы, ...
PostgreSQL High-Availability Cluster (based on Patroni)
ansible-galaxy install vitabaks/postgresql_cluster