Adeiladu clwstwr PostgreSQL argaeledd uchel gan ddefnyddio Patroni, ac ati, HAProxy

Yn union fel y digwyddodd, ar adeg gosod y dasg, nid oedd gennyf ddigon o brofiad i ddatblygu a rhedeg y datrysiad hwn yn unig. Ac yna dechreuais googling.

Nid wyf yn gwybod beth yw'r dalfa, ond am y tro ar ddeg rwyf wedi dod ar draws y ffaith, hyd yn oed os gwnewch bopeth gam wrth gam ag yn y tiwtorial, paratowch yr un amgylchedd â'r awdur, nid yw byth yn gweithio. Does gen i ddim syniad beth sy'n bod, ond pan redais i mewn i hyn eto, penderfynais - a byddaf yn ysgrifennu fy nhiwtorial pan fydd popeth yn gweithio allan. Un a fydd yn bendant yn gweithio.

Canllawiau ar y Rhyngrwyd

Mae'n digwydd felly nad yw'r Rhyngrwyd yn dioddef o ddiffyg canllawiau amrywiol, tiwtorialau, cam wrth gam ac ati. Yn union fel y digwyddodd y cefais y dasg o ddatblygu datrysiad ar gyfer trefnu ac adeiladu clwstwr methu PostgreSQL yn gyfleus, a'r prif ofynion ar eu cyfer oedd ffrydio dyblygu o'r Prif weinydd i bob copi a wrth gefn awtomatig pan fydd y gweinydd Meistr yn methu.

Ar y cam hwn, penderfynwyd ar y pentwr o dechnolegau a ddefnyddiwyd:

  • PostgreSQL fel DBMS
  • Patroni fel ateb clystyru
  • ac ati fel storfa ddosbarthedig ar gyfer Patroni
  • HAproxy am drefnu un pwynt mynediad ar gyfer ceisiadau sy'n defnyddio'r gronfa ddata

Gosod

Eich sylw yw adeiladu clwstwr PostgreSQL argaeledd uchel gan ddefnyddio Patroni, ac ati, HAProxy.

Perfformiwyd yr holl weithrediadau ar beiriannau rhithwir gyda Debian 10 OS wedi'i osod.

etcd

Nid wyf yn argymell gosod ac ati ar yr un peiriannau lle bydd patroni a postgresql wedi'u lleoli, gan fod llwyth disg yn bwysig iawn ar gyfer ac ati. Ond at ddibenion addysgol, byddwn yn gwneud hynny.
Gosod etcd.

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

Ychwanegu cynnwys i ffeil /etc/default/etcd

[aelod]

ETCD_NAME=nod data1 # enw gwesteiwr eich peiriant
ETCD_DATA_DIR = "/var/lib/etcd/default.etcd"

DYLAI POB CYFEIRIAD IP FOD YN DDILYS. DYLID GOSOD CYFEILLION RHESTR, CLEIENT ac ati I GYFEIRIAD IP Y GWESTIWR

ETCD_LISTEN_PEER_URLS = "http://192.168.0.143:2380» # cyfeiriad eich peiriant
ETCD_LISTEN_CLIENT_URLS = "http://192.168.0.143:2379,http://127.0.0.1:2379» # cyfeiriad eich peiriant

[clwstwr]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # cyfeiriad eich peiriant
ETCD_INITIAL_CLUSTER="node data1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # cyfeiriad pob peiriant yn y clwstwr etcd
ETCD_INITIAL_CLUSTER_STATE="newydd"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-clwstwr-1"
ETCD_ADVERTISE_CLIENT_URLS = "http://192.168.0.143:2379» # cyfeiriad eich peiriant

Rhedeg y gorchymyn

systemctl restart etcd

PostgreSQL 9.6 + noddwyr

Y peth cyntaf i'w wneud yw sefydlu tri pheiriant rhithwir i osod y feddalwedd angenrheidiol arnynt. Ar ôl gosod y peiriannau, os dilynwch fy nhiwtorial, gallwch chi redeg y sgript syml hon a fydd (bron) yn gwneud popeth i chi. Yn rhedeg fel gwraidd.

