Ļoti pieejama PostgreSQL klastera izveide, izmantojot Patroni, etcd, HAProxy

Tā sagadījās, ka brīdī, kad problēma tika izvirzīta, man nebija pietiekami daudz pieredzes, lai izstrādātu un uzsāktu šo risinājumu vienatnē. Un tad es sāku googlēt.

Nezinu, kas tas ir, bet jau neskaitāmo reizi saskaros ar faktu, ka pat tad, ja visu daru soli pa solim kā pamācībā, sagatavoju tādu pašu vidi kā autors, tad nekas nekad neizdodas. Man nav ne jausmas, kas par lietu, bet, kad atkal saskāros ar to, es nolēmu, ka uzrakstīšu savu pamācību, kad viss izdosies. Tāds, kas noteikti darbosies.

Ceļveži internetā

Tā nu ir sagadījies, ka internets necieš no dažādu ceļvežu, pamācību, soli pa solim un tamlīdzīgi trūkuma. Sagadījās, ka man tika uzdots izstrādāt risinājumu ērtai kļūmjpārlēces PostgreSQL klastera organizēšanai un izveidei, kura galvenās prasības bija straumēšanas replikācija no galvenā servera uz visām replikām un automātiska rezerves nodrošināšana galvenā servera gadījumā. neveiksme.

Šajā posmā tika noteikts izmantoto tehnoloģiju kopums:

  • PostgreSQL kā DBVS
  • Patroni kā klasterizācijas risinājums
  • etcd kā Patroni izplatītā krātuve
  • HAproxy, lai organizētu vienotu ievades punktu lietojumprogrammām, izmantojot datu bāzi

Uzstādīšana

Jūsu uzmanībai - ļoti pieejama PostgreSQL klastera izveide, izmantojot Patroni, etcd, HAProxy.

Visas darbības tika veiktas virtuālajās mašīnās ar instalētu Debian 10 OS.

utt

Es neiesaku instalēt etcd tajās pašās mašīnās, kur atradīsies patroni un postgresql, jo diska slodze ir ļoti svarīga etcd. Bet izglītības nolūkos mēs to darīsim.
Instalēsim etcd.

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

Pievienojiet saturu failam /etc/default/etcd

[biedrs]

ETCD_NAME=datanode1 # jūsu mašīnas resursdatora nosaukums
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

VISĀM IP ADRESĒM JĀBŪT DERĪGAS. LISTER PEER, CLIENT utt.

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # jūsu automašīnas adrese
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # jūsu automašīnas adrese

[kopa]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # jūsu automašīnas adrese
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # visu mašīnu adreses etcd klasterī
ETCD_INITIAL_CLUSTER_STATE="jauns"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # jūsu automašīnas adrese

Palaidiet komandu

systemctl restart etcd

PostgreSQL 9.6 un patroni

Pirmā lieta, kas jums jādara, ir iestatīt trīs virtuālās mašīnas, lai tajās instalētu nepieciešamo programmatūru. Pēc mašīnu instalēšanas, ja sekojat manai apmācībai, varat palaist šo vienkāršo skriptu, kas (gandrīz) izdarīs visu jūsu vietā. Darbojas kā root.

Lūdzu, ņemiet vērā, ka skripts izmanto PostgreSQL versiju 9.6, tas ir saistīts ar mūsu uzņēmuma iekšējām prasībām. Risinājums nav pārbaudīts citās PostgreSQL versijās.

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

Tālāk tikko izveidotajā /etc/patroni.yml failā ir jāievieto šāds saturs, protams, visās vietās mainot IP adreses uz jūsu izmantotajām adresēm.
Pievērsiet uzmanību komentāriem šajā yaml. Mainiet adreses uz savu katrā klastera mašīnā.

/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

Skripts ir jāpalaiž visās trīs klastera iekārtās, un iepriekš minētā konfigurācija ir jāievieto arī /etc/patroni.yml failā visās iekārtās.

Kad esat pabeidzis šīs darbības visās klastera mašīnās, palaidiet šo komandu jebkurā no tām

systemctl start patroni
systemctl start postgresql

Uzgaidiet apmēram 30 sekundes, pēc tam palaidiet šo komandu pārējām iekārtām klasterī.

HAproxy

Mēs izmantojam brīnišķīgo HAproxy, lai nodrošinātu vienu ieejas punktu. Galvenais serveris vienmēr būs pieejams tās iekārtas adresē, kurā ir izvietots HAproxy.

Lai mašīna ar HAproxy nekļūtu par vienu atteices punktu, mēs to palaidīsim Docker konteinerā; nākotnē to varēs palaist K8 klasterī un padarīt mūsu kļūmjpārlēces kopu vēl uzticamāku.

Izveidojiet direktoriju, kurā varat glabāt divus failus - Dockerfile un haproxy.cfg. Iet uz 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

Esiet piesardzīgs, pēdējās trīs faila haproxy.cfg rindās ir jānorāda jūsu datoru adreses. HAproxy sazināsies ar Patroni, HTTP galvenēs galvenais serveris vienmēr atgriezīs 200, bet replika vienmēr atgriezīs 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

Atrodoties direktorijā, kurā “guļ” abi mūsu faili, secīgi izpildīsim komandas konteinera iepakošanai, kā arī tā palaišanai ar nepieciešamo portu pārsūtīšanu:

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

Tagad, pārlūkprogrammā atverot datora adresi, izmantojot HAproxy, un norādot portu 7000, jūs redzēsit klastera statistiku.

Serveris, kas ir galvenais, būs UP stāvoklī, un kopijas būs DOWN stāvoklī. Tas ir normāli, patiesībā tie darbojas, taču tie parādās šādi, jo tie atgriež 503 par pieprasījumiem no HAproxy. Tas ļauj mums vienmēr precīzi zināt, kurš no trim serveriem ir pašreizējais galvenais.

Secinājums

Tu esi krāšņs! Tikai 30 minūšu laikā esat izvietojis izcilu kļūdu izturīgu un augstas veiktspējas datu bāzes kopu ar straumēšanas replikāciju un automātisku atkāpšanos. Ja plānojat izmantot šo risinājumu, pārbaudiet ar oficiālo Patroni dokumentāciju, un jo īpaši tā daļa, kas attiecas uz patronictl utilītu, kas nodrošina ērtu piekļuvi jūsu klastera pārvaldībai.

Apsveicam!

Avots: www.habr.com

Pievieno komentāru