Ho aha sehlopha se fumanehang haholo sa PostgreSQL ho sebelisa Patroni, etcd, HAProxy

Ho ile ha etsahala hore nakong eo bothata bo neng bo hlahisoa, ke ne ke se na phihlelo e lekaneng ea ho hlahisa le ho qala tharollo ena feela. Eaba ke qala Google.

Ha ke tsebe hore na ho tšoasa ke eng, empa ka nako ea leshome le metso e 'meli ke tobane le taba ea hore le haeba ke etsa ntho e' ngoe le e 'ngoe mohato ka mohato joaloka thutong, ke lokisetsa tikoloho e tšoanang le ea mongoli, joale ha ho letho le kileng la sebetsa. Ha ke tsebe hore na bothata ke eng, empa ha ke kopana le sena hape, ke ile ka etsa qeto ea hore ke tla ngola thuto ea ka ha tsohle li sebetsa. E 'ngoe e tla sebetsa ka sebele.

Litataiso ho Marang-rang

Hoa etsahala hore Marang-rang ha a utloe bohloko ka lebaka la khaello ea litataiso tse fapaneng, lithupelo, mohato ka mohato le tse ling tse joalo. Ho ile ha etsahala hore ke be le mosebetsi oa ho hlahisa tharollo bakeng sa ho hlophisa le ho haha ​​​​sehlopha sa failover PostgreSQL, litlhoko tse ka sehloohong tseo e neng e le ho pheta-pheta ho tloha ho seva sa Master ho ea ho likopi tsohle le ho fana ka sebaka sa polokelo ka mokhoa o itekanetseng ha ho ka ba le seva sa Master. ho hloleha.

Tabeng ena, palo ea lisebelisoa tsa thekenoloji e ile ea khethoa:

  • PostgreSQL joalo ka DBMS
  • Patroni e le tharollo ea lihlopha
  • etcd joalo ka polokelo e abiloeng bakeng sa Patroni
  • HAproxy bakeng sa ho hlophisa sebaka se le seng sa ho kena bakeng sa lits'ebetso tse sebelisang database

bophirima

Bakeng sa tlhokomelo ea hau - ho haha ​​​​sehlopha sa PostgreSQL se fumanehang haholo u sebelisa Patroni, etcd, HAProxy.

Lits'ebetso tsohle li entsoe ka mechini ea sebele e kentsoeng Debian 10 OS.

jj

Ha ke khothaletse ho kenya etcd mechine e tšoanang moo patroni le postgresql li tla ba teng, kaha disk load e bohlokoa haholo bakeng sa joalo-joalo. Empa bakeng sa merero ea thuto, re tla etsa sona seo.
Ha re kenyeng etcd.

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

Kenya litaba ho file ea /etc/default/etcd

[setho]

ETCD_NAME=datanode1 # lebitso la moamoheli la mochini oa hau
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

LIADDRESS TSOHLE tsa IP li TŠOANELE HO SEBELISA. LISTER PEER, CLIENT jj E LOKELA HO BEWA HO IP ADDRESS OF HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # aterese ea koloi ea hau
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # aterese ea koloi ea hau

[sehlopha]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # aterese ea koloi ea hau
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # liaterese tsa mechini eohle sehlopheng sa etcd
ETCD_INITIAL_CLUSTER_STATE="ncha"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # aterese ea koloi ea hau

Matha taelo

systemctl restart etcd

PostgreSQL 9.6 + patroni

Ntho ea pele eo u lokelang ho e etsa ke ho theha mechine e meraro ea sebele ho kenya software e hlokahalang ho eona. Ka mor'a ho kenya mechine, haeba u latela thuto ea ka, u ka tsamaisa script ena e bonolo e tla (hoo e ka bang) e tla u etsetsa ntho e 'ngoe le e' ngoe. E matha joalo ka motso.

Ka kopo hlokomela hore script e sebelisa PostgreSQL version 9.6, sena se bakoa ke litlhoko tsa ka hare tsa k'hamphani ea rona. Tharollo ha e so lekoe liphetolelong tse ling tsa 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

Ka mor'a moo, faeleng ea /etc/patroni.yml eo u sa tsoa e etsa, u lokela ho beha litaba tse latelang, ho hlakile hore u fetola liaterese tsa IP libakeng tsohle ho ea ho liaterese tseo u li sebelisang.
Ela hloko maikutlo a ho yaml ena. Fetola liaterese hore e be tsa hau mochining o mong le o mong o sehlopheng.

/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

Script e tlameha ho tsamaisoa ho mechine eohle e meraro ea sehlopha, 'me tlhophiso e ka holimo e tlameha ho kenngoa faeleng ea /etc/patroni.yml mechineng eohle.

Ha u se u qetile ts'ebetso ena ho mechini eohle e sehlopheng, tsamaisa taelo e latelang ho e 'ngoe ea tsona

systemctl start patroni
systemctl start postgresql

Ema metsotsoana e ka bang 30, ebe u tsamaisa taelo ena ho mechini e setseng sehlopheng.

HA proxy

Re sebelisa HAproxy e babatsehang ho fana ka ntlha e le 'ngoe ea ho kena. Seva e kholo e tla lula e le teng atereseng ea mochini oo HAproxy e sebelisoang ho oona.

E le hore re seke ra etsa mochini o nang le HAproxy ntlha e le 'ngoe ea ho hloleha, re tla o tsebisa ka sejaneng sa Docker; nakong e tlang e ka kenngoa sehlopheng sa K8 mme ea etsa hore sehlopha sa rona sa failover se tšepahale le ho feta.

Theha bukana moo u ka bolokang lifaele tse peli - Dockerfile le haproxy.cfg. E-ea ho eona.

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

Hlokomela, mela e meraro ea ho qetela ea faele ea haproxy.cfg e lokela ho thathamisa liaterese tsa mochini oa hau. HAproxy e tla ikopanya le Patroni, lihloohong tsa HTTP seva se seholo se tla lula se khutlisa 200, 'me replica e tla lula e khutlela 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

Ha re le bukeng eo lifaele tsa rona ka bobeli li "letsang," a re phetheng ka tatellano litaelo tsa ho paka setshelo, hammoho le ho e qala ka ho fetisetsa likou tse hlokahalang:

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

Joale, ka ho bula aterese ea mochini oa hau ka HAproxy ho sebatli le ho totobatsa port 7000, u tla bona lipalo-palo ho sehlopha sa hau.

Seva eo e leng eona master e tla ba maemong a UP, 'me likopi li tla ba maemong a TLASE. Sena se tloaelehile, ha e le hantle ba sebetsa, empa ba hlaha ka tsela ena hobane ba khutlisetsa 503 bakeng sa likōpo tse tsoang HAproxy. Sena se re fa monyetla oa ho tseba hantle hore na ho li-server tse tharo ke mang ea teng hona joale.

fihlela qeto e

O motle! Ka metsotso e 30 feela, u kentse sehlopha sa polokelo ea litaba se sebetsang hantle haholo se mamellang liphoso le se sebetsang hantle se nang le phetisetso ea ho phallela le ho khutlela morao. Haeba u rera ho sebelisa tharollo ena, hlahloba ka litokomane tsa semmuso tsa Patroni, mme haholo-holo ka karolo ea eona mabapi le ts'ebeliso ea patronictl, e fanang ka phihlello e bonolo ea ho laola sehlopha sa hau.

Kea u babatsa!

Source: www.habr.com

Eketsa ka tlhaloso