PostgreSQL kõrge saadavuse klastri loomine Patroni, etcd ja HAProxy abil

Oli nii, et ülesande seadmisel mul ei olnud piisavat kogemust, et seda lahendust üksi arendada ja käivitada. Siis hakkasin Google'it kasutama.

Ma ei tea, mis probleem on, kuid olen juba mitmeid kordi kokku puutunud sellega, et isegi kui teha kõik samamoodi nagu õpetuses, ja luua sama keskkond nagu autoril, ei toimi see kunagi. Mul on aimugi, mis siin valesti on, kuid kui ma jälle sellega kokku puutusin, otsustasin — kirjutan oma õpetuse, kui kõik õnnestub. Selline, mis kindlasti töötab.

Juhendid Internetis

Oli nii, et internet ei kannata erinevatest juhenditest, õpetustest, samm-sammult juhenditest ja muudest sellistest asjadest puudust. Oli nii, et mulle pandi ülesanne töötada välja lahendus PostgreSQLi talitluskindla klastri mugavaks korraldamiseks, mille peamised nõudmised olid voogrepplikatsioon Master-serverilt kõigile replikaatidele ja automaatne varu sisseviimine Master-serveri tõrke korral.

Sellisel etapil määrati kasutatavate tehnoloogiate kogum:

  • PostgreSQL andmebaasisüsteemina
  • Patronit klastreerimise lahendusena
  • etcd jaotatud salvestusruumana Patroni jaoks
  • HAproxy rakenduste jaoks, mis kasutavad andmebaasi, sisenemise ühtse punkti loomimiseks.

Paigaldamine

Meie tähelepanu all on kõrge kättesaadavuse PostgreSQLi klastrite ehitamine Patroni, etcd ja HAProxy abil.

Kõik toimingud tehti Debian 10 opsüsteemiga virtuaalmasinatel.

etcd

Ma ei soovita etcd-d paigaldada samadesse masinatesse, kus asuvad patroni ja postgresql, kuna etcd jaoks on kettaruumi koormus väga oluline. Kuid õppe eesmärgil teeme me just nii.
Paigaldame etcd.

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

Lisage sisu faili /etc/default/etcd

[liige]

ETCD_NAME=datanode1 # teie masina hostinimi
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

KÕIK IP AADRESSID PEAVAD OLEMA KEHTIVAD. LISTENER PEER, CLIENT jne PEAVAD OLEMA SEADISTATUD HOSTI IP AADRISS.

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380" # teie masina aadress
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379" # teie masina aadress

[klaster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380" # teie masina aadress
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380" # kõik masinate aadressid klastris etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379" # teie masina aadress

Käivitage käsk

systemctl restart etcd

PostgreSQL 9.6 + patroni

Esimene samm on kolme virtuaalse masina installimine, et vajalik tarkvara paigaldada. Masinate installeerimise järel, kui järgite minu õpetust, saate käivitada selle lihtsa skripti, mis teeb (peaaegu) kõik teie eest. Skript käivitatakse root-i alt.

Pange tähele, et skript kasutab PostgreSQL versiooni 9.6, mis on meie ettevõtte sisemiste nõudmise tõttu. Lahendust ei ole testitud teiste PostgreSQL versioonide peal.

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

Seejärel peate just loodud failile /etc/patroni.yml lisama järgmise sisu, muutes loomulikult IP-aadressid kõigis kohtades oma kasutatavateks aadressideks.
Pöörake tähelepanu selle yaml-i kommentaaridele. Muutke aadresse enda omadeks, igas klastrimasinas.

/etc/patroni.yml

scope: pgsql # peab olema sama kõigil sõlmedel
namespace: /cluster/ # peab olema sama kõigil sõlmedel
name: postgres1 # peab olema erinev kõigil sõlmedel

restapi:
    listen: 192.168.0.143:8008 # selle faili asukoha sõlme aadress
    connect_address: 192.168.0.143:8008 # selle faili asukoha sõlme aadress

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # loetlege siin kõik teie sõlmed, kui paigaldate etcd neile

# see jaotis (bootstrap) kirjutatakse Etcd:///config pärast uue klastrinõuete algatamist
# ja kõik teised klastriliikmed kasutavad seda kui `globaalset konfiguratsiooni`
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 peab sisaldama KÕIKIDE klastris kasutatavate masinate aadresse
    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 # selle faili asukoha sõlme aadress
    connect_address: 192.168.0.143:5432 # selle faili asukoha sõlme aadress
    data_dir: /data/patroni # selle kausta loob ülaltoodud skript ja määrab vajalikud õigused
    bin_dir:  /usr/lib/postgresql/9.6/bin # määrake oma postgresql kausta tee
    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

Skripti tuleb käivitada kõikidel kolmel klastrimasinal, samuti tuleb antud konfiguratsioon paigutada faili /etc/patroni.yml kõigis masinates.

Kui olete need toimingud teinud kõikides klastrimasinates, käivitage järgmine käsk mõnel neist

systemctl start patroni
systemctl start postgresql

Oodake umbes 30 sekundit, seejärel käivitage see käsk ülejäänud klastrimasinates.

HAproxy

Kasutame suurepärast HAproxy't, et pakkuda ühte sisenemispunkti. Master-server on alati kergesti ligipääsetav HAproxy rakenduse paigutuse aadressilt.

Kuna vältida, et HAproxy muutuks ainukeseks rikkepunktiks, käivitame selle Dockeris, hiljem saab selle käivitada K8’s klastris, muutes meie rikkevastupidava klastrite veelgi usaldusväärsemaks.

Looge direktorium, kuhu saate salvestada kaks faili — Dockerfile ja haproxy.cfg. Liikuge sinna.

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

Olge ettevaatlik, haproxy.cfg faili kolmes viimases reas peavad olema loetletud teie serverite aadressid. HAproxy pöördub Patroni poole, HTTP-pealkirjades naaseb master-server alati 200, ja replica — 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

Olles kaustas, kus asuvad mõlemad meie failid, täidame järjestikku konteineri pakkimise käsud ja ka selle käivitamise koos vajalikku sadamate edastamisega:

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

Nüüd, avades brauseris oma HAproxy masina aadressi ja määrates sadama 7000, näete statistikat oma klastrite kohta.

UP-seisundis on see server, mis on master, ja replika on DOWN-seisundis. See on normaalne, tegelikult töötavad nad, kuid kuvatakse nii, kuna nad naasevad 503 päringutele HAproxy poolt. See võimaldab meil alati täpselt teada, milline kolmest serverist on praegu master.

Kokkuvõte

Te olete suurepärased! Ainult 30 minutiga olete käivitanud suurepärase rikkevastupidava ja tõhusa andmebaasi klastrite voogude replikatsiooni ja automaatse varu. Kui plaanite seda lahendust kasutada, tutvuge Patroni ametliku dokumentatsiooniga, eriti selle osaga, mis käsitleb patronictl utiliiti, mis pakub mugavat juurdepääsu teie klastrite haldamiseks.

Palju õnne!

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster