vitabaks.postgresql_cluster

Klaster PostgreSQL o wysokiej dostępności :elephant: :sparkling_heart:

Producent przystosowany klaster PostgreSQL o wysokiej dostępności (oparty na Patroni). Automatyzacja z Ansible.

postgresql_cluster automatyzuje wdrażanie i zarządzanie wysoce dostępnymi klastrami PostgreSQL w środowiskach produkcyjnych. To rozwiązanie jest zoptymalizowane do użycia na dedykowanych serwerach fizycznych, maszynach wirtualnych oraz w infrastrukturze lokalnej i chmurowej.

Możesz znaleźć wersję tej dokumentacji, która jest bardziej przeszukiwana i łatwiejsza w nawigacji na stronie postgresql-cluster.org.

:trophy: Skorzystaj z programu wsparcia aby uzyskać spersonalizowane wsparcie lub po prostu przyczynić się do tego projektu.


Obsługiwane konfiguracje klastra Postgres

Masz do dyspozycji trzy schematy wdrażania:

1. Tylko wysokiej dostępności PostgreSQL

To prosty schemat bez równoważenia obciążenia.

Składniki wysokiej dostępności:
  • Patroni to szablon umożliwiający stworzenie własnego dostosowanego rozwiązania wysokiej dostępności przy użyciu Pythona i - dla maksymalnej dostępności - rozproszonego systemu konfiguracji, takiego jak ZooKeeper, etcd, Consul lub Kubernetes. Używane do automatycznego zarządzania instancjami PostgreSQL oraz automatycznego przełączania awaryjnego.

  • etcd to rozproszony, niezawodny magazyn klucz-wartość dla najważniejszych danych w systemie rozproszonym. etcd jest napisany w Go i wykorzystuje algorytm konsensusu Raft do zarządzania wysoko dostępnością replikowanego dziennika. Jest używany przez Patroni do przechowywania informacji o statusie klastra i parametrach konfiguracji PostgreSQL. Czym jest konsensus rozproszony?

  • vip-manager (opcjonalnie, jeśli zmienna cluster_vip jest określona) to usługa, która uruchamia się na wszystkich węzłach klastra i łączy się z DCS. Jeśli lokalny węzeł posiada klucz lidera, vip-manager uruchamia skonfigurowany VIP. W przypadku przełączenia awaryjnego, vip-manager usuwa VIP na starym liderze, a usługa na nowym liderze zaczyna go tam. Używane do zapewnienia jednego punktu dostępu (VIP) do bazy danych.

  • PgBouncer (opcjonalnie, jeśli zmienna pgbouncer_install jest true) to pulpit połączeń dla PostgreSQL.

2. Wysoka dostępność PostgreSQL z równoważeniem obciążenia

Ten schemat umożliwia rozkład obciążenia dla operacji odczytu oraz pozwala na skalowanie klastra z replikami tylko do odczytu.

Podczas wdrażania w dostawcach chmurowych, takich jak AWS, GCP, Azure, DigitalOcean i Hetzner Cloud, zrównoważona obciążeniem chmury jest automatycznie tworzona jako domyślna, co zapewnia jeden punkt dostępu do bazy danych (sterowany przez zmienną cloud_load_balancer).

Dla środowisk niechmurowych, takich jak wdrażanie na własnych maszynach, dostępny jest load balancer HAProxy. Aby go włączyć, ustaw with_haproxy_load_balancing: true w pliku vars/main.yml.

:heavy_exclamation_mark: Uwaga: Twoja aplikacja musi obsługiwać wysyłanie zapytań do odczytu na niestandardowy port 5001, a zapytań do zapisu na porcie 5000.

  • port 5000 (odczyt/zapis) master
  • port 5001 (tylko odczyt) wszystkie repliki
jeśli zmienna "synchronous_mode" jest 'true' (vars/main.yml):
  • port 5002 (tylko odczyt) tylko replikę synchronizującą
  • port 5003 (tylko odczyt) tylko asynchroniczne repliki
