Opbygning af et PostgreSQL-klynge med høj tilgængelighed ved hjælp af Patroni, etcd, HAProxy

Det skete bare, at jeg på tidspunktet for opgaven ikke havde tilstrækkelig erfaring til at udvikle og lancere denne løsning alene. Og så begyndte jeg at google.

Jeg ved ikke, hvad problemet er, men jeg støder gang på gang på, at selvom jeg gør alt trin-for-trin som i tutorialen og forbereder et tilsvarende environment som forfatteren, så virker det aldrig. Jeg har ingen anelse om, hvad der er galt, men da jeg stødte på dette igen, besluttede jeg – jeg vil skrive min egen tutorial, når det hele lykkes. Den, der helt sikkert vil fungere.

Guider på internettet

Det er sådan, at internettet ikke lider under mangel på forskellige guider, tutorials, step-by-step og lignende. Det er sådan, at jeg blev tildelt opgaven at udvikle en løsning til nem organisering og opbygning af et fejlfindingsresistant PostgreSQL-klynge, hvor de vigtigste krav var streamingreplikation fra Master-serveren til alle repliker og automatisk failover ved fejl på Master-serveren.

På dette stadium blev techen bestemte:

  • PostgreSQL som databaser
  • Patroni som løsning til clustering
  • etcd som distribueret lager til Patroni
  • HAproxy til at organisere et enkelt indgangspunkt for applikationer, der bruger databasen

Installation

Vi præsenterer — opbygning af en højtilgængelig PostgreSQL-klynge ved hjælp af Patroni, etcd, HAProxy.

Alle operationer blev udført på virtuelle maskiner med Debian 10 installeret.

i den relevante Docker-container

Jeg anbefaler ikke at installere etcd på de samme maskiner, hvor patroni og postgresql vil være, da diskbelastningen er meget vigtig for etcd. Men til læringens skyld vil vi gøre netop det.
Lad os installere etcd.

#!/bin/bash
apt-get update
apt-get install etcd

Tilføj indholdet til filen /etc/default/etcd

[member]

ETCD_NAME=datanode1 # værtsnavn på din maskine
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLE IP-ADRESSER SKAL VÆRE GYLDIGE. LISTER PEER, CLIENT osv. SKAL SÆTTES TIL VERTENS IP-ADRESSE

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # adressen på din maskine
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # adressen på din maskine

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # adressen på din maskine
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # adresserne på alle maskiner i etcd klyngen
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # adressen på din maskine

Udfør kommandoen

systemctl restart etcd

PostgreSQL 9.6 + patroni

Det første, du skal gøre, er at installere tre virtuelle maskiner til installation af den nødvendige software. Efter installation af maskinerne, hvis du følger min tutorial, kan du køre dette enkle script, som (næsten) klarer alt for dig. Det køres som root.

Bemærk, at scriptet bruger version PostgreSQL 9.6, hvilket skyldes vores interne krav. Løsningen er ikke testet på andre versioner af 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

Dernæst skal du placere følgende indhold i den nyoprettede fil /etc/patroni.yml, og selvfølgelig ændre IP-adresserne alle steder til dem, du bruger.
Vær opmærksom på kommentarerne i denne yaml. Ændr adresserne til dine egne på hver maskine i klyngen.

/etc/patroni.yml

scope: pgsql # skal være det samme på alle noder
namespace: /cluster/ # skal være det samme på alle noder
name: postgres1 # skal være forskelligt på alle noder

restapi:
    listen: 192.168.0.143:8008 # adressen på den node, hvor denne fil findes
    connect_address: 192.168.0.143:8008 # adressen på den node, hvor denne fil findes

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # list alle dine noder her, hvis du installerer etcd på dem

# denne sektion (bootstrap) vil blive skrevet til Etcd:/<namespace>/<scope>/config efter initialisering af det nye cluster
# og alle andre cluster medlemmer vil bruge det som en `global configuration`
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: da_DK.UTF8
    # init pg_hba.conf skal indeholde adresserne PÅ ALLE maskiner, der bruges i clustret
    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 # adressen på den node, hvor denne fil findes
    connect_address: 192.168.0.143:5432 # adressen på den node, hvor denne fil findes
    data_dir: /data/patroni # denne mappe vil scriptet, der er beskrevet ovenfor, oprette og sætte de nødvendige rettigheder
    bin_dir:  /usr/lib/postgresql/9.6/bin # angiv stien til din postgresql mappe
    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

Scriptet skal køres på alle tre maskiner i clustret, og den angivne konfiguration skal placeres i filen /etc/patroni.yml på alle maskiner.

Når du har udført disse operationer på alle maskiner i clustret, skal du køre følgende kommando på en af dem.

systemctl start patroni
systemctl start postgresql

Vent cirka 30 sekunder, og kør derefter denne kommando på de øvrige maskiner i clustret.

HAproxy

Vi bruger det fantastiske HAproxy til at levere et enkelt indgangspunkt. Master-serveren vil altid være tilgængelig på adressen på den maskine, hvor HAproxy er implementeret.

For ikke at gøre maskinen med HAproxy til et enkelt fejlpunt, vil vi køre den i en Docker-container, som senere kan køres i et K8's-klynge og gøre vores fejltolerante klynge endnu mere pålidelig.

Opret et bibliotek, hvor du kan gemme to filer - Dockerfile og haproxy.cfg. Gå ind i det.

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

Vær forsigtig, de tre sidste linjer i filen haproxy.cfg skal angive adresserne på dine maskiner. HAproxy vil henvende sig til Patroni, i HTTP-headerne vil masterserveren altid returnere 200, mens replica vil returnere 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

Mens vi er i biblioteket, hvor begge vores filer ligger, lad os køre kommandoerne til pakning af containeren og derefter dens opstart med de nødvendige porte åbne:

docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy 

Når du nu åbner adressen på din maskine med HAproxy i din browser og angiver port 7000, vil du se statistikken for din klynge.

Den server, der er i tilstand UP, vil være den, der er master, mens replikaerne er i tilstand DOWN. Det er normalt, de fungerer faktisk, men vises sådan, fordi de returnerer 503 på anmodninger fra HAproxy. Dette giver os altid præcis at vide, hvilken af de tre servere der er master i øjeblikket.

Konklusion

Du er fantastisk! På blot 30 minutter har du oprettet en fremragende fejltolerant og højtydende databaseklynge med streamingreplikering og automatisk failover. Hvis du planlægger at bruge denne løsning, skal du læse den officielle dokumentation for Patroni, især dens afdeling vedrørende værktøjet patronictl, som tilbyder nem adgang til at administrere din klynge.

Tillykke!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster