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

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

Aggiungi 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="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 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.yml

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

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

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

Fai 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 alla documentazione ufficiale di Patroni, in particolare alla sezione riguardante l'utilità patronictl, che fornisce un accesso semplice alla gestione del 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