ProHoster > Blog > Uprava > Gradnja visoko razpoložljive gruče PostgreSQL z uporabo Patronija itd., HAProxy
Gradnja visoko razpoložljive gruče PostgreSQL z uporabo Patronija itd., HAProxy
Zgodilo se je, da takrat, ko je bil problem zastavljen, nisem imel dovolj izkušenj, da bi sam razvil in lansiral to rešitev. In potem sem začel googlati.
Ne vem, v čem je caka, a že ko najstič se soočam z dejstvom, da tudi če naredim vse korak za korakom kot v vadnici, pripravim enako okolje kot avtor, potem nikoli nič ne deluje. Nimam pojma, kaj je narobe, a ko sem spet naletel na to, sem se odločil, da bom napisal svojo vadnico, ko bo vse delovalo. Takšen, ki bo zagotovo deloval.
Vodniki na internetu
Slučajno internet ne trpi zaradi pomanjkanja raznih vodnikov, tutorialov, korak za korakom in podobno. Zgodilo se je, da sem dobil nalogo razviti rešitev za priročno organizacijo in izgradnjo samodejne gruče PostgreSQL, katere glavne zahteve so bile pretočna replikacija z glavnega strežnika na vse replike in samodejno zagotavljanje rezerve v primeru glavnega strežnika. neuspeh.
Na tej stopnji je bil določen kup uporabljenih tehnologij:
HAproxy za organiziranje enotne vstopne točke za aplikacije, ki uporabljajo bazo podatkov
Namestitev
Za vašo pozornost - izgradnja visoko razpoložljive gruče PostgreSQL z uporabo Patronija itd., HAProxy.
Vse operacije so bile izvedene na virtualnih strojih z nameščenim operacijskim sistemom Debian 10 OS.
itdd
Ne priporočam namestitve etcd na iste stroje, kjer bosta patroni in postgresql, saj je obremenitev diska zelo pomembna za etcd. Toda v izobraževalne namene bomo storili prav to.
Namestimo etcd.
#!/bin/bash
apt-get update
apt-get install etcd
Dodajte vsebino v datoteko /etc/default/etcd
[član]
ETCD_NAME=datanode1 # ime gostitelja vašega računalnika
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
VSI NASLOVI IP MORAJO BITI VELJAVNI. LISTER PEER, CLIENT itd. MORA BITI NASTAVLJEN NA IP NASLOV GOSTITELJA
Prva stvar, ki jo morate narediti, je, da nastavite tri virtualne stroje, da na njih namestite potrebno programsko opremo. Po namestitvi strojev, če sledite moji vadnici, lahko zaženete ta preprost skript, ki bo (skoraj) naredil vse namesto vas. Zažene se kot root.
Upoštevajte, da skript uporablja različico PostgreSQL 9.6, kar je posledica notranjih zahtev našega podjetja. Rešitev ni bila testirana na drugih različicah PostgreSQL.
Nato morate v datoteko /etc/patroni.yml, ki ste jo pravkar ustvarili, postaviti naslednjo vsebino, seveda spremeniti naslove IP na vseh mestih na naslove, ki jih uporabljate.
Bodite pozorni na komentarje v tem yamlu. Spremenite naslove v svoje na vsakem računalniku v gruči.
/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
Skript je treba zagnati na vseh treh napravah v gruči, zgornja konfiguracija pa mora biti nameščena tudi v datoteko /etc/patroni.yml na vseh napravah.
Ko zaključite te operacije na vseh računalnikih v gruči, zaženite naslednji ukaz na katerem koli od njih
Počakajte približno 30 sekund, nato pa zaženite ta ukaz na preostalih računalnikih v gruči.
HAproxy
Za zagotavljanje ene same vstopne točke uporabljamo čudovit HAproxy. Glavni strežnik bo vedno na voljo na naslovu računalnika, na katerem je nameščen HAproxy.
Da stroj s HAproxyjem ne bo postal ena sama točka odpovedi, ga bomo zagnali v vsebniku Docker; v prihodnosti ga bo mogoče zagnati v gručo K8 in narediti našo gručo za odpoved še bolj zanesljivo.
Ustvarite imenik, kamor lahko shranite dve datoteki - Dockerfile in haproxy.cfg. Pojdi k temu.
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
Bodite previdni, zadnje tri vrstice datoteke haproxy.cfg bi morale vsebovati naslove vaših strojev. HAproxy bo stopil v stik s Patronijem, v glavah HTTP bo glavni strežnik vedno vrnil 200, replika pa bo vedno vrnila 503.
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
V imeniku, v katerem "ležita" obe naši datoteki, zaporedno izvedemo ukaze za pakiranje vsebnika in ga zaženemo s posredovanjem potrebnih vrat:
Zdaj, ko odprete naslov vašega računalnika s HAproxy v brskalniku in določite vrata 7000, boste videli statistiko o vaši gruči.
Strežnik, ki je glavni, bo v stanju GOR, replike pa bodo v stanju DOL. To je normalno, pravzaprav delujejo, vendar so prikazani tako, ker vrnejo 503 za zahteve HAproxy. To nam omogoča, da vedno natančno vemo, kateri od treh strežnikov je trenutni glavni.
Zaključek
Ti si čudovit! V samo 30 minutah ste uvedli odlično odporno na napake in visoko zmogljivo gručo baze podatkov s pretočno replikacijo in samodejnim nadomestnim delovanjem. Če nameravate uporabiti to rešitev, preverite z uradno Patronijevo dokumentacijo, predvsem pa z delom, ki se nanaša na pripomoček patronictl, ki omogoča priročen dostop do upravljanja vaše gruče.