ProHoster > Blog > uprava > Izgradnja visoko dostupnog PostgreSQL klastera pomoću Patronija, etcd, HAProxy
Izgradnja visoko dostupnog PostgreSQL klastera pomoću Patronija, etcd, HAProxy
Slučajno se dogodilo da u trenutku postavljanja problema nisam imao dovoljno iskustva da sam razvijem i lansiram ovo rješenje. A onda sam počeo guglati.
Ne znam u čemu je kvaka, ali po tko zna koji put se suočavam s činjenicom da čak i ako sve radim korak po korak kao u tutorijalu, pripremam isto okruženje kao autor, onda ništa ne radi. Nemam pojma što je bilo, ali kad sam se opet susreo s ovim, odlučio sam da ću napisati svoj tutorial kad sve bude u redu. Onaj koji će sigurno raditi.
Vodiči na internetu
Slučajno internet ne pati od nedostatka raznih vodiča, tutorijala, korak po korak i slično. Slučajno se dogodilo da sam dobio zadatak razviti rješenje za prikladnu organizaciju i izgradnju failover PostgreSQL klastera, čiji su glavni zahtjevi bili strujanje replikacije s glavnog poslužitelja na sve replike i automatsko osiguravanje rezerve u slučaju glavnog poslužitelja. neuspjeh.
U ovoj fazi određen je skup korištenih tehnologija:
HAproxy za organiziranje jedinstvene ulazne točke za aplikacije koje koriste bazu podataka
Instalacija
Za vašu pozornost - izgradnja visoko dostupnog PostgreSQL klastera pomoću Patronija, etcd, HAProxy.
Sve operacije izvedene su na virtualnim strojevima s instaliranim Debian 10 OS-om.
itd
Ne preporučam instaliranje etcd-a na iste strojeve na kojima će se nalaziti patroni i postgresql, jer je opterećenje diska vrlo važno za etcd. Ali u obrazovne svrhe, učinit ćemo upravo to.
Instaliramo etcd.
#!/bin/bash
apt-get update
apt-get install etcd
Dodajte sadržaj u datoteku /etc/default/etcd
[član]
ETCD_NAME=datanode1 # naziv hosta vašeg stroja
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
SVE IP ADRESE TREBAJU BITI VALJANE. LISTER PEER, KLIJENT itd. TREBA BITI POSTAVLJEN NA IP ADRESU HOST-a
Prvo što trebate učiniti je postaviti tri virtualna računala kako biste na njih instalirali potreban softver. Nakon instaliranja strojeva, ako slijedite moje upute, možete pokrenuti ovu jednostavnu skriptu koja će (gotovo) učiniti sve za vas. Pokreće se kao root.
Imajte na umu da skripta koristi PostgreSQL verziju 9.6, to je zbog internih zahtjeva naše tvrtke. Rješenje nije testirano na drugim verzijama PostgreSQL-a.
Zatim, u datoteku /etc/patroni.yml koju ste upravo stvorili, trebate smjestiti sljedeći sadržaj, naravno mijenjajući IP adrese na svim mjestima na adrese koje koristite.
Obratite pažnju na komentare u ovom yamlu. Promijenite adrese u vlastite na svakom računalu u klasteru.
/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
Skripta se mora pokrenuti na sva tri računala klastera, a gornja konfiguracija također mora biti smještena u datoteku /etc/patroni.yml na svim računalima.
Nakon što dovršite ove operacije na svim strojevima u klasteru, pokrenite sljedeću naredbu na bilo kojem od njih
Pričekajte oko 30 sekundi, zatim pokrenite ovu naredbu na preostalim strojevima u klasteru.
HAproxy
Koristimo prekrasan HAproxy za pružanje jedinstvene ulazne točke. Glavni poslužitelj će uvijek biti dostupan na adresi računala na kojem je postavljen HAproxy.
Kako stroj s HAproxyjem ne bi bio jedna točka kvara, pokrenut ćemo ga u Docker spremniku; u budućnosti se može pokrenuti u klaster K8 i učiniti naš failover cluster još pouzdanijim.
Napravite direktorij u koji možete pohraniti dvije datoteke - Dockerfile i haproxy.cfg. Idi na to.
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
Budite oprezni, posljednja tri retka datoteke haproxy.cfg trebaju navesti adrese vaših strojeva. HAproxy će kontaktirati Patroni, u HTTP zaglavljima glavni poslužitelj će uvijek vraćati 200, a replika će uvijek vraćati 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
Budući da smo u direktoriju u kojem "leže" obje naše datoteke, izvršimo sekvencijalne naredbe za pakiranje spremnika, kao i njegovo pokretanje s prosljeđivanjem potrebnih portova:
Sada, otvaranjem adrese vašeg stroja s HAproxyjem u pregledniku i navođenjem porta 7000, vidjet ćete statistiku o vašem klasteru.
Poslužitelj koji je glavni će biti u GORE stanju, a replike će biti u DOLE stanju. To je normalno, zapravo rade, ali se pojavljuju ovako jer vraćaju 503 za zahtjeve HAproxyja. To nam omogućuje da uvijek točno znamo koji je od tri poslužitelja trenutni glavni.
Zaključak
prekrasna si! U samo 30 minuta implementirali ste izvrstan klaster baze podataka otporan na greške i visokih performansi s replikacijom strujanja i automatskim povratom. Ako planirate koristiti ovo rješenje, provjerite sa službenom Patroni dokumentacijom, a posebno u dijelu koji se odnosi na pomoćni program patronictl, koji omogućuje jednostavan pristup upravljanju vašim klasterom.