Die bou van 'n hoë beskikbaarheid PostgreSQL-kluster met behulp van Patroni, ens., HAProxy

Dit het net so gebeur dat ek, ten tyde van die opstel van die taak, nie 'n voldoende mate van ondervinding gehad het om hierdie oplossing alleen te ontwikkel en uit te voer nie. En toe begin ek google.

Ek weet nie wat die vangs is nie, maar vir die soveelste keer kom ek op die feit af dat al doen jy alles stap vir stap soos in die tutoriaal, berei dieselfde omgewing as die skrywer s'n voor, dit werk steeds nooit. Ek het geen idee wat die saak is nie, maar toe ek weer hier raak, het ek besluit – en ek sal my tutoriaal skryf wanneer alles uitwerk. Een wat beslis sal werk.

Gidse op die internet

Dit gebeur net dat die internet nie ly aan 'n gebrek aan verskeie gidse, tutoriale, stap-vir-stap en dies meer nie. Dit het net so gebeur dat ek die taak gekry het om 'n oplossing te ontwikkel vir die gerieflike organisering en bou van 'n PostgreSQL failover-kluster, waarvan die hoofvereistes stroomreplikasie van die Meesterbediener na alle replikas was en outomatiese terugval wanneer die Meesterbediener misluk.

Op hierdie stadium is die stapel tegnologieë wat gebruik is bepaal:

  • PostgreSQL as 'n DBMS
  • Patroni as 'n groeperingsoplossing
  • ens as verspreide berging vir Patroni
  • HAproxy vir die organisering van 'n enkele toegangspunt vir toepassings wat die databasis gebruik

installasie

U aandag bou 'n hoë beskikbaarheid PostgreSQL-groepering met behulp van Patroni, ens., HAProxy.

Alle bewerkings is uitgevoer op virtuele masjiene met Debian 10 OS geïnstalleer.

ens

Ek beveel nie aan om etcd op dieselfde masjiene te installeer waar patroni en postgresql geleë sal wees nie, aangesien skyflaai baie belangrik is vir etcd. Maar vir opvoedkundige doeleindes sal ons dit doen.
Installeer ens.

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

Voeg inhoud by /etc/default/etcd-lêer

[lid]

ETCD_NAME=datanode1 # gasheernaam van jou masjien
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLE IP ADRESSE MOET GELDIG WEES. LISTER PEER, KLIËNT, ens. MOET OP DIE IP-ADRES VAN GESEER GESTEL WORD

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adres van jou masjien
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adres van jou masjien

[groepering]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adres van jou masjien
ETCD_INITIAL_CLUSTER="datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # adresse van alle masjiene in die ensd-groepering
ETCD_INITIAL_CLUSTER_STATE="nuut"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adres van jou masjien

Voer die opdrag uit

systemctl restart etcd

PostgreSQL 9.6 + klante

Die eerste ding om te doen is om drie virtuele masjiene op te stel om die nodige sagteware daarop te installeer. Nadat u die masjiene geïnstalleer het, as u my tutoriaal volg, kan u hierdie eenvoudige skrif uitvoer wat (amper) alles vir u sal doen. Loop as wortel.

Neem asseblief kennis dat die skrif die PostgreSQL 9.6-weergawe gebruik, dit is as gevolg van die interne vereistes van ons maatskappy. Die oplossing is nie op ander PostgreSQL-weergawes getoets nie.

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

Vervolgens, in die /etc/patroni.yml-lêer wat jy sopas geskep het, moet jy die volgende inhoud plaas, natuurlik verander die ip-adresse op alle plekke na die adresse wat jy gebruik.
Gee aandag aan die opmerkings in hierdie yaml. Verander die adresse na jou eie, op elke masjien in die groepie.

/etc/patroni.yml

scope: pgsql # должно быть одинаковым на всех нодах
namespace: /cluster/ # должно быть одинаковым на всех нодах
name: postgres1 # должно быть разным на всех нодах

restapi:
    listen: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл
    connect_address: 192.168.0.143:8008 # адрес той ноды, в которой находится этот файл

etcd:
    hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # перечислите здесь все ваши ноды, в случае если вы устанавливаете etcd на них же

# this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster
# and all other cluster members will use it as a `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: en_US.UTF8
    # init pg_hba.conf должен содержать адреса ВСЕХ машин, используемых в кластере
    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 # адрес той ноды, в которой находится этот файл
    connect_address: 192.168.0.143:5432 # адрес той ноды, в которой находится этот файл
    data_dir: /data/patroni # эту директорию создаст скрипт, описанный выше и установит нужные права
    bin_dir:  /usr/lib/postgresql/9.6/bin # укажите путь до вашей директории с 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

Die skrip moet op al drie masjiene van die groepering uitgevoer word, op dieselfde manier is dit nodig om die bogenoemde konfigurasie in die /etc/patroni.yml lêer op alle masjiene te plaas.

Wanneer jy hierdie bewerkings op alle groepmasjiene gedoen het, voer die volgende opdrag op enige van hulle uit

systemctl start patroni
systemctl start postgresql

Wag ongeveer 30 sekondes en voer dan hierdie opdrag op die res van die masjiene in die groep uit.

HAproxy

Ons gebruik die wonderlike HAproxy om 'n enkele toegangspunt te bied. Die hoofbediener sal altyd beskikbaar wees by die adres van die masjien waar HAproxy ontplooi is.

Om nie die masjien met HAproxy 'n enkele punt van mislukking te maak nie, sal ons dit in 'n Docker-houer laat loop, in die toekoms sal dit moontlik wees om dit in 'n K8 se cluster te laat loop en ons failover cluster nog meer betroubaar te maak.

Skep 'n gids waar jy twee lêers kan stoor - Dockerfile en haproxy.cfg. Gaan daarin.

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

Wees versigtig, die laaste drie reëls van die haproxy.cfg lêer moet die adresse van jou masjiene lys. HAproxy sal Patroni kontak, in HTTP-opskrifte sal die hoofbediener altyd 200 gee, en die replika sal altyd 503 terugstuur.

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

Omdat ons in die gids is waarin beide van ons lêers "lê", sal ons die opdragte vir die verpakking van die houer opeenvolgend uitvoer, sowel as dit begin met die nodige poorte wat aangestuur word:

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

Nou, wanneer jy die adres van jou masjien met HAproxy in die blaaier oopmaak en poort 7000 spesifiseer, sal jy die statistieke vir jou groepie sien.

Die bediener wat die meester is, sal in die UP-toestand wees, en die replikas sal in die DOWN-toestand wees. Dit is normaal, in werklikheid werk hulle, maar hulle word in hierdie vorm vertoon as gevolg van die feit dat hulle 503 terugstuur op versoeke van HAproxy. Dit stel ons in staat om altyd presies te weet watter van die drie bedieners die huidige meester is.

Gevolgtrekking

Jy is pragtig! In net 30 minute het jy 'n wonderlike failover- en prestasiedatabasisgroepering met stroomreplikasie en outomatiese failover ontplooi. As jy van plan is om hierdie oplossing te gebruik, kyk asseblief met amptelike Patroni-dokumentasie, en veral met sy deel met betrekking tot die patronictl-nut, wat gerieflike toegang bied tot die bestuur van jou cluster.

Baie geluk!

Bron: will.com

Voeg 'n opmerking