Creazione di un cluster PostgreSQL ad alta disponibilità utilizzando Patroni, etcd, HAProxy

È 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
  • Patroni 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 etcd

Aggiungi 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="http://192.168.0.143:2380" # indirizzo della tua macchina
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # indirizzo della tua macchina

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # indirizzo della tua macchina
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # indirizzi di tutte le macchine nel cluster etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # indirizzo della tua macchina

Esegui il comando

systemctl restart etcd

PostgreSQL 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.yml

Successivamente, 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: false

Lo 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 postgresql

Attendete 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.log

Fai 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 alla documentazione ufficiale di Patroni, in particolare alla sezione riguardante lo strumento patronictl, che offre un accesso conveniente per gestire il tuo cluster.

Congratulazioni!

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster