Bini ta 'cluster PostgreSQL disponibbli ħafna bl-użu ta' Patroni, etcd, HAProxy

Ġara li fiż-żmien li nqalgħet il-problema, ma kellix biżżejjed esperjenza biex niżviluppa u nniedi din is-soluzzjoni waħdi. U mbagħad bdejt niddejjaq fuq Google.

Ma nafx x'inhi l-qabda, iżda għall-engħa darba qed niffaċċja l-fatt li anke jekk nagħmel kollox pass pass bħal fit-tutorja, nipprepara l-istess ambjent bħall-awtur, allura qatt ma jaħdem xejn. M'għandi l-ebda idea x'inhi l-kwistjoni, imma meta erġajt iltqajt ma' dan, iddeċidejt li nikteb it-tutorja tiegħi stess meta kollox jaħdem. Waħda li żgur taħdem.

Gwidi fuq l-Internet

Jiġri li l-Internet ma jbatix minn nuqqas ta 'diversi gwidi, tutorials, pass pass u simili. Ġara li jien kont inkarigat li niżviluppa soluzzjoni biex norganizza u nibni b’mod konvenjenti cluster PostgreSQL ta’ failover, li r-rekwiżiti ewlenin tagħhom kienu streaming replikazzjoni mis-server Master għar-repliki kollha u forniment awtomatiku ta’ riserva fil-każ ta’ server Master. falliment.

F'dan l-istadju, ġie determinat il-munzell ta 'teknoloġiji użati:

  • PostgreSQL bħala DBMS
  • Patroni bħala soluzzjoni ta' raggruppament
  • etcd bħala ħażna mqassma għal Patroni
  • HAproxy għall-organizzazzjoni ta' punt ta' dħul wieħed għall-applikazzjonijiet li jużaw id-database

Installazzjoni

Għall-attenzjoni tiegħek - bini ta 'cluster PostgreSQL disponibbli ħafna bl-użu ta' Patroni, etcd, HAProxy.

Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.

eċċd

Ma nirrakkomandax li ninstalla etcd fuq l-istess magni fejn se jkunu jinsabu patroni u postgresql, peress li t-tagħbija tad-disk hija importanti ħafna għal etcd. Iżda għal skopijiet edukattivi, aħna se nagħmlu dan.
Ejja ninstallaw etcd.

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

Żid il-kontenut fil-fajl /etc/default/etcd

[Membru]

ETCD_NAME=datanode1 # hostname tal-magna tiegħek
ETCD_DATA_DIR="/var/lib/etcd/default.etcd”

L-INDIRIZZI IP KOLLHA GĦANDHOM IKUNU VALIDI. LISTER PEER, KLIJENT eċċ GĦANDHOM JIĠI FISSAT GĦAL INDIRIZZ IP TAL-Ospitanti

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # indirizz tal-karozza tiegħek
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # indirizz tal-karozza tiegħek

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # indirizz tal-karozza tiegħek
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # indirizzi tal-magni kollha fil-cluster etcd
ETCD_INITIAL_CLUSTER_STATE="ġdid"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # indirizz tal-karozza tiegħek

Mexxi l-kmand

systemctl restart etcd

PostgreSQL 9.6 + patroni

L-ewwel ħaġa li trid tagħmel hu li twaqqaf tliet magni virtwali biex tinstalla s-softwer meħtieġ fuqhom. Wara li tinstalla l-magni, jekk issegwi t-tutorja tiegħi, tista 'tmexxi dan l-iskrittura sempliċi li (kważi) tagħmel kollox għalik. Runs bħala għerq.

Jekk jogħġbok innota li l-iskrittura juża PostgreSQL verżjoni 9.6, dan huwa dovut għar-rekwiżiti interni tal-kumpanija tagħna. Is-soluzzjoni ma ġietx ittestjata fuq verżjonijiet oħra ta '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

Sussegwentement, fil-fajl /etc/patroni.yml li għadek kif ħoloq, għandek bżonn tpoġġi l-kontenut li ġej, ovvjament tibdel l-indirizzi IP fil-postijiet kollha għall-indirizzi li tuża.
Oqgħod attent għall-kummenti f'dan il-yaml. Ibdel l-indirizzi għal tiegħek fuq kull magna fil-cluster.

/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

L-iskript għandu jitħaddem fuq it-tliet magni tal-cluster, u l-konfigurazzjoni ta 'hawn fuq trid titqiegħed ukoll fil-fajl /etc/patroni.yml fuq il-magni kollha.

Ladarba tkun lestejt dawn l-operazzjonijiet fuq il-magni kollha fil-cluster, mexxi l-kmand li ġej fuq kwalunkwe waħda minnhom

systemctl start patroni
systemctl start postgresql

Stenna madwar 30 sekonda, imbagħad ħaddem dan il-kmand fuq il-magni li jifdal fil-cluster.

HAproxy

Aħna nużaw l-HAproxy mill-isbaħ biex nipprovdu punt wieħed tad-dħul. Is-server prinċipali dejjem ikun disponibbli fl-indirizz tal-magna li fuqha jiġi skjerat HAproxy.

Sabiex il-magna b'HAproxy ma tagħmilx punt wieħed ta' falliment, aħna se nnieduha f'kontenitur Docker; fil-futur tista 'tiġi mnedija fil-cluster tal-K8 u tagħmel il-cluster ta' failover tagħna saħansitra aktar affidabbli.

Oħloq direttorju fejn tista' taħżen żewġ fajls - Dockerfile u haproxy.cfg. Mur għaliha.

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

Oqgħod attent, l-aħħar tliet linji tal-fajl haproxy.cfg għandhom jelenkaw l-indirizzi tal-magni tiegħek. HAproxy se jikkuntattja lil Patroni, fl-intestaturi HTTP is-server prinċipali dejjem se jirritorna 200, u r-replika dejjem se jirritorna 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

Peress li tkun fid-direttorju li fih iż-żewġ fajls tagħna "jimteddu", ejja nwettqu b'mod sekwenzjali l-kmandi għall-ippakkjar tal-kontenitur, kif ukoll innieduh bit-trażmissjoni tal-portijiet meħtieġa:

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

Issa, billi tiftaħ l-indirizz tal-magna tiegħek b'HAproxy fil-browser u tispeċifika l-port 7000, se tara statistika dwar il-cluster tiegħek.

Is-server li huwa l-kaptan se jkun fl-istat UP, u r-repliki se jkunu fl-istat DOWN. Dan huwa normali, fil-fatt jaħdmu, iżda jidhru b'dan il-mod għax jirritornaw 503 għal talbiet minn HAproxy. Dan jippermettilna dejjem inkunu nafu eżattament liema mit-tliet servers huwa l-kaptan attwali.

Konklużjoni

Inti sabiħ ħafna! Fi 30 minuta biss użajt raggruppament ta 'databases eċċellenti tolleranti għall-ħsarat u ta' prestazzjoni għolja b'replikazzjoni ta' streaming u fallback awtomatiku. Jekk qed tippjana li tuża din is-soluzzjoni, iċċekkja bid-dokumentazzjoni uffiċjali tal-Patroni, u speċjalment bil-parti tagħha li tikkonċerna l-utilità patronictl, li tipprovdi aċċess konvenjenti għall-ġestjoni tal-cluster tiegħek.

Prosit!

Sors: www.habr.com

Ixtri hosting affidabbli għal siti bi protezzjoni DDoS, servers VPS VDS 🔥 Ixtri hosting ta' websajts affidabbli bi protezzjoni DDoS, servers VPS VDS | ProHoster