ProHoster > Blog > Administrácia > Vytvorenie vysoko dostupného klastra PostgreSQL pomocou Patroni, etcd, HAProxy
Vytvorenie vysoko dostupného klastra PostgreSQL pomocou Patroni, etcd, HAProxy
Náhodou sa stalo, že v čase, keď sa problém objavil, som nemal dostatok skúseností na vývoj a spustenie tohto riešenia sám. A potom som začal googliť.
Neviem, v čom je háčik, ale už po niekoľkýkrát sa stretávam s tým, že aj keď robím všetko krok za krokom ako v návode, pripravím si rovnaké prostredie ako autor, tak nikdy nič nefunguje. Netuším, čo sa deje, ale keď som sa s tým znova stretol, rozhodol som sa, že keď všetko pôjde, napíšem svoj vlastný návod. Taký, ktorý bude určite fungovať.
Sprievodcovia na internete
Stáva sa, že internet netrpí nedostatkom rôznych návodov, tutoriálov, krok za krokom a podobne. Náhodou som dostal za úlohu vyvinúť riešenie na pohodlnú organizáciu a vybudovanie failover PostgreSQL klastra, ktorého hlavnými požiadavkami boli streamingová replikácia z Master servera na všetky repliky a automatické poskytovanie rezervy v prípade Master servera. zlyhanie.
V tejto fáze sa určilo množstvo použitých technológií:
HAproxy na organizovanie jedného vstupného bodu pre aplikácie využívajúce databázu
Inštalácia
Pre vašu pozornosť - vytvorenie vysoko dostupného klastra PostgreSQL pomocou Patroni, etcd, HAProxy.
Všetky operácie boli vykonávané na virtuálnych strojoch s nainštalovaným OS Debian 10.
atď
Neodporúčam inštalovať etcd na tie isté počítače, kde budú umiestnené patroni a postgresql, pretože zaťaženie disku je pre etcd veľmi dôležité. Ale na vzdelávacie účely to urobíme.
Poďme nainštalovať etcd.
#!/bin/bash
apt-get update
apt-get install etcd
Pridajte obsah do súboru /etc/default/etcd
[člen]
ETCD_NAME=datanode1 # názov hostiteľa vášho počítača
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
VŠETKY IP ADRESY BY MALI BYŤ PLATNÉ. LISTER PEER, KLIENT atď. BY MALI BYŤ NASTAVENÉ NA IP ADRESU HOSTITEĽA
Prvá vec, ktorú musíte urobiť, je nastaviť tri virtuálne počítače, aby ste na ne nainštalovali potrebný softvér. Po inštalácii strojov, ak budete postupovať podľa môjho tutoriálu, môžete spustiť tento jednoduchý skript, ktorý (takmer) urobí všetko za vás. Beží ako root.
Upozorňujeme, že skript používa PostgreSQL verziu 9.6, je to kvôli interným požiadavkám našej spoločnosti. Riešenie nebolo testované na iných verziách PostgreSQL.
Ďalej, do súboru /etc/patroni.yml, ktorý ste práve vytvorili, musíte umiestniť nasledujúci obsah, samozrejme zmeniť adresy IP na všetkých miestach na adresy, ktoré používate.
Venujte pozornosť komentárom v tomto yaml. Zmeňte adresy na svoje vlastné na každom počítači v klastri.
/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 musí byť spustený na všetkých troch počítačoch klastra a vyššie uvedená konfigurácia musí byť umiestnená aj v súbore /etc/patroni.yml na všetkých počítačoch.
Po dokončení týchto operácií na všetkých počítačoch v klastri spustite na ktoromkoľvek z nich nasledujúci príkaz
Počkajte asi 30 sekúnd a potom spustite tento príkaz na zostávajúcich počítačoch v klastri.
HAproxy
Používame úžasné HAproxy, aby sme poskytli jediný vstupný bod. Hlavný server bude vždy dostupný na adrese stroja, na ktorom je nasadené HAproxy.
Aby sa stroj s HAproxy nestal jediným bodom zlyhania, spustíme ho v kontajneri Docker; v budúcnosti môže byť spustený do klastra K8 a náš klaster prepnutia pri zlyhaní bude ešte spoľahlivejší.
Vytvorte si adresár, do ktorého môžete uložiť dva súbory – Dockerfile a haproxy.cfg. Choďte do toho.
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
Buďte opatrní, posledné tri riadky súboru haproxy.cfg by mali uvádzať adresy vašich počítačov. HAproxy bude kontaktovať Patroni, v hlavičkách HTTP hlavný server vždy vráti 200 a replika vždy vráti 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
Keďže sme v adresári, v ktorom „ležia oba naše súbory“, vykonáme postupne príkazy na balenie kontajnera, ako aj jeho spustenie s preposielaním potrebných portov:
Otvorením adresy vášho počítača pomocou HAproxy v prehliadači a zadaním portu 7000 sa vám zobrazia štatistiky o vašom klastri.
Server, ktorý je hlavným serverom, bude v stave UP a repliky budú v stave DOWN. To je normálne, v skutočnosti fungujú, ale objavujú sa takto, pretože vracajú 503 pre požiadavky od HAproxy. To nám umožňuje vždy presne vedieť, ktorý z troch serverov je aktuálny master.
Záver
Si úžasný! Len za 30 minút ste nasadili excelentný databázový klaster odolný voči chybám a vysokovýkonný databázový klaster so streamingovou replikáciou a automatickým núdzovým riešením. Ak plánujete použiť toto riešenie, pozrite sa s oficiálnou dokumentáciou Patroni, a najmä s jeho časťou týkajúcou sa utility patronictl, ktorá poskytuje pohodlný prístup k správe vášho klastra.