It bouwen fan in heul beskikber PostgreSQL-kluster mei Patroni, ensfh., HAProxy

It barde krekt dat ik op it stuit dat it probleem waard pleatst net genôch ûnderfining hie om dizze oplossing allinich te ûntwikkeljen en te starten. En doe begon ik te googlejen.

Ik wit net wat it fanke is, mar foar de safolste kear sit ik mei it feit dat sels as ik alles stap foar stap doch lykas yn 'e tutorial, deselde omjouwing tariede as de skriuwer, dan wurket noait neat. Ik haw gjin idee wat der oan de hân is, mar doe't ik dit wer tsjinkaam, besleat ik dat ik myn eigen tutorial sil skriuwe as alles goed wurket. Ien dy't grif sil wurkje.

Gidsen op it ynternet

It bart sa dat it ynternet gjin lêst hat fan in gebrek oan ferskate gidsen, tutorials, stap foar stap en sa. It barde krekt dat ik de opdracht krige om in oplossing te ûntwikkeljen foar it maklik organisearjen en bouwen fan in failover PostgreSQL-kluster, wêrfan de wichtichste easken wiene streamende replikaasje fan 'e Master-tsjinner nei alle replika's en automatyske foarsjenning fan in reserve yn it gefal fan in Master-tsjinner mislearring.

Op dit stadium waard de stapel brûkte technologyen bepaald:

  • PostgreSQL as DBMS
  • Patroni as klusteroplossing
  • etcd as ferspraat opslach foar Patroni
  • HAproxy foar it organisearjen fan ien yngongspunt foar applikaasjes dy't de database brûke

ynstelling

Foar jo oandacht - it bouwen fan in heul beskikber PostgreSQL-kluster mei Patroni, ensfh., HAProxy.

Alle operaasjes waarden útfierd op firtuele masines mei Debian 10 OS ynstalleare.

ensfh

Ik riede net oan om etcd te ynstallearjen op deselde masines wêr't patroni en postgresql sille lizze, om't skiifladen heul wichtich is foar etcd. Mar foar edukative doelen sille wy dat krekt dwaan.
Litte wy ynstallearje etcd.

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

Foegje ynhâld ta oan /etc/default/etcd-bestân

[lid]

ETCD_NAME=datanode1 # hostnamme fan jo masine
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLE IP-adressen moatte jildich wêze. LISTER PEER, KLIËNT ensfh. MOET WORDEN SET OP IP-ADRES FAN HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adres fan jo auto
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adres fan jo auto

[kluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adres fan jo auto
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # adressen fan alle masines yn it etcd-kluster
ETCD_INITIAL_CLUSTER_STATE="nij"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adres fan jo auto

Run it kommando

systemctl restart etcd

PostgreSQL 9.6 + patroni

It earste ding dat jo moatte dwaan is trije firtuele masines ynstelle om de nedige software op har te ynstallearjen. Nei it ynstallearjen fan de masines, as jo myn tutorial folgje, kinne jo dit ienfâldige skript útfiere dat (hast) alles foar jo sil dwaan. Rint as root.

Tink derom dat it skript PostgreSQL ferzje 9.6 brûkt, dit komt troch de ynterne easken fan ús bedriuw. De oplossing is net hifke op oare ferzjes fan 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

Folgjende, yn it /etc/patroni.yml-bestân dat jo krekt makke hawwe, moatte jo de folgjende ynhâld pleatse, fansels feroarje de IP-adressen op alle plakken nei de adressen dy't jo brûke.
Jou omtinken oan de opmerkingen yn dizze yaml. Feroarje de adressen nei jo eigen op elke masine yn it kluster.

/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

It skript moat wurde útfierd op alle trije masines fan it kluster, en de boppesteande konfiguraasje moat ek pleatst wurde yn de /etc/patroni.yml triem op alle masines.

Sadree't jo hawwe foltôge dizze operaasjes op alle masines yn it kluster, fier it folgjende kommando op ien fan harren

systemctl start patroni
systemctl start postgresql

Wachtsje sawat 30 sekonden, fier dan dit kommando út op de oerbleaune masines yn it kluster.

HAproxy

Wy brûke de prachtige HAproxy om ien yngongspunt te leverjen. De masterserver sil altyd beskikber wêze op it adres fan 'e masine wêrop HAproxy ynset is.

Om de masine mei HAproxy net in ienich punt fan mislearring te meitsjen, sille wy it yn 'e takomst lansearje yn in Docker-kontener kin it wurde lansearre yn' e K8's kluster en meitsje ús failover-kluster noch betrouberer.

Meitsje in map wêr't jo twa bestannen kinne opslaan - Dockerfile en haproxy.cfg. Gean nei it.

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

Wês foarsichtich, de lêste trije rigels fan it haproxy.cfg-bestân moatte de adressen fan jo masines opnimme. HAproxy sil kontakt opnimme mei Patroni, yn 'e HTTP-koppen sil de masterserver altyd 200 weromkomme, en de replika sil altyd 503 weromkomme.

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

Troch yn 'e map te wêzen wêryn ús beide bestannen "lizze", litte wy de kommando's foar it ynpakken fan 'e kontener opfolgjend útfiere, en ek it starten mei it trochstjoeren fan de nedige havens:

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

No, troch it adres fan jo masine te iepenjen mei HAproxy yn 'e browser en poarte 7000 op te jaan, sille jo statistiken sjen oer jo kluster.

De tsjinner dy't de master is sil yn 'e UP-status wêze, en de replika's sille yn' e DOWN-status wêze. Dit is normaal, feitlik wurkje se, mar se ferskine op dizze manier om't se 503 weromkomme foar oanfragen fan HAproxy. Hjirmei kinne wy ​​altyd krekt witte hokker fan 'e trije servers de hjoeddeistige master is.

konklúzje

Do bist prachtich! Yn mar 30 minuten hawwe jo in poerbêste fouttolerant en heechprestearjend databasekluster ynset mei streamende replikaasje en automatyske fallback. As jo ​​fan plan binne om dizze oplossing te brûken, kontrolearje dan mei offisjele Patroni dokumintaasje, en benammen mei syn diel oangeande it patronictl-hulpprogramma, dat maklike tagong jout ta it behearen fan jo kluster.

Wolkom!

Boarne: www.habr.com

Add a comment