Bygga en PostgreSQL-kluster med hög tillgÀnglighet med hjÀlp av Patroni, etcd, HAProxy

Det visade sig att vid tidpunkten för uppgiften hade jag inte tillrÀcklig erfarenhet för att utveckla och lansera denna lösning ensam. SÄ jag började googla.

Jag vet inte vad problemet Àr, men jag har gÄng pÄ gÄng stött pÄ att Àven om jag gör allt steg för steg som i tutorialen, och förbereder en liknande miljö som författaren, sÄ fungerar det aldrig. Jag har ingen aning om vad som Àr fel, men nÀr jag stötte pÄ det hÀr igen, bestÀmde jag mig för att skriva min egen tutorial nÀr allt fungerar. Den som definitivt kommer att fungera.

Guider pÄ Internet

Det Àr sÄ att internet inte lider av brist pÄ olika guider, tutorials, steg-för-steg och liknande saker. Det Àr sÄ att jag fick i uppdrag att utveckla en lösning för praktisk organisation och byggande av en felÄterstÀllande kluster av PostgreSQL, med de frÀmsta kraven att vara strömmande replikering frÄn Master-server till alla replikat och automatisk inmatning av reserv nÀr Master-servern gÄr ner.

Vid detta steg bestÀmdes teknikstacken som skulle anvÀndas:

  • PostgreSQL som databas
  • Patroni som lösning för klustring
  • etcd som ett distribuerat lagringssystem för Patroni
  • HAproxy för att organisera en enhetlig ingĂ„ngspunkt för program som anvĂ€nder databasen

Installation

Vi presenterar byggandet av ett PostgreSQL-kapabel kluster med hög tillgÀnglighet med anvÀndning av Patroni, etcd, HAProxy.

Alla operationer utfördes pÄ virtuella maskiner med installerat Debian 10.

i den motsvarande Docker-bilden

Jag rekommenderar inte att installera etcd pÄ samma maskiner dÀr patroni och postgresql kommer att vara, eftersom arbetsbelastningen pÄ diskarna Àr vÀldigt viktig för etcd. Men för utbildningens skull kommer vi att göra just det.
Vi installerar etcd.

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

LÀgg till innehÄllet i filen /etc/default/etcd

[member]

ETCD_NAME=datanode1 # vÀrdnamn för din enhet
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLA IP-ADRESSER MÅSTE VARA GILTIGA. LISSENTER PEER, KLCLIENT ETC SKA VARA INSTÄLLDA PÅ VÄRDENS IP-ADRESS

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # adressen till din maskin
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # adressen till din maskin

[kluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # adressen till din maskin
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # adresserna för alla maskiner i klustret etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # adressen till din maskin

Kör kommandot

systemctl restart etcd

PostgreSQL 9.6 + patroni

Det första du behöver göra Àr att installera tre virtuella maskiner för att installera den nödvÀndiga programvaran. Efter att ha installerat maskinerna, om du följer min handledning, kan du köra det hÀr enkla skriptet som (nÀstan) gör allt Ät dig. Det körs som root.

Observera att skriptet anvÀnder version PostgreSQL 9.6, vilket beror pÄ interna krav frÄn vÄrt företag. Lösningen har inte testats pÄ andra versioner av 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

DÀrefter mÄste du placera följande innehÄll i den nyss skapade filen /etc/patroni.yml, givetvis efter att ha Àndrat IP-adresserna pÄ alla stÀllen till de adresser som du anvÀnder.
Observera kommentarerna i denna yaml. Ändra adresserna till dina, pĂ„ varje maskin i klustret.

/etc/patroni.yml

scope: pgsql # bör vara densamma pÄ alla noder
namespace: /cluster/ # bör vara densamma pÄ alla noder
name: postgres1 # bör vara olika pÄ alla noder

restapi:
    listen: 192.168.0.143:8008 # adressen till den nod dÀr den hÀr filen finns
    connect_address: 192.168.0.143:8008 # adressen till den nod dÀr den hÀr filen finns

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # lista alla dina noder hÀr, ifall du installerar etcd pÄ dem

# den hÀr sektionen (bootstrap) kommer att skrivas in i Etcd:///config efter att den nya klustret har initierats
# och alla andra klustermedlemmar kommer att anvÀnda den som en `global konfiguration`
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: sv_SE.UTF8
    # init pg_hba.conf mÄste innehÄlla adresserna TILL ALLA maskiner som anvÀnds i klustret
    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 till den nod dÀr den hÀr filen finns
    connect_address: 192.168.0.143:5432 # adressen till den nod dÀr den hÀr filen finns
    data_dir: /data/patroni # den hÀr katalogen kommer att skapas av skriptet som beskrivs ovan och de nödvÀndiga rÀttigheterna kommer att stÀllas in
    bin_dir:  /usr/lib/postgresql/9.6/bin # ange sökvÀgen till din postgresql-katalog
    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

Skriptet mÄste köras pÄ alla tre maskiner i klustret, och samma konfiguration mÄste placeras i filen /etc/patroni.yml pÄ alla maskiner.

NÀr du har utfört dessa ÄtgÀrder pÄ alla maskiner i klustret, kör nÀsta kommando pÄ valfri maskin.

systemctl start patroni
systemctl start postgresql

VÀnta cirka 30 sekunder och kör sedan det hÀr kommandot pÄ de andra maskinerna i klustret.

HAproxy

Vi anvÀnder fantastiska HAproxy för att tillhandahÄlla en enhetlig ingÄngspunkt. Master-servern kommer alltid att vara tillgÀnglig pÄ adressen till maskinen dÀr HAproxy Àr implementerat.

För att undvika att göra maskinen med HAproxy till en enda felpunkt, kommer vi att köra den i en Docker-container, och senare kan den startas i en K8s-kluster för att göra vÄr redundanta kluster Ànnu mer pÄlitlig.

Skapa en katalog dĂ€r du kan lagra tvĂ„ filer — Dockerfile och haproxy.cfg. GĂ„ till den.

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

Var försiktig, de tre sista raderna i filen haproxy.cfg ska innehÄlla adresserna till dina maskiner. HAproxy kommer att kommunicera med Patroni, i HTTP-huvuden kommer master-servern alltid att returnera 200, medan replica returnerar 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

NÀr vi Àr i katalogen dÀr bÄda vÄra filer finns, kör vi steg för steg kommandona för att paketera containern samt starta den med vidarebefordran av nödvÀndiga portar:

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

Nu kan du öppna din webblÀsare och ange adressen till din maskin med HAproxy och port 7000, sÄ kommer du att se statistiken för ditt kluster.

Den server som Àr i UP-status kommer att vara den som Àr master, medan replications Àr i DOWN-status. Det Àr normalt, de fungerar faktiskt, men visar sÄ hÀr eftersom de returnerar 503 pÄ förfrÄgningar frÄn HAproxy. Detta gör att vi alltid vet exakt vilken av de tre servrarna som Àr master just nu.

Slutsats

Du Àr fantastisk! PÄ bara 30 minuter har du rullat ut ett utmÀrkt redundanta och högpresterande databas-kluster med strömmande replikering och automatisk failover. Om du planerar att anvÀnda denna lösning, lÀs den officiella dokumentationen för Patroni, sÀrskilt delen som handlar om verktyget patronictl, som ger enkel Ätkomst till att hantera ditt kluster.

Grattis!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster