ProHoster > Blog > administrasie > Die bou van 'n hoë beskikbaarheid PostgreSQL-kluster met behulp van Patroni, ens., HAProxy
Die bou van 'n hoë beskikbaarheid PostgreSQL-kluster met behulp van Patroni, ens., HAProxy
Dit het net so gebeur dat ek, ten tyde van die opstel van die taak, nie 'n voldoende mate van ondervinding gehad het om hierdie oplossing alleen te ontwikkel en uit te voer nie. En toe begin ek google.
Ek weet nie wat die vangs is nie, maar vir die soveelste keer kom ek op die feit af dat al doen jy alles stap vir stap soos in die tutoriaal, berei dieselfde omgewing as die skrywer s'n voor, dit werk steeds nooit. Ek het geen idee wat die saak is nie, maar toe ek weer hier raak, het ek besluit – en ek sal my tutoriaal skryf wanneer alles uitwerk. Een wat beslis sal werk.
Gidse op die internet
Dit gebeur net dat die internet nie ly aan 'n gebrek aan verskeie gidse, tutoriale, stap-vir-stap en dies meer nie. Dit het net so gebeur dat ek die taak gekry het om 'n oplossing te ontwikkel vir die gerieflike organisering en bou van 'n PostgreSQL failover-kluster, waarvan die hoofvereistes stroomreplikasie van die Meesterbediener na alle replikas was en outomatiese terugval wanneer die Meesterbediener misluk.
Op hierdie stadium is die stapel tegnologieë wat gebruik is bepaal:
HAproxy vir die organisering van 'n enkele toegangspunt vir toepassings wat die databasis gebruik
installasie
U aandag bou 'n hoë beskikbaarheid PostgreSQL-groepering met behulp van Patroni, ens., HAProxy.
Alle bewerkings is uitgevoer op virtuele masjiene met Debian 10 OS geïnstalleer.
ens
Ek beveel nie aan om etcd op dieselfde masjiene te installeer waar patroni en postgresql geleë sal wees nie, aangesien skyflaai baie belangrik is vir etcd. Maar vir opvoedkundige doeleindes sal ons dit doen.
Installeer ens.
#!/bin/bash
apt-get update
apt-get install etcd
Voeg inhoud by /etc/default/etcd-lêer
[lid]
ETCD_NAME=datanode1 # gasheernaam van jou masjien
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ALLE IP ADRESSE MOET GELDIG WEES. LISTER PEER, KLIËNT, ens. MOET OP DIE IP-ADRES VAN GESEER GESTEL WORD
Die eerste ding om te doen is om drie virtuele masjiene op te stel om die nodige sagteware daarop te installeer. Nadat u die masjiene geïnstalleer het, as u my tutoriaal volg, kan u hierdie eenvoudige skrif uitvoer wat (amper) alles vir u sal doen. Loop as wortel.
Neem asseblief kennis dat die skrif die PostgreSQL 9.6-weergawe gebruik, dit is as gevolg van die interne vereistes van ons maatskappy. Die oplossing is nie op ander PostgreSQL-weergawes getoets nie.
Vervolgens, in die /etc/patroni.yml-lêer wat jy sopas geskep het, moet jy die volgende inhoud plaas, natuurlik verander die ip-adresse op alle plekke na die adresse wat jy gebruik.
Gee aandag aan die opmerkings in hierdie yaml. Verander die adresse na jou eie, op elke masjien in die groepie.
/etc/patroni.yml
scope: pgsql # должно быть одинаковым на всех нодах
namespace: /cluster/ # должно быть одинаковым на всех нодах
name: postgres1 # должно быть разным на всех нодах
restapi:
listen: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл
connect_address: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # перечислите здесь все ваши ноды, в случае если вы устанавливаете etcd на них же
# this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `global configuration`
bootstrap:
dcs:
ttl: 100
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
hot_standby: "on"
wal_keep_segments: 5120
max_wal_senders: 5
max_replication_slots: 5
checkpoint_timeout: 30
initdb:
- encoding: UTF8
- data-checksums
- locale: en_US.UTF8
# init pg_hba.conf должен содержать адреса ВСЕХ машин, используемых в кластере
pg_hba:
- host replication postgres ::1/128 md5
- host replication postgres 127.0.0.1/8 md5
- host replication postgres 192.168.0.143/24 md5
- host replication postgres 192.168.0.144/24 md5
- host replication postgres 192.168.0.145/24 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: admin
options:
- createrole
- createdb
postgresql:
listen: 192.168.0.143:5432 # адрес той ноды, в которой находится этот файл
connect_address: 192.168.0.143:5432 # адрес той ноды, в которой находится этот файл
data_dir: /data/patroni # эту директорию создаст скрипт, описанный выше и установит нужные права
bin_dir: /usr/lib/postgresql/9.6/bin # укажите путь до вашей директории с postgresql
pgpass: /tmp/pgpass
authentication:
replication:
username: postgres
password: postgres
superuser:
username: postgres
password: postgres
create_replica_methods:
basebackup:
checkpoint: 'fast'
parameters:
unix_socket_directories: '.'
tags:
nofailover: false
noloadbalance: false
clonefrom: false
nosync: false
Die skrip moet op al drie masjiene van die groepering uitgevoer word, op dieselfde manier is dit nodig om die bogenoemde konfigurasie in die /etc/patroni.yml lêer op alle masjiene te plaas.
Wanneer jy hierdie bewerkings op alle groepmasjiene gedoen het, voer die volgende opdrag op enige van hulle uit
Wag ongeveer 30 sekondes en voer dan hierdie opdrag op die res van die masjiene in die groep uit.
HAproxy
Ons gebruik die wonderlike HAproxy om 'n enkele toegangspunt te bied. Die hoofbediener sal altyd beskikbaar wees by die adres van die masjien waar HAproxy ontplooi is.
Om nie die masjien met HAproxy 'n enkele punt van mislukking te maak nie, sal ons dit in 'n Docker-houer laat loop, in die toekoms sal dit moontlik wees om dit in 'n K8 se cluster te laat loop en ons failover cluster nog meer betroubaar te maak.
Skep 'n gids waar jy twee lêers kan stoor - Dockerfile en haproxy.cfg. Gaan daarin.
dockerfile
FROM ubuntu:latest
RUN apt-get update
&& apt-get install -y haproxy rsyslog
&& rm -rf /var/lib/apt/lists/*
RUN mkdir /run/haproxy
COPY haproxy.cfg /etc/haproxy/haproxy.cfg
CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log
Wees versigtig, die laaste drie reëls van die haproxy.cfg lêer moet die adresse van jou masjiene lys. HAproxy sal Patroni kontak, in HTTP-opskrifte sal die hoofbediener altyd 200 gee, en die replika sal altyd 503 terugstuur.
haproxy.cfg
global
maxconn 100
defaults
log global
mode tcp
retries 2
timeout client 30m
timeout connect 4s
timeout server 30m
timeout check 5s
listen stats
mode http
bind *:7000
stats enable
stats uri /
listen postgres
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008
server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008
server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008
Omdat ons in die gids is waarin beide van ons lêers "lê", sal ons die opdragte vir die verpakking van die houer opeenvolgend uitvoer, sowel as dit begin met die nodige poorte wat aangestuur word:
Nou, wanneer jy die adres van jou masjien met HAproxy in die blaaier oopmaak en poort 7000 spesifiseer, sal jy die statistieke vir jou groepie sien.
Die bediener wat die meester is, sal in die UP-toestand wees, en die replikas sal in die DOWN-toestand wees. Dit is normaal, in werklikheid werk hulle, maar hulle word in hierdie vorm vertoon as gevolg van die feit dat hulle 503 terugstuur op versoeke van HAproxy. Dit stel ons in staat om altyd presies te weet watter van die drie bedieners die huidige meester is.
Gevolgtrekking
Jy is pragtig! In net 30 minute het jy 'n wonderlike failover- en prestasiedatabasisgroepering met stroomreplikasie en outomatiese failover ontplooi. As jy van plan is om hierdie oplossing te gebruik, kyk asseblief met amptelike Patroni-dokumentasie, en veral met sy deel met betrekking tot die patronictl-nut, wat gerieflike toegang bied tot die bestuur van jou cluster.