Se întâmplă că, la momentul stabilirii sarcinii, nu aveam suficientă experiență pentru a dezvolta și lansa această soluție singur. Așa că am început să caut pe Google.
Nu știu care este problema, dar de deja atâtea ori mă confrunt cu faptul că, chiar dacă urmez pașii așa cum sunt în tutorial, și pregătesc un mediu similar cu cel al autorului, nu funcționează niciodată. Nu am idee de ce se întâmplă asta, dar, când m-am confruntat din nou cu această situație, am decis să scriu un tutorial al meu, care să funcționeze cu siguranță.
Ghiduri pe Internet
Se întâmplă că internetul nu duce lipsă de diferite ghiduri, tutoriale, step-by-step și lucruri similare. Așa că mi s-a dat sarcina de a dezvolta o soluție pentru organizarea și construirea unui cluster PostgreSQL rezistent la erori, cu cerințele principale fiind replicarea în flux de pe serverul Master către toate replicile și introducerea automată a unui rezervă în caz de defectare a serverului Master.
În acest stadiu, a fost definit stiva de tehnologii utilizate:
- PostgreSQL ca SGBD
- ca soluție pentru clusterizare
- etcd ca stocare distribuită pentru Patroni
- HAproxy pentru organizarea unui punct unic de acces pentru aplicațiile care utilizează baza de date
Instalare
Vă prezentăm - construirea unui cluster PostgreSQL de mare disponibilitate folosind Patroni, etcd, HAProxy.
Toate operațiunile au fost efectuate pe mașini virtuale cu sistemul de operare Debian 10.
etcd
Nu recomand instalarea etcd pe aceleași mașini unde se află patroni și postgresql, deoarece pentru etcd este foarte importantă sarcina pe discuri. Dar, în scopuri educaționale, așa vom proceda.
Vom instala etcd.
#!/bin/bash
apt-get update
apt-get install etcdAdăugați conținutul în fișierul /etc/default/etcd
[member]
ETCD_NAME=datanode1 # numele gazdei mașinii dumneavoastră
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
TOATE ADRESELE IP TREBUIE SĂ FIE VALIDE. LISTER PEER, CLIENT etc TREBUIE SĂ FIE SETATE PE ADRESA IP A GAZDEI
ETCD_LISTEN_PEER_URLS="" # adresa mașinii dumneavoastră
ETCD_LISTEN_CLIENT_URLS="" # adresa mașinii dumneavoastră
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # adresa mașinii dumneavoastră
ETCD_INITIAL_CLUSTER="datanode1=" # adresele tuturor mașinilor din cluster etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # adresa mașinii dumneavoastră
Executați comanda
systemctl restart etcdPostgreSQL 9.6 + patroni
Primul lucru pe care trebuie să-l faci este să instalezi trei mașini virtuale pentru a instala software-ul necesar. După ce mașinile sunt instalate, dacă urmezi tutorialul meu, poți rula acest simplu script care va face (aproape) totul pentru tine. Se rulează din root.
Rețineți că scriptul folosește versiunea PostgreSQL 9.6, aceasta fiind datorată cerințelor interne ale companiei noastre. Soluția nu a fost testată pe alte versiuni de PostgreSQL.
#!/bin/bash
apt-get install gnupg -y
echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
apt-get update
apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y
systemctl stop postgresql
pip3 install --upgrade pip
pip install psycopg2
pip install patroni[etcd]
echo "
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target
[Service]
Type=simple
User=postgres
Group=postgres
ExecStart=/usr/local/bin/patroni /etc/patroni.yml
KillMode=process
TimeoutSec=30
Restart=no
[Install]
WantedBy=multi-user.targ
" > /etc/systemd/system/patroni.service
mkdir -p /data/patroni
chown postgres:postgres /data/patroni
chmod 700 /data/patroniпо
touch /etc/patroni.ymlApoi, în fișierul tocmai creat /etc/patroni.yml trebuie să pui următorul conținut, desigur schimbând adresele IP în toate locurile, cu cele pe care le folosești tu.
Atenție la comentariile din acest yaml. Schimbă adresele cu ale tale, pe fiecare mașină din cluster.
/etc/patroni.yml
scope: pgsql # trebuie să fie același pe toate nodurile
namespace: \/cluster\/ # trebuie să fie același pe toate nodurile
name: postgres1 # trebuie să fie diferit pe toate nodurile
restapi:
listen: 192.168.0.143:8008 # adresa nodului pe care se află acest fișier
connect_address: 192.168.0.143:8008 # adresa nodului pe care se află acest fișier
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # listați aici toate nodurile dvs., în cazul în care instalați etcd pe acestea
# această secțiune (bootstrap) va fi scrisă în Etcd:\/\/\/config după inițializarea noului cluster
# și toți ceilalți membri ai cluster-ului o vor folosi ca o `configurație globală`
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 trebuie să conțină adresele TUTUROR mașinilor utilizate în cluster
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 # adresa nodului pe care se află acest fișier
connect_address: 192.168.0.143:5432 # adresa nodului pe care se află acest fișier
data_dir: \/data\/patroni # acest director va fi creat de scriptul descris mai sus și se vor stabili permisiunile necesare
bin_dir: \/usr\/lib\/postgresql\/9.6\/bin # specificați calea către directorul dvs. cu 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: falseScriptul trebuie să fie executat pe toate cele trei mașini ale cluster-ului, la fel este necesar să plasați configurația dată în fișierul \/etc\/patroni.yml pe toate mașinile.
Când ați efectuat aceste operații pe toate mașinile cluster-ului, executați următoarea comandă pe oricare dintre ele
systemctl start patroni
systemctl start postgresqlAșteptați aproximativ 30 de secunde, apoi executați această comandă pe celelalte mașini ale cluster-ului.
HAproxy
Folosim minunatul HAproxy pentru a oferi un punct unic de acces. Serverul Master va fi întotdeauna disponibil la adresa mașinii pe care este implementat HAproxy.
Pentru a evita ca mașina cu HAproxy să devină un punct unic de eșec, o vom rula într-un container Docker, iar mai târziu, o putem porni într-un cluster K8’s pentru a face clusterul nostru rezistent la defecte și mai fiabil.
Creează un director în care vei putea stoca cele două fișiere — Dockerfile și haproxy.cfg. Accesează-l.
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.logFii atent, în ultimele trei linii ale fișierului haproxy.cfg trebuie să fie enumerate adresele mașinilor tale. HAproxy se va conecta la Patroni, iar în antetele HTTP serverul master va returna întotdeauna 200, iar replica — 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
Aflându-te în directorul în care se află ambele fișiere, vom executa secvențial comenzi pentru a împacheta containerul, precum și pentru a-l lansa cu redirecționarea porturilor necesare:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Acum, deschizând în browser adresa mașinii tale cu HAproxy și specificând portul 7000, vei vedea statistica pentru clusterul tău.
Serverul care se află în stare UP va fi cel care este master, iar replicile în stare DOWN. Este normal, de fapt ele funcționează, dar sunt afișate în acest mod deoarece returnează 503 la cererile de la HAproxy. Acest lucru ne permite să știm întotdeauna cu precizie care dintre cele trei servere este master în acel moment.
Concluzie
Ești fantastic! În doar 30 de minute ai implementat un cluster de baze de date excelent, rezistent la defecte și performant, cu replicare în flux și comutare automată. Dacă intenționezi să folosești această soluție, consultă-te , în special cu partea referitoare la utilitarul patronictl, care oferă un acces convenabil pentru gestionarea clusterului tău.
Felicitări!
Sursa: habr.com