Składniki równoważenia obciążenia HAProxy:
  • HAProxy to szybkie, niezawodne rozwiązanie oferujące wysoką dostępność, równoważenie obciążenia i proxy dla aplikacji opartych na TCP i HTTP.

  • confd zarządza lokalnymi plikami konfiguracyjnymi aplikacji, wykorzystując szereg szablonów i dane z etcd lub consul. Używane do automatyzacji zarządzania plikami konfiguracyjnymi HAProxy.

  • Keepalived (opcjonalnie, jeśli zmienna cluster_vip jest określona) zapewnia wirtualny adres IP o wysokiej dostępności (VIP) i jeden punkt wejściowy do dostępu do baz danych. Realizuje protokoły VRRP (Virtual Router Redundancy Protocol) dla Linuksa. W naszej konfiguracji keepalived sprawdza status usługi HAProxy i w przypadku awarii deleguje VIP na inny serwer w klastrze.

3. Wysoka dostępność PostgreSQL z odkrywaniem usług Consul

Aby użyć tego schematu, określ dcs_type: consul w pliku zmiennych vars/main.yml.

Ten schemat nadaje się do dostępu tylko do głównego i równoważenia obciążenia (używając DNS) dla odczytu przez repliki. Odkrywanie usług Consul z rozwiązywaniem DNS jest używane jako punkt dostępu klientów do bazy danych.

Punkt dostępu klientów (przykład):

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

Oprócz tego, może być użyteczne dla rozproszonego klastra w różnych centrach danych. Możemy wcześniej określić, w którym centrum danych znajduje się serwer bazy danych, a następnie użyć go dla aplikacji działających w tym samym centrum danych.

Przykład: replica.postgres-cluster.service.dc1.consul, replica.postgres-cluster.service.dc2.consul.

Wymaga zainstalowania consul w trybie klienta na każdym serwerze aplikacyjnym do rozwiązywania DNS serwisów (lub użycia przekazywania DNS do zdalnego serwera consul zamiast instalacji lokalnego klienta consul).

Kompatybilność

Dyztrubucje oparte na RedHat i Debian (x86_64)

Obsługiwane dystrybucje Linuksa:
  • Debian: 11, 12
  • Ubuntu: 22.04, 24.04
  • CentOS Stream: 9
  • Oracle Linux: 8, 9
  • Rocky Linux: 8, 9
  • AlmaLinux: 8, 9
Wersje PostgreSQL:

wszystkie obsługiwane wersje PostgreSQL

:white_check_mark: przetestowane, działa dobrze: PostgreSQL 10, 11, 12, 13, 14, 15, 16

Tabela wyników codziennych testów automatycznych wdrożenia klastra:

Dystrybucja Wynik testu
Debian 11 GitHub Workflow Status
Debian 12 GitHub Workflow Status
Ubuntu 22.04 GitHub Workflow Status
Ubuntu 24.04 GitHub Workflow Status
CentOS Stream 9 GitHub Workflow Status
Oracle Linux 8 GitHub Workflow Status
Oracle Linux 9 GitHub Workflow Status
Rocky Linux 8 GitHub Workflow Status
Rocky Linux 9 GitHub Workflow Status
AlmaLinux 8 GitHub Workflow Status
AlmaLinux 9 GitHub Workflow Status
Wersja Ansible

Minimalna wspierana wersja Ansible: 8.0.0 (ansible-core 2.15.0)

Wymagania

Kliknij tutaj, aby rozwinąć...

Ten playbook wymaga uprawnień roota lub sudo.

Ansible (Czym jest Ansible?)

jeśli dcs_type: "consul", zainstaluj wymagania roli consul na węźle kontrolnym:

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

Wymagania dotyczące portów

Lista wymaganych portów TCP, które muszą być otwarte dla klastra baz danych:

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