Sylwch fod y sgript yn defnyddio fersiwn PostgreSQL 9.6, mae hyn oherwydd gofynion mewnol ein cwmni. Nid yw'r datrysiad wedi'i brofi ar fersiynau PostgreSQL eraill.

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

Nesaf, yn y ffeil /etc/patroni.yml rydych chi newydd ei greu, mae angen i chi roi'r cynnwys canlynol, wrth gwrs gan newid y cyfeiriadau ip ym mhob man i'r cyfeiriadau rydych chi'n eu defnyddio.
Rhowch sylw i'r sylwadau yn yr iaml hwn. Newidiwch y cyfeiriadau i'ch rhai chi, ar bob peiriant yn y clwstwr.

/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

Rhaid rhedeg y sgript ar y tri pheiriant yn y clwstwr, yn union fel y mae'n rhaid gosod y ffurfweddiad uchod yn y ffeil /etc/patroni.yml ar bob peiriant.

Pan fyddwch wedi gwneud y gweithrediadau hyn ar bob peiriant clwstwr, rhedwch y gorchymyn canlynol ar unrhyw un ohonynt

systemctl start patroni
systemctl start postgresql

Arhoswch tua 30 eiliad, yna rhedeg y gorchymyn hwn ar weddill y peiriannau yn y clwstwr.

HAproxy

Rydym yn defnyddio'r HAproxy gwych i ddarparu un pwynt mynediad. Bydd y prif weinydd bob amser ar gael yng nghyfeiriad y peiriant lle mae HAproxy yn cael ei ddefnyddio.

Er mwyn peidio â gwneud y peiriant gyda HAproxy yn un pwynt methiant, byddwn yn ei redeg mewn cynhwysydd Docker, yn y dyfodol bydd yn bosibl ei redeg mewn clwstwr K8 a gwneud ein clwstwr methiant hyd yn oed yn fwy dibynadwy.

Creu cyfeiriadur lle gallwch storio dwy ffeil - Dockerfile a haproxy.cfg. Ewch i mewn iddo.

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

Byddwch yn ofalus, dylai tair llinell olaf y ffeil haproxy.cfg restru cyfeiriadau eich peiriannau. Bydd HAproxy yn cysylltu â Patroni, ym mhenawdau HTTP bydd y prif weinydd bob amser yn dychwelyd 200, a bydd y replica bob amser yn dychwelyd 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

Gan ein bod yn y cyfeiriadur y mae ein dwy ffeil yn “gorwedd ynddo”, byddwn yn gweithredu'r gorchmynion ar gyfer pacio'r cynhwysydd yn olynol, yn ogystal â'i lansio gyda'r porthladdoedd angenrheidiol a anfonwyd ymlaen:

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

Nawr, pan fyddwch chi'n agor cyfeiriad eich peiriant gyda HAproxy yn y porwr a nodi porthladd 7000, fe welwch yr ystadegau ar gyfer eich clwstwr.

Bydd y gweinydd sy'n feistr yn y cyflwr UP, a bydd y copïau yn y cyflwr I LAWR. Mae hyn yn normal, mewn gwirionedd maent yn gweithio, ond maent yn cael eu harddangos yn y ffurflen hon oherwydd eu bod yn dychwelyd 503 ar geisiadau gan HAproxy. Mae hyn yn caniatáu inni bob amser wybod yn union pa un o'r tri gweinydd yw'r meistr presennol.

Casgliad

Rwyt ti'n brydferth! Mewn dim ond 30 munud, rydych chi wedi defnyddio clwstwr cronfa ddata methiant a pherfformiad gwych gyda dyblygu ffrydio a methiant awtomatig. Os ydych chi'n bwriadu defnyddio'r datrysiad hwn, gweler gyda dogfennaeth swyddogol Patroni, ac yn enwedig gyda'i ran ynghylch y cyfleustodau nawddoglyd, sy'n darparu mynediad cyfleus i reoli'ch clwstwr.

Llongyfarchiadau!

Ffynhonnell: hab.com

Ychwanegu sylw