Ndërtimi i një grupi PostgreSQL shumë të disponueshëm duke përdorur Patroni, etcd, HAProxy

Thjesht ndodhi që në kohën kur u shtrua problemi, unë nuk kisha përvojë të mjaftueshme për të zhvilluar dhe nisur vetëm këtë zgjidhje. Dhe pastaj fillova të google-oja.

Nuk e di se çfarë është kapja, por për të disatën herë jam përballur me faktin që edhe nëse bëj gjithçka hap pas hapi si në tutorial, përgatit të njëjtin mjedis si autori, atëherë asgjë nuk funksionon. Nuk e kam idenë se çfarë është çështja, por kur e hasa përsëri këtë, vendosa që do të shkruaj tutorialin tim kur gjithçka të funksionojë. Një që patjetër do të funksionojë.

Udhëzues në internet

Ndodh që interneti të mos vuajë nga mungesa e udhëzuesve të ndryshëm, tutorialeve, hap pas hapi e të ngjashme. Kështu ndodhi që unë u ngarkova me zhvillimin e një zgjidhjeje për organizimin dhe ndërtimin e një grupi të zhgënjyer PostgreSQL, kërkesat kryesore për të cilat ishin riprodhimi i transmetimit nga serveri Master në të gjitha kopjet dhe sigurimi automatik i një rezerve në rast të një serveri Master. dështimi.

Në këtë fazë, u përcaktua grupi i teknologjive të përdorura:

  • PostgreSQL si një DBMS
  • Patroni si zgjidhje grupimi
  • etjd si ruajtje e shpërndarë për Patroni
  • HAproxy për organizimin e një pike të vetme hyrëse për aplikacionet që përdorin bazën e të dhënave

Instalim

Për vëmendjen tuaj - ndërtimi i një grupi PostgreSQL shumë të disponueshëm duke përdorur Patroni, etcd, HAProxy.

Të gjitha operacionet u kryen në makina virtuale me Debian 10 OS të instaluar.

etj

Unë nuk rekomandoj instalimin e etcd në të njëjtat makina ku do të vendosen patroni dhe postgresql, pasi ngarkesa e diskut është shumë e rëndësishme për etcd. Por për qëllime edukative, ne do të bëjmë pikërisht këtë.
Le të instalojmë etjd.

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

Shtoni përmbajtje në skedarin /etc/default/etcd

[anëtar]

ETCD_NAME=datanode1 # emri i hostit të kompjuterit tuaj
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

TE GJITHA ADRESAT IP DUHET TE JENE VLEFSHME. LISTER PEER, KLIENTI etj DUHET TË CAKTOHET NË ADRESA IP të HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adresa e makinës suaj
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adresa e makinës suaj

[grup]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adresa e makinës suaj
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # adresat e të gjitha makinave në grupin etcd
ETCD_INITIAL_CLUSTER_STATE="i ri"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adresa e makinës suaj

Ekzekutoni komandën

systemctl restart etcd

PostgreSQL 9.6 + patroni

Gjëja e parë që duhet të bëni është të vendosni tre makina virtuale për të instaluar softuerin e nevojshëm në to. Pas instalimit të makinave, nëse ndiqni tutorialin tim, mund të ekzekutoni këtë skript të thjeshtë që (pothuajse) do të bëjë gjithçka për ju. Punon si rrënjë.

Ju lutemi vini re se skripti përdor versionin 9.6 të PostgreSQL, kjo është për shkak të kërkesave të brendshme të kompanisë sonë. Zgjidhja nuk është testuar në versionet e tjera të 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

Më pas, në skedarin /etc/patroni.yml që sapo keni krijuar, duhet të vendosni përmbajtjet e mëposhtme, natyrisht duke ndryshuar adresat IP në të gjitha vendet në adresat që përdorni.
Kushtojini vëmendje komenteve në këtë yaml. Ndryshoni adresat në adresat tuaja në secilën makinë në grup.

/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

Skripti duhet të ekzekutohet në të tre makinat e grupit dhe konfigurimi i mësipërm duhet të vendoset gjithashtu në skedarin /etc/patroni.yml në të gjitha makinat.

Pasi të keni përfunduar këto operacione në të gjitha makinat në grup, ekzekutoni komandën e mëposhtme në secilën prej tyre

systemctl start patroni
systemctl start postgresql

Prisni rreth 30 sekonda, pastaj ekzekutoni këtë komandë në makinat e mbetura në grup.

HAproxy

Ne përdorim HAproxy-in e mrekullueshëm për të siguruar një pikë të vetme hyrjeje. Serveri kryesor do të jetë gjithmonë i disponueshëm në adresën e makinës në të cilën është vendosur HAproxy.

Për të mos e bërë makinën me HAproxy një pikë të vetme dështimi, ne do ta lëshojmë atë në një kontejner Docker; në të ardhmen ajo mund të lëshohet në grupin e K8 dhe ta bëjë grupin tonë të dështimit edhe më të besueshëm.

Krijoni një direktori ku mund të ruani dy skedarë - Dockerfile dhe haproxy.cfg. Shkoni tek ajo.

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

Kini kujdes, tre rreshtat e fundit të skedarit haproxy.cfg duhet të listojnë adresat e makinerive tuaja. HAproxy do të kontaktojë Patroni, në kokat e HTTP serveri kryesor do të kthejë gjithmonë 200 dhe kopja do të kthejë gjithmonë 503.

haproksi.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

Duke qenë në drejtorinë në të cilën të dy skedarët tanë "shtrihen", le të ekzekutojmë në mënyrë sekuenciale komandat për paketimin e kontejnerit, si dhe ta lëshojmë atë me përcjelljen e portave të nevojshme:

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

Tani, duke hapur adresën e kompjuterit tuaj me HAproxy në shfletues dhe duke specifikuar portin 7000, do të shihni statistika në grupin tuaj.

Serveri që është master do të jetë në gjendjen UP, dhe kopjet do të jenë në gjendjen DOWN. Kjo është normale, në fakt funksionojnë, por shfaqen kështu sepse kthejnë 503 për kërkesat nga HAproxy. Kjo na lejon të dimë gjithmonë saktësisht se cili nga tre serverët është masteri aktual.

Përfundim

Ju jeni i mrekullueshëm! Në vetëm 30 minuta ju keni vendosur një grup bazë të dhënash të shkëlqyera tolerante ndaj gabimeve dhe me performancë të lartë me përsëritje të transmetimit dhe rikthim automatik. Nëse po planifikoni të përdorni këtë zgjidhje, shikoni me dokumentacion zyrtar Patroni, dhe veçanërisht me pjesën e tij në lidhje me shërbimin patronictl, i cili ofron akses të përshtatshëm për menaxhimin e grupit tuaj.

Urime!

Burimi: www.habr.com

Shto një koment