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
jesttrue
) 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 | |
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 |
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
- 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
- Pobierz lub sklonuj to repozytorium
git clone https://github.com/vitabaks/postgresql_cluster.git
- Przejdź do katalogu playbooka
cd postgresql_cluster/automation
- 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
- 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
- Spróbuj połączyć się z hostami
ansible all -m ping
- 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"
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.
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
Wspieraj naszą pracę przez 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, ...
Są mile widziane!
PostgreSQL High-Availability Cluster (based on Patroni)
ansible-galaxy install vitabaks.postgresql_cluster