ProHoster > Блог > Administracija > Izgradnja visoko dostupnog PostgreSQL klastera koristeći Patroni, etcd, HAProxy
Izgradnja visoko dostupnog PostgreSQL klastera koristeći Patroni, etcd, HAProxy
Desilo se da u trenutku kada je problem postavljen, nisam imao dovoljno iskustva da sam razvio i pokrenuo ovo rješenje. A onda sam počeo da guglam.
Ne znam u čemu je kvaka, ali po ko zna koji put se suočavam s činjenicom da čak i ako sve radim korak po korak kao u tutorijalu, pripremim isto okruženje kao i autor, onda ništa ne funkcionira. Nemam pojma u čemu je problem, ali kada sam se ponovo susreo sa ovim, odlučio sam da ću napisati svoj tutorijal kada sve bude u redu. Onaj koji će sigurno raditi.
Vodiči na Internetu
Desilo se da internet ne pati od nedostatka raznih vodiča, tutorijala, korak po korak i slično. Desilo se da sam dobio zadatak da razvijem rešenje za zgodnu organizaciju i izgradnju klastera za prestanak greške PostgreSQL, čiji su glavni zahtevi bili streaming replikacije sa glavnog servera na sve replike i automatsko obezbeđivanje rezerve u slučaju glavnog servera. neuspjeh.
U ovoj fazi određen je niz korištenih tehnologija:
HAproxy za organiziranje jedne ulazne točke za aplikacije koje koriste bazu podataka
postavljanje
Za vašu pažnju - izgradnja visoko dostupnog PostgreSQL klastera koristeći Patroni, etcd, HAProxy.
Sve operacije su izvedene na virtualnim strojevima s instaliranim Debian 10 OS.
itdd
Ne preporučujem instaliranje etcd na iste mašine na kojima će se nalaziti patroni i postgresql, pošto je opterećenje diska veoma važno za etcd. Ali u obrazovne svrhe, uradićemo upravo to.
Hajde da instaliramo etcd.
#!/bin/bash
apt-get update
apt-get install etcd
Dodajte sadržaj u /etc/default/etcd datoteku
[član]
ETCD_NAME=datanode1 # ime hosta vaše mašine
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
SVE IP ADRESE TREBA DA BUDU VAŽEĆE. LISTER PEER, CLIENT itd. TREBA POSTAVITI NA IP ADRESU HOST-a
Prva stvar koju treba da uradite je da podesite tri virtuelne mašine kako biste na njih instalirali potreban softver. Nakon instaliranja mašina, ako pratite moj vodič, možete pokrenuti ovu jednostavnu skriptu koja će (skoro) sve učiniti umjesto vas. Pokreće se kao root.
Imajte na umu da skripta koristi PostgreSQL verziju 9.6, što je zbog internih zahtjeva naše kompanije. Rješenje nije testirano na drugim verzijama PostgreSQL-a.
Zatim, u datoteku /etc/patroni.yml koju ste upravo kreirali, trebate postaviti sljedeći sadržaj, naravno mijenjajući IP adrese na svim mjestima na adrese koje koristite.
Obratite pažnju na komentare u ovom yaml-u. Promijenite adrese na vlastite na svakoj mašini 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 sve tri mašine klastera, a gornja konfiguracija takođe mora biti smeštena u /etc/patroni.yml fajl na svim mašinama.
Kada završite ove operacije na svim mašinama u klasteru, pokrenite sljedeću naredbu na bilo kojoj od njih
Sačekajte oko 30 sekundi, a zatim pokrenite ovu naredbu na preostalim mašinama u klasteru.
HAproxy
Koristimo prekrasan HAproxy da pružimo jednu tačku ulaska. Glavni server će uvijek biti dostupan na adresi mašine na kojoj je HAproxy raspoređen.
Da mašina sa HAproxy-jem ne bi bila jedna tačka kvara, pokrenućemo je u Docker kontejneru; u budućnosti se može pokrenuti u klaster K8 i učiniti naš klaster za prevazilaženje greške još pouzdanijim.
Kreirajte 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, poslednja tri reda datoteke haproxy.cfg treba da navedu adrese vaših mašina. HAproxy će kontaktirati Patroni, u HTTP zaglavljima glavni server ć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 se nalazimo u direktoriju u kojem "leže" obje naše datoteke, izvršimo uzastopno naredbe za pakovanje kontejnera, kao i da ga pokrenemo sa prosljeđivanjem potrebnih portova:
Sada, otvaranjem adrese vašeg računara sa HAproxy-om u pretraživaču i navođenjem porta 7000, videćete statistiku vašeg klastera.
Server koji je glavni će biti u GORE stanju, a replike će biti u DOWN stanju. Ovo je normalno, u stvari rade, ali se pojavljuju na ovaj način jer vraćaju 503 za zahtjeve od HAproxy. Ovo nam omogućava da uvijek tačno znamo koji je od tri servera trenutno glavni.
zaključak
Ti si prelijepa! Za samo 30 minuta postavili ste odličan klaster baze podataka otporan na greške i visoke performanse sa replikacijom strujanja i automatskim zamjenom. Ako planirate koristiti ovo rješenje, provjerite sa službenom Patroni dokumentacijom, a posebno u dijelu koji se odnosi na uslužni program patronictl, koji omogućava zgodan pristup upravljanju vašim klasterom.