PostgreSQL magas rendelkezésre állású klaszterének felépítése Patroni, etcd, HAProxy segítségével

Így történt, hogy a feladat kiírásakor nem volt elegendő tapasztalatom ahhoz, hogy ezt a megoldást egyedül fejlesszem és elindítsam. Így hát elkezdtem keresni az interneten.

Nem tudom, mi a probléma, de már sokadszorra tapasztalom, hogy még ha lépésről lépésre követem is a tutorialt, és elkészítem ugyanazt a környezetet, mint a szerző, akkor sem működik semmi. Fogalmam sincs, mi lehet a háttérben, de amikor újra szembesültem ezzel, úgy döntöttem — írok egy saját tutorialt, amikor minden működik. Olyat, ami biztosan működik.

Internetbeli útmutatók

Így történt, hogy az internet nem szenved a különféle útmutatók, tutorialok és lépésről lépésre leírások hiányától. A feladatom az volt, hogy egy megbízható PostgreSQL klaszter megoldását fejlesszem ki, amelynek főbb követelményei a Master szerverről az összes replikára történő folytonos replikáció és a Master szerver meghibásodása esetén az automatikus váltás voltak.

Ezen a ponton meg lett határozva a használandó technológiai stack:

  • PostgreSQL mint adatbázis-kezelő rendszer
  • Patroni mint a klaszterezési megoldás
  • etcd mint elosztott tároló a Patroni számára
  • HAProxy az alkalmazások számára egységes belépési pont létrehozására, amelyek az adatbázist használják

Telepítés

Önöknek bemutatjuk a PostgreSQL magas rendelkezésre állású klaszterének felépítését Patroni, etcd, HAProxy segítségével.

Minden művelet Debian 10 rendszerű virtuális gépeken történt.

etcd

Nem ajánlom, hogy az etcd-t ugyanazon gépeken telepítsük, ahol a Patroni és PostgreSQL található, mivel az etcd számára nagyon fontos a lemezek terhelése. De oktatási célokból így fogunk eljárni.
Telepítsük az etcd-t.

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

Adja hozzá a tartalmat a fájlhoz /etc/default/etcd

[member]

ETCD_NAME=datanode1 # a gép hostname-je
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

MINDEN IP CÍMNEK ÉRVÉNYESNEK KELL LENNIE. A LISTER PEER, CLIENT stb. AZ IP CÍMNEK A GÉPÉRE KELL BEÁLLÍTANI

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # a gép címe
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # a gép címe

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # a gép címe
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # a klaszter összes gépének címei az etcd-ben
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # a gép címe

Futtassa a parancsot

systemctl restart etcd

PostgreSQL 9.6 + patroni

Az első lépés, hogy három virtuális gépet állítsunk be a szükséges szoftver telepítéséhez. A gépek telepítése után, ha követi az útmutatómat, futtathatja ezt az egyszerű szkriptet, amely (majdnem) mindent elvégez Ön helyett. A root felhasználóként indítandó.

Felhívjuk figyelmét, hogy a szkript a PostgreSQL 9.6-os verzióját használja, amely a vállalatunk belső követelményeiből fakad. A megoldás nem volt tesztelve más PostgreSQL verziókon.

#!/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

A most létrehozott fájlba, a /etc/patroni.yml-ba a következő tartalmat kell elhelyeznie, természetesen módosítva a címeket az Ön által használt IP-címekre minden esetben.
Felhívjuk figyelmét a YAML fájlban található megjegyzésekre. Módosítsa a címeket a sajátjaira, a klaszter minden egyes gépén.

/etc/patroni.yml

scope: pgsql # minden node-on egyenlőnek kell lennie
namespace: /cluster/ # minden node-on egyenlőnek kell lennie
name: postgres1 # minden node-on eltérőnek kell lennie

restapi:
    listen: 192.168.0.143:8008 # az a node címe, ahol ez a fájl található
    connect_address: 192.168.0.143:8008 # az a node címe, ahol ez a fájl található

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # itt sorolja fel az összes node-ját, ha az etcd-t ugyanott állítja be

# ez a szakasz (bootstrap) az Etcd: // /config-be kerül írásra, miután az új klaszter inicializálása megtörtént
# és minden más klasztertag ezt használja majd mint `globális konfiguráció`
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: hu_HU.UTF8
    # az init pg_hba.conf-nak tartalmaznia kell az összes gép címét, amelyet a klaszterben használnak
    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 # az a node címe, ahol ez a fájl található
    connect_address: 192.168.0.143:5432 # az a node címe, ahol ez a fájl található
    data_dir: /data/patroni # ezt a könyvtárat a fenti szkript hozza létre a megfelelő jogosultságokkal
    bin_dir:  /usr/lib/postgresql/9.6/bin # adja meg a postgresql könyvtárához vezető utat
    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

A szkriptet futtatni kell minden három gépen a klaszterben, és a megadott konfigurációt be kell helyezni a /etc/patroni.yml fájlba minden gépen.

Amikor ezeket a műveleteket minden gépen elvégezte, futtassa a következő parancsot bármelyikükön

systemctl start patroni
systemctl start postgresql

Várjon körülbelül 30 másodpercet, majd futtassa ezt a parancsot a klaszter többi gépén.

HAproxy

Csodálatos HAproxy-t használunk, hogy egyetlen belépési pontot biztosítsunk. A Master szerver mindig elérhető lesz a HAproxy-t futtató gép címén.

Annak érdekében, hogy az HAproxy ne legyen egyetlen hibaértékpont, Docker konténerben indítsuk el, később K8s klaszterbe is elindítható, és így a hibatűrő klaszterünk még megbízhatóbbá válik.

Hozzon létre egy könyvtárat, ahol tárolhatja a két fájlt - Dockerfile és haproxy.cfg. Lépjen be ebbe a könyvtárba.

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

Legyen óvatos, a haproxy.cfg fájl utolsó három sorában fel kell tüntetni a gépei címeit. Az HAproxy a Patrónira fog hivatkozni, a HTTP fejlécben a master szerver mindig 200-at fog visszaadni, míg a replika 503-at.

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

A könyvtárban, ahol a két fájlunk található, hajtsuk végre sorban a konténer csomagolására és indítására vonatkozó parancsokat, valamint a szükséges portok átirányítását:

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

Most, ha megnyitja a böngészőben a HAproxy-val rendelkező gépe címet és megadja a 7000-es portot, látni fogja a klaszterének statisztikáit.

Az UP állapotban az a szerver lesz, amelyik a mester, míg a replikák DOWN állapotban. Ez normális, valójában működnek, de így jelennek meg, mivel 503-at adnak vissza a HAproxy-tól érkező kérésekre. Ez lehetővé teszi számunkra, hogy mindig pontosan tudjuk, melyik három szerver a jelenlegi mester.

Zárás

Csodálatos vagy! Mindössze 30 perc alatt létrehoztál egy kiváló hibatűrő és teljesítményorientált adatbázis klasztert, amely folyamatos replikálással és automatikus hibakereséssel működik. Ha ezt a megoldást tervezed használni, nézd meg a Patroni hivatalos dokumentációját, különösen a patronictl segédeszközzel kapcsolatos részét, amely kényelmes hozzáférést biztosít a klasztered kezeléséhez.

Gratulálok!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster