È successo che al momento di pormi il compito non avessi un livello sufficiente di esperienza per sviluppare e avviare questa soluzione da solo. E così ho iniziato a cercare su Google.
Non so qual è il problema, ma già per l'ennesima volta mi imbatto nel fatto che anche se seguo ogni passaggio come nel tutorial, preparando un ambiente identico a quello dell'autore, tutto non funziona mai. Non ho idea di cosa ci sia dietro, ma quando mi sono trovato di fronte a questo per l'ennesima volta, ho deciso: scriverò il mio tutorial, quando tutto funzionerà. Quello che sicuramente funzionerà.
Guide su Internet
È successo che Internet non soffra di una carenza di varie guide, tutorial, step-by-step e simili. È successo che mi è stato chiesto di sviluppare una soluzione per l'organizzazione e la costruzione di un cluster PostgreSQL a prova di guasto, i cui principali requisiti erano la replica in streaming dal server Master a tutte le repliche e l'inserimento automatico di riserve in caso di guasto del server Master.
In questa fase è stata definita la stack tecnologica utilizzata:
- PostgreSQL come DBMS
- come soluzione per la clustering
- etcd come repository distribuito per Patroni
- HAproxy per organizzare un unico punto di accesso per le applicazioni che utilizzano il database
Installazione
Vi presento la costruzione di un cluster PostgreSQL ad alta disponibilità utilizzando Patroni, etcd, HAProxy.
Tutte le operazioni sono state eseguite su macchine virtuali con sistema operativo Debian 10.
sono stati resi
Non consiglio di installare etcd sulle stesse macchine dove si trovano patroni e postgresql, poiché per etcd è molto importante il carico sui dischi. Ma a fini didattici, faremo proprio così.
Installeremo etcd.
#!/bin/bash
apt-get update
apt-get install etcdAggiungi il contenuto nel file /etc/default/etcd
[member]
ETCD_NAME=datanode1 # hostname della tua macchina
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
Tutti gli indirizzi IP devono essere validi. LISTER PEER, CLIENT ecc. devono essere impostati sull'indirizzo IP dell'host
ETCD_LISTEN_PEER_URLS="" # indirizzo della tua macchina
ETCD_LISTEN_CLIENT_URLS="" # indirizzo della tua macchina
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # indirizzo della tua macchina
ETCD_INITIAL_CLUSTER="datanode1=" # indirizzi di tutte le macchine nel cluster etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # indirizzo della tua macchina
Esegui il comando
systemctl restart etcdPostgreSQL 9.6 + patroni
La prima cosa da fare è installare tre macchine virtuali per installare il software necessario. Dopo aver installato le macchine, se segui il mio tutorial, puoi eseguire questo semplice script che farà quasi tutto per te. Viene eseguito da root.
Si prega di notare che lo script utilizza la versione PostgreSQL 9.6, a causa delle esigenze interne della nostra azienda. La soluzione non è stata testata su altre versioni di 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.ymlSuccessivamente, nel file appena creato /etc/patroni.yml, è necessario inserire il seguente contenuto, ovviamente modificando gli indirizzi IP in tutti i punti con quelli che utilizzi tu.
Fai attenzione ai commenti in questo yaml. Modifica gli indirizzi con i tuoi su ciascuna macchina del cluster.
/etc/patroni.yml
ambito: pgsql # deve essere lo stesso su tutti i nodi
namespace: /cluster/ # deve essere lo stesso su tutti i nodi
name: postgres1 # deve essere diverso su tutti i nodi
restapi:
listen: 192.168.0.143:8008 # indirizzo di quel nodo in cui si trova questo file
connect_address: 192.168.0.143:8008 # indirizzo di quel nodo in cui si trova questo file
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # elencare qui tutti i vostri nodi, nel caso in cui stiate installando etcd su di essi
# questa sezione (bootstrap) sarà scritta in Etcd:///config dopo l'inizializzazione del nuovo cluster
# e tutti gli altri membri del cluster la utilizzeranno come una `configurazione globale`
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 deve contenere indirizzi di TUTTE le macchine utilizzate nel 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 # indirizzo di quel nodo in cui si trova questo file
connect_address: 192.168.0.143:5432 # indirizzo di quel nodo in cui si trova questo file
data_dir: /data/patroni # questa directory sarà creata dallo script descritto sopra e verranno impostati i permessi necessari
bin_dir: /usr/lib/postgresql/9.6/bin # specificare il percorso alla vostra directory con 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: falseLo script deve essere eseguito su tutte e tre le macchine del cluster, e la configurazione fornita deve essere inserita nel file /etc/patroni.yml su tutte le macchine.
Una volta completate queste operazioni su tutte le macchine del cluster, eseguire il seguente comando su una di esse
systemctl start patroni
systemctl start postgresqlAttendere circa 30 secondi, quindi eseguire questo comando sulle altre macchine del cluster.
HAproxy
Utilizziamo il fantastico HAproxy per fornire un unico punto di accesso. Il server master sarà sempre disponibile all'indirizzo della macchina su cui è stato implementato HAproxy.
Per evitare che la macchina con HAproxy diventi un unico punto di guasto, eseguiamola all'interno di un contenitore Docker; in seguito, potrà essere eseguita in un cluster K8's, rendendo il nostro cluster a prova di guasto ancora più affidabile.
Crea una directory in cui puoi memorizzare due file: Dockerfile e haproxy.cfg. Accedi a questa directory.
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.logFai attenzione, nelle ultime tre righe del file haproxy.cfg devono essere elencati gli indirizzi delle tue macchine. HAproxy si connetterà a Patroni; negli header HTTP, il master server restituirà sempre 200, mentre il replica restituirà 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
Essendo nella directory in cui si trovano entrambi i nostri file, eseguiamo consecutivamente i comandi per impacchettare il contenitore e avviarlo con il forwarding delle porte necessarie:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Ora, aprendo nel browser l'indirizzo della tua macchina con HAproxy e specificando la porta 7000, vedrai le statistiche del tuo cluster.
Il server che è master sarà in stato UP, mentre le repliche saranno in stato DOWN. Questo è normale; in realtà funzionano, ma vengono visualizzate in questo modo perché restituiscono 503 alle richieste da HAproxy. Questo ci permette di sapere sempre esattamente quale dei tre server è attualmente il master.
Conclusione
Sei fantastico! In soli 30 minuti hai distribuito un eccellente cluster di database a prova di guasto e ad alte prestazioni con replica streaming e failover automatico. Se hai intenzione di utilizzare questa soluzione, dai un'occhiata , in particolare alla sezione riguardante l'utilità patronictl, che fornisce un accesso semplice alla gestione del tuo cluster.
Congratulazioni!
Fonte: habr.com
