Izgradnja visoko dostupnog PostgreSQL klastera pomoću Patronija, etcd, HAProxy

Slučajno se dogodilo da u trenutku postavljanja problema nisam imao dovoljno iskustva da sam razvijem i lansiram ovo rješenje. A onda sam počeo guglati.

Ne znam u čemu je kvaka, ali po tko zna koji put se suočavam s činjenicom da čak i ako sve radim korak po korak kao u tutorijalu, pripremam isto okruženje kao autor, onda ništa ne radi. Nemam pojma što je bilo, ali kad sam se opet susreo s ovim, odlučio sam da ću napisati svoj tutorial kad sve bude u redu. Onaj koji će sigurno raditi.

Vodiči na internetu

Slučajno internet ne pati od nedostatka raznih vodiča, tutorijala, korak po korak i slično. Slučajno se dogodilo da sam dobio zadatak razviti rješenje za prikladnu organizaciju i izgradnju failover PostgreSQL klastera, čiji su glavni zahtjevi bili strujanje replikacije s glavnog poslužitelja na sve replike i automatsko osiguravanje rezerve u slučaju glavnog poslužitelja. neuspjeh.

U ovoj fazi određen je skup korištenih tehnologija:

  • PostgreSQL kao DBMS
  • pokrovitelj kao rješenje klasteriranja
  • etcd kao distribuirana pohrana za Patroni
  • HAproxy za organiziranje jedinstvene ulazne točke za aplikacije koje koriste bazu podataka

Instalacija

Za vašu pozornost - izgradnja visoko dostupnog PostgreSQL klastera pomoću Patronija, etcd, HAProxy.

Sve operacije izvedene su na virtualnim strojevima s instaliranim Debian 10 OS-om.

itd

Ne preporučam instaliranje etcd-a na iste strojeve na kojima će se nalaziti patroni i postgresql, jer je opterećenje diska vrlo važno za etcd. Ali u obrazovne svrhe, učinit ćemo upravo to.
Instaliramo etcd.

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

Dodajte sadržaj u datoteku /etc/default/etcd

[član]

ETCD_NAME=datanode1 # naziv hosta vašeg stroja
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

SVE IP ADRESE TREBAJU BITI VALJANE. LISTER PEER, KLIJENT itd. TREBA BITI POSTAVLJEN NA IP ADRESU HOST-a

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # adresa vašeg automobila
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # adresa vašeg automobila

[Klastera]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # adresa vašeg automobila
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # adrese svih strojeva u etcd klasteru
ETCD_INITIAL_CLUSTER_STATE="novo"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # adresa vašeg automobila

Pokrenite naredbu

systemctl restart etcd

PostgreSQL 9.6 + patroni

Prvo što trebate učiniti je postaviti tri virtualna računala kako biste na njih instalirali potreban softver. Nakon instaliranja strojeva, ako slijedite moje upute, možete pokrenuti ovu jednostavnu skriptu koja će (gotovo) učiniti sve za vas. Pokreće se kao root.

Imajte na umu da skripta koristi PostgreSQL verziju 9.6, to je zbog internih zahtjeva naše tvrtke. Rješenje nije testirano na drugim verzijama PostgreSQL-a.

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

Zatim, u datoteku /etc/patroni.yml koju ste upravo stvorili, trebate smjestiti sljedeći sadržaj, naravno mijenjajući IP adrese na svim mjestima na adrese koje koristite.
Obratite pažnju na komentare u ovom yamlu. Promijenite adrese u vlastite na svakom računalu u klasteru.

/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

Skripta se mora pokrenuti na sva tri računala klastera, a gornja konfiguracija također mora biti smještena u datoteku /etc/patroni.yml na svim računalima.

Nakon što dovršite ove operacije na svim strojevima u klasteru, pokrenite sljedeću naredbu na bilo kojem od njih

systemctl start patroni
systemctl start postgresql

Pričekajte oko 30 sekundi, zatim pokrenite ovu naredbu na preostalim strojevima u klasteru.

HAproxy

Koristimo prekrasan HAproxy za pružanje jedinstvene ulazne točke. Glavni poslužitelj će uvijek biti dostupan na adresi računala na kojem je postavljen HAproxy.

Kako stroj s HAproxyjem ne bi bio jedna točka kvara, pokrenut ćemo ga u Docker spremniku; u budućnosti se može pokrenuti u klaster K8 i učiniti naš failover cluster još pouzdanijim.

Napravite direktorij u koji možete pohraniti dvije datoteke - Dockerfile i haproxy.cfg. Idi na to.

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

Budite oprezni, posljednja tri retka datoteke haproxy.cfg trebaju navesti adrese vaših strojeva. HAproxy će kontaktirati Patroni, u HTTP zaglavljima glavni poslužitelj će uvijek vraćati 200, a replika će uvijek vraćati 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

Budući da smo u direktoriju u kojem "leže" obje naše datoteke, izvršimo sekvencijalne naredbe za pakiranje spremnika, kao i njegovo pokretanje s prosljeđivanjem potrebnih portova:

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

Sada, otvaranjem adrese vašeg stroja s HAproxyjem u pregledniku i navođenjem porta 7000, vidjet ćete statistiku o vašem klasteru.

Poslužitelj koji je glavni će biti u GORE stanju, a replike će biti u DOLE stanju. To je normalno, zapravo rade, ali se pojavljuju ovako jer vraćaju 503 za zahtjeve HAproxyja. To nam omogućuje da uvijek točno znamo koji je od tri poslužitelja trenutni glavni.

Zaključak

prekrasna si! U samo 30 minuta implementirali ste izvrstan klaster baze podataka otporan na greške i visokih performansi s replikacijom strujanja i automatskim povratom. Ako planirate koristiti ovo rješenje, provjerite sa službenom Patroni dokumentacijom, a posebno u dijelu koji se odnosi na pomoćni program patronictl, koji omogućuje jednostavan pristup upravljanju vašim klasterom.

Čestitamo!

Izvor: www.habr.com

Dodajte komentar