È successo che, al momento di affrontare il compito, non avessi la sufficiente esperienza per sviluppare e implementare questa soluzione da solo. Così ho iniziato a fare delle ricerche.
Non so quale sia il problema, ma già per la quarta volta mi trovo di fronte al fatto che anche seguendo ogni passo del tutorial e preparando un ambiente identico a quello dell'autore, non funziona mai niente. Non ho idea di cosa sia, ma quando mi sono trovato di nuovo in questa situazione, ho deciso di scrivere il mio tutorial quando riuscirò a farlo funzionare. Quello che funzionerà sicuramente.
Guide online
È curioso notare che Internet non ha carenza di vari tipi di guide, tutorial, step-by-step e simili. È curioso notare che mi è stato chiesto di sviluppare una soluzione per l'organizzazione e la creazione di un cluster PostgreSQL altamente disponibile, con i principali requisiti di replica streaming dal server Master a tutte le repliche e l'attivazione automatica del backup in caso di guasto del server Master.
A questo punto è stato determinato il stack delle tecnologie utilizzate:
- PostgreSQL come DBMS
- come soluzione per la clustering
- etcd come archivio distribuito per Patroni
- HAproxy per creare un unico punto di accesso per le applicazioni che utilizzano il database
Installazione
Presentiamo la costruzione di un cluster PostgreSQL ad alta disponibilità utilizzando Patroni, etcd e HAProxy.
Tutte le operazioni sono state eseguite su macchine virtuali con sistema operativo Debian 10.
etcd
Non consiglio di installare etcd sulle stesse macchine dove risiederanno Patroni e PostgreSQL, poiché per etcd è molto importante il carico sui dischi. Ma a fini didattici, procederemo in questo modo.
Installiamo etcd.
#!/bin/bash
apt-get update
apt-get install etcdAggiungi il contenuto al 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 su cui installare il software necessario. Una volta installate le macchine, se seguite il mio tutorial, potete eseguire questo semplice script che farà (quasi) tutto per voi. Viene eseguito come root.
Si prega di notare che lo script utilizza la versione PostgreSQL 9.6, questo è dovuto ai requisiti interni 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 dovete inserire il seguente contenuto, ovviamente modificando gli indirizzi IP in tutti i punti con quelli che utilizzate voi.
Fate attenzione ai commenti in questo yaml. Cambiate gli indirizzi con i vostri, su ogni macchina del cluster.
/etc/patroni.yml
scope: 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 del nodo in cui si trova questo file
connect_address: 192.168.0.143:8008 # indirizzo del nodo in cui si trova questo file
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # elenca qui tutti i tuoi nodi, se stai installando etcd anche su di essi
# questa sezione (bootstrap) verrà scritta in Etcd:///config dopo l'inizializzazione del nuovo cluster
# e tutti gli altri membri del cluster la utilizzeranno come `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: it_IT.UTF8
# init pg_hba.conf deve contenere gli 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 del nodo in cui si trova questo file
connect_address: 192.168.0.143:5432 # indirizzo del nodo in cui si trova questo file
data_dir: /data/patroni # questa directory verrà creata dallo script sopra descritto e saranno impostati i diritti necessari
bin_dir: /usr/lib/postgresql/9.6/bin # specifica il percorso della tua directory di 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, così come 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, eseguite il seguente comando su una di esse
systemctl start patroni
systemctl start postgresqlAttendete circa 30 secondi, quindi eseguite questo comando sulle altre macchine del cluster.
HAproxy
Utilizziamo il fantastico HAproxy per fornire un unico punto d'ingresso. Il server master sarà sempre accessibile all'indirizzo della macchina su cui è stato distribuito HAproxy.
Per evitare che la macchina con HAproxy diventi un singolo punto di fallimento, lo eseguiremo in un contenitore Docker, e in seguito potrà essere avviato nel cluster K8’s, rendendo così il nostro cluster ad alta disponibilità ancora più affidabile.
Create una directory in cui poter memorizzare due file — Dockerfile e haproxy.cfg. Accedete a essa.
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 comunicherà con Patroni, nell'intestazione HTTP il server master 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
Navigando nella directory in cui si trovano entrambi i nostri file, eseguiremo in sequenza i comandi per l'imballaggio del container e quindi il suo avvio 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.
In stato UP si trova il server che è il master, mentre le repliche sono in stato DOWN. Questo è normale, in realtà funzionano, ma vengono visualizzate in questo modo perché restituiscono 503 alle richieste da HAproxy. Questo ci consente di sapere sempre esattamente quale dei tre server è attualmente il master.
Conclusione
Sei fantastico! In soli 30 minuti hai implementato un eccellente cluster di database ad alta disponibilità e ad alte prestazioni con replicazione streaming e failover automatico. Se intendi utilizzare questa soluzione, dai un'occhiata , in particolare alla sezione riguardante lo strumento patronictl, che offre un accesso conveniente per gestire il tuo cluster.
Congratulazioni!
Fonte: habr.com
