Að byggja upp mjög fáanlegur PostgreSQL þyrping með því að nota Patroni, etcd, HAProxy

Það gerðist bara þannig að á þeim tíma sem vandamálið kom upp hafði ég ekki næga reynslu til að þróa og koma þessari lausn af stað einn. Og svo byrjaði ég að googla.

Ég veit ekki hver gripurinn er, en í margfættasta skiptið stend ég frammi fyrir því að jafnvel þótt ég geri allt skref fyrir skref eins og í kennslunni, undirbúi sama umhverfi og höfundurinn, þá virkar aldrei neitt. Ég hef ekki hugmynd um hvað er að, en þegar ég rakst á þetta aftur ákvað ég að skrifa mitt eigið námskeið þegar allt gengur upp. Einn sem mun örugglega virka.

Leiðbeiningar á Netinu

Það vill svo til að internetið þjáist ekki af skorti á ýmsum leiðbeiningum, leiðbeiningum, skref-fyrir-skref og þess háttar. Það gerðist bara þannig að mér var falið að þróa lausn til að skipuleggja og byggja upp bilunar- PostgreSQL þyrping á þægilegan hátt, þar sem helstu kröfurnar voru að streyma afritun frá Master miðlara yfir á allar eftirmyndir og sjálfvirk úthlutun varasjóðs ef um Master miðlara væri að ræða. bilun.

Á þessu stigi var stafla af tækni sem notuð var ákvörðuð:

  • PostgreSQL sem DBMS
  • Patroni sem klasalausn
  • etcd sem dreifð geymsla fyrir Patroni
  • HAproxy til að skipuleggja einn aðgangsstað fyrir forrit sem nota gagnagrunninn

Uppsetning

Fyrir athygli þína - byggja upp mjög fáanlegur PostgreSQL þyrping með því að nota Patroni, etcd, HAProxy.

Allar aðgerðir voru gerðar á sýndarvélum með Debian 10 OS uppsett.

osfrv

Ég mæli ekki með því að setja upp etcd á sömu vélunum þar sem patroni og postgresql verða staðsett, þar sem diskálag er mjög mikilvægt fyrir etcd. En í fræðsluskyni munum við gera einmitt það.
Við skulum setja upp etcd.

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

Bættu efni við /etc/default/etcd skrána

[meðlimur]

ETCD_NAME=datanode1 # hýsingarheiti vélarinnar þinnar
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ALLAR IP-tölur ættu að vera í gildi. LISTER JINGJANDI, VIÐSKIPTI o.s.frv. ÆTTI AÐ VERA STELÐ Á IP-VÍL HOSTJA

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # heimilisfang bílsins þíns
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # heimilisfang bílsins þíns

[þyrping]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # heimilisfang bílsins þíns
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # heimilisföng allra véla í etcd klasanum
ETCD_INITIAL_CLUSTER_STATE="nýtt"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # heimilisfang bílsins þíns

Keyra skipunina

systemctl restart etcd

PostgreSQL 9.6 + verndari

Það fyrsta sem þú þarft að gera er að setja upp þrjár sýndarvélar til að setja upp nauðsynlegan hugbúnað á þær. Eftir að hafa sett upp vélarnar, ef þú fylgir kennslunni minni, geturðu keyrt þetta einfalda handrit sem mun (næstum) gera allt fyrir þig. Keyrir sem rót.

Vinsamlegast athugaðu að handritið notar PostgreSQL útgáfu 9.6, þetta er vegna innri krafna fyrirtækisins okkar. Lausnin hefur ekki verið prófuð á öðrum útgáfum af 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

Næst, í /etc/patroni.yml skránni sem þú varst að búa til, þarftu að setja eftirfarandi innihald, auðvitað að breyta IP tölunum á öllum stöðum í vistföngin sem þú notar.
Gefðu gaum að athugasemdunum í þessari yaml. Breyttu heimilisföngunum í þitt eigið á hverri vél í klasanum.

/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

Forskriftin verður að keyra á öllum þremur vélum þyrpingarinnar og ofangreindar stillingar verða einnig að vera settar í /etc/patroni.yml skrána á öllum vélum.

Þegar þú hefur lokið þessum aðgerðum á öllum vélum í klasanum skaltu keyra eftirfarandi skipun á einhverri þeirra

systemctl start patroni
systemctl start postgresql

Bíddu í um það bil 30 sekúndur, keyrðu síðan þessa skipun á þeim vélum sem eftir eru í þyrpingunni.

HAproxy

Við notum hið frábæra HAproxy til að bjóða upp á einn aðgangsstað. Aðalþjónninn verður alltaf tiltækur á heimilisfangi vélarinnar sem HAproxy er sett á.

Til þess að gera vélina með HAproxy ekki að einum bilunarpunkti munum við ræsa hana í Docker gámi; í framtíðinni er hægt að ræsa hana í K8 þyrpinguna og gera bilunarklasann okkar enn áreiðanlegri.

Búðu til möppu þar sem þú getur geymt tvær skrár - Dockerfile og haproxy.cfg. Farðu í það.

Dockerfil

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

Vertu varkár, síðustu þrjár línurnar í haproxy.cfg skránni ættu að skrá heimilisföng vélanna þinna. HAproxy mun hafa samband við Patroni, í HTTP hausunum mun aðalþjónninn alltaf skila 200 og eftirmyndin mun alltaf skila 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

Verum í möppunni þar sem báðar skrárnar okkar „ligga“, skulum framkvæma skipanirnar í röð til að pakka ílátinu, ásamt því að ræsa hann með áframsendingu nauðsynlegra gátta:

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

Nú, með því að opna heimilisfang vélarinnar þinnar með HAproxy í vafranum og tilgreina port 7000, muntu sjá tölfræði um þyrpinguna þína.

Miðlarinn sem er meistarinn verður í UPP ástandinu og eftirmyndirnar verða í NIÐUR ástandinu. Þetta er eðlilegt, reyndar virka þeir, en þeir birtast þannig vegna þess að þeir skila 503 fyrir beiðnir frá HAproxy. Þetta gerir okkur kleift að vita alltaf nákvæmlega hver af þremur netþjónum er núverandi skipstjóri.

Ályktun

Þú ert stórglæsileg! Á aðeins 30 mínútum hefurðu komið fyrir frábærum bilanaþolnum og afkastamiklum gagnagrunnsþyrpingum með straumafritun og sjálfvirkri fallback. Ef þú ætlar að nota þessa lausn, skoðaðu þá með opinberum Patroni skjölum, og sérstaklega með hluta þess varðandi patronictl tólið, sem veitir þægilegan aðgang að stjórnun klasans þíns.

Til hamingju!

Heimild: www.habr.com

Bæta við athugasemd