dla schematu "[Typ A] Wysoka dostępność PostgreSQL z równoważeniem obciążenia":

  • 5000 (haproxy - (odczyt/zapis) master)
  • 5001 (haproxy - (tylko odczyt) wszystkie repliki)
  • 5002 (haproxy - (tylko odczyt) tylko replikę synchronizującą)
  • 5003 (haproxy - (tylko odczyt) tylko asynchroniczne repliki)
  • 7000 (opcjonalnie, statystyki haproxy)

dla schematu "[Typ C] Wysoka dostępność PostgreSQL z odkrywaniem usług Consul (DNS)":

  • 8300 (RPC serwera Consul)
  • 8301 (Consul Serf LAN)
  • 8302 (Consul Serf WAN)
  • 8500 (API HTTP Consul)
  • 8600 (serwer DNS Consul)

Rekomendacje

Kliknij tutaj, aby rozwinąć...

  • linux (system operacyjny):

Zaktualizuj swój system operacyjny na serwerach docelowych przed wdrożeniem;

Upewnij się, że masz skonfigurowaną synchronizację czasową (NTP). Określ ntp_enabled:'true' oraz ntp_servers, jeśli chcesz zainstalować i skonfigurować usługę ntp.

  • DCS (rozproszony magazyn konsensusu):

Szybkie dyski i niezawodna sieć to najważniejsze czynniki dla wydajności i stabilności klastra etcd (lub consul).

Unikaj przechowywania danych etcd (lub consul) na tym samym dysku co inne procesy (np. baza danych), które intensywnie wykorzystują zasoby podsystemu dyskowego! Przechowuj dane etcd i postgresql na oddzielnych dyskach (patrz zmienne etcd_data_dir, consul_data_path), jeśli to możliwe, użyj dysków SSD. Zobacz zalecenia dotyczące sprzętu i poradniki optymalizacji.

Zaleca się wdrażanie klastra DCS na dedykowanych serwerach, oddzielonych od serwerów baz danych.

  • Umiejscowienie członków klastra w różnych centrach danych:

Jeśli preferujesz konfigurację między centrami danych, w której replikowane bazy danych znajdują się w różnych centrach danych, umiejscowienie członków etcd staje się krytyczne.

Jest wiele rzeczy do rozważenia, jeśli chcesz stworzyć naprawdę solidny klaster etcd, ale jest jedna zasada: nie umieszczaj wszystkich członków etcd w swoim głównym centrum danych. Zobacz kilka przykładów.

  • Jak zapobiegać utracie danych w przypadku automatycznego przełączania awaryjnego (synchronous_modes):

Z powodów wydajnościowych, replikacja synchronizująca jest domyślnie wyłączona.

Aby zminimalizować ryzyko utraty danych przy automatycznym przełączaniu, możesz skonfigurować ustawienia w następujący sposób:

  • synchronous_mode: 'true'
  • synchronous_mode_strict: 'true'
  • synchronous_commit: 'on' (lub 'remote_apply')

Rozpoczęcie

Aby uruchomić konsolę klastra PostgreSQL, wykonaj następujące polecenie:

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

Uwaga: Zaleca się uruchomienie konsoli w tej samej sieci co twoje serwery baz danych, aby umożliwić monitorowanie stanu klastra. W takim przypadku zastąp localhost adresem IP swojego serwera w zmiennej PG_CONSOLE_API_URL.

Otwórz interfejs użytkownika konsoli

Przejdź do http://localhost/ i użyj secret_token do autoryzacji.

Uwaga: Jeśli skonfigurowałeś konsolę na innym serwerze, zastąp 'localhost' adresem serwera. Użyj wartości swojego tokena, jeśli zmieniłeś go w zmiennej PG_CONSOLE_AUTHORIZATION_TOKEN.

Kliknij tutaj, aby rozwinąć... jeśli preferujesz wiersz polecenia.

Wiersz polecenia

  1. Zainstaluj Ansible na jednym węźle kontrolnym (może to być laptop)
sudo apt update && sudo apt install -y python3-pip sshpass git
pip3 install ansible
  1. Pobierz lub sklonuj to repozytorium
git clone https://github.com/vitabaks/postgresql_cluster.git
  1. Przejdź do katalogu playbooka
cd postgresql_cluster/automation
  1. Edytuj plik inwentarza
Określ (niepubliczne) adresy IP i ustawienia połączenia (ansible_user, ansible_ssh_pass lub ansible_ssh_private_key_file dla twojego środowiska)
nano inventory
  1. Edytuj plik zmiennych vars/main.yml
nano vars/main.yml
Minimalny zestaw zmiennych:
  • proxy_env # jeśli wymagane (do pobierania pakietów)
  • cluster_vip # do dostępu klientów do baz danych w klastrze (opcjonalnie)
  • patroni_cluster_name
  • postgresql_version
  • postgresql_data_dir
  • with_haproxy_load_balancing 'true' (Typ A) lub 'false'/domyślnie (Typ B)
  • dcs_type # "etcd" (domyślnie) lub "consul" (Typ C)

Zobacz pliki vars/main.yml, system.yml oraz (Debian.yml lub RedHat.yml) dla więcej szczegółów.

jeśli dcs_type: "consul", zainstaluj wymagania roli consul na węźle kontrolnym:

ansible-galaxy install -r roles/consul/requirements.yml
  1. Spróbuj połączyć się z hostami
ansible all -m ping
  1. Uruchom playbook:
ansible-playbook deploy_pgcluster.yml

Wdrożenie klastra z TimescaleDB

Aby wdrożyć klaster PostgreSQL o wysokiej dostępności z rozszerzeniem TimescaleDB, wystarczy dodać zmienną enable_timescale.

Przykład:

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

asciicast

Jak rozpocząć od zera

Jeśli chcesz rozpocząć od samego początku, możesz użyć playbooka remove_cluster.yml.

Dostępne zmienne:

  • remove_postgres: zatrzymaj usługę PostgreSQL i usuń dane.
  • remove_etcd: zatrzymaj usługę ETCD i usuń dane.
  • remove_consul: zatrzymaj usługę Consul i usuń dane.

Uruchom następujące polecenie, aby usunąć określone składniki:

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

To polecenie usunie określone składniki, co pozwoli rozpocząć nową instalację od zera.

:warning: Uwaga: bądź ostrożny przy uruchamianiu tego polecenia w środowisku produkcyjnym.

Oznacz nas

Jeśli uważasz, że nasz projekt jest pomocny, rozważ przyznanie mu gwiazdki na GitHubie! Twoje wsparcie pomaga nam rosnąć i motywuje nas do dalszego doskonalenia. Oznaczanie projektu to prosty, ale skuteczny sposób na okazanie uznania i pomoc innym w jego odkrywaniu.

Wykres historii gwiazdek

Sponsoruj ten projekt

Sponsoring naszego projektu bezpośrednio przyczynia się do jego ciągłego rozwoju i innowacji. Jako sponsor otrzymasz ekskluzywne korzyści, w tym spersonalizowane wsparcie, wczesny dostęp do nowych funkcji i możliwość wywierania wpływu na kierunek projektu. Twoje wsparcie jest dla nas niezwykle cenne i pomaga zapewnić trwałość i postęp projektu.

Zostań sponsorem już dziś i pomóż nam poprawić ten projekt!

Wspieraj naszą pracę przez GitHub Sponsors

GitHub Sponsors

Wspieraj naszą pracę przez Patreon

Wspieraj mnie na Patreon

Wspieraj naszą pracę przez portfel kryptograficzny:

USDT (TRC20): TSTSXZzqDCUDHDjZwCpuBkdukjuDZspwjj

Licencja

Licencjonowane na podstawie Licencji MIT. Zobacz plik LICENSE po szczegóły.

Autor

Vitaliy Kukharik (DBA PostgreSQL)
vitabaks@gmail.com

Opinie, raporty błędów, prośby, ...

mile widziane!

O projekcie

PostgreSQL High-Availability Cluster (based on Patroni)

Zainstaluj
ansible-galaxy install vitabaks.postgresql_cluster
Licencja
mit
Pobrania
735
Właściciel