Pagbuo ng isang mataas na magagamit na PostgreSQL cluster gamit ang Patroni, etcd, HAProxy

Nagkataon lamang na sa oras na ang problema ay iniharap, wala akong sapat na karanasan upang bumuo at maglunsad ng solusyon na ito nang mag-isa. At pagkatapos ay sinimulan ko ang Googling.

Hindi ko alam kung ano ang catch, ngunit sa ikalabing pagkakataon ay nahaharap ako sa katotohanan na kahit na gawin ko ang lahat ng hakbang-hakbang tulad ng sa tutorial, ihanda ang parehong kapaligiran bilang ang may-akda, at pagkatapos ay walang gumagana. Wala akong ideya kung ano ang problema, ngunit nang makatagpo ko ito muli, nagpasya akong susulat ako ng sarili kong tutorial kapag maayos na ang lahat. Isa na tiyak na gagana.

Mga gabay sa Internet

Nagkataon lamang na ang Internet ay hindi nagdurusa sa kakulangan ng iba't ibang mga gabay, tutorial, hakbang-hakbang at iba pa. Nagkataon lang na ako ay naatasan sa pagbuo ng isang solusyon para sa maginhawang pag-aayos at pagbuo ng isang failover na PostgreSQL cluster, ang mga pangunahing kinakailangan kung saan ay ang pag-stream ng pagtitiklop mula sa Master server sa lahat ng mga replika at awtomatikong paglalaan ng isang reserba kung sakaling magkaroon ng isang Master server kabiguan.

Sa yugtong ito, natukoy ang stack ng mga teknolohiyang ginamit:

  • PostgreSQL bilang isang DBMS
  • Patroni bilang isang clustering solution
  • etcd bilang ibinahagi na imbakan para sa Patroni
  • HAproxy para sa pag-aayos ng isang entry point para sa mga application gamit ang database

Instalasyon

Para sa iyong pansin - pagbuo ng isang mataas na magagamit na PostgreSQL cluster gamit ang Patroni, etcd, HAProxy.

Ang lahat ng mga operasyon ay isinagawa sa mga virtual machine na may naka-install na Debian 10 OS.

atbp

Hindi ko inirerekumenda ang pag-install ng etcd sa parehong mga makina kung saan matatagpuan ang patroni at postgresql, dahil ang disk load ay napakahalaga para sa etcd. Ngunit para sa mga layuning pang-edukasyon, gagawin namin iyon.
I-install natin etcd.

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

Magdagdag ng nilalaman sa /etc/default/etcd file

[miyembro]

ETCD_NAME=datanode1 # hostname ng iyong machine
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

DAPAT VALID ANG LAHAT NG IP ADDRESS. ANG LISTER PEER, CLIENT etc AY DAPAT I-SET SA IP ADDRESS NG HOST

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380» # address ng iyong sasakyan
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379» # address ng iyong sasakyan

[cluster]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380» # address ng iyong sasakyan
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» # na address ng lahat ng machine sa etcd cluster
ETCD_INITIAL_CLUSTER_STATE="bago"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379» # address ng iyong sasakyan

Isagawa ang utos

systemctl restart etcd

PostgreSQL 9.6 + patroni

Ang unang bagay na kailangan mong gawin ay mag-set up ng tatlong virtual machine upang mai-install ang kinakailangang software sa kanila. Pagkatapos i-install ang mga makina, kung susundin mo ang aking tutorial, maaari mong patakbuhin ang simpleng script na ito na (halos) gagawin ang lahat para sa iyo. Tumatakbo bilang ugat.

Pakitandaan na ang script ay gumagamit ng PostgreSQL na bersyon 9.6, ito ay dahil sa mga panloob na kinakailangan ng aming kumpanya. Ang solusyon ay hindi pa nasubok sa ibang mga bersyon ng 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

Susunod, sa /etc/patroni.yml file na kakagawa mo lang, kailangan mong ilagay ang mga sumusunod na nilalaman, siyempre papalitan ang mga IP address sa lahat ng lugar sa mga address na iyong ginagamit.
Bigyang-pansin ang mga komento sa yaml na ito. Baguhin ang mga address sa iyong sarili sa bawat makina sa cluster.

/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

Dapat na tumakbo ang script sa lahat ng tatlong machine ng cluster, at dapat ding ilagay ang configuration sa itaas sa /etc/patroni.yml file sa lahat ng machine.

Kapag nakumpleto mo na ang mga operasyong ito sa lahat ng machine sa cluster, patakbuhin ang sumusunod na command sa alinman sa mga ito

systemctl start patroni
systemctl start postgresql

Maghintay ng mga 30 segundo, pagkatapos ay patakbuhin ang command na ito sa natitirang mga machine sa cluster.

HAproxy

Ginagamit namin ang kahanga-hangang HAproxy upang magbigay ng isang punto ng pagpasok. Palaging available ang master server sa address ng machine kung saan naka-deploy ang HAproxy.

Upang hindi gawing isang punto ng pagkabigo ang makina na may HAproxy, ilulunsad namin ito sa isang Docker container; sa hinaharap maaari itong ilunsad sa cluster ng K8 at gawing mas maaasahan ang aming failover cluster.

Gumawa ng direktoryo kung saan maaari kang mag-imbak ng dalawang file - Dockerfile at haproxy.cfg. Puntahan mo.

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

Mag-ingat, ang huling tatlong linya ng haproxy.cfg file ay dapat maglista ng mga address ng iyong mga machine. Makikipag-ugnayan ang HAproxy kay Patroni, sa mga header ng HTTP ang master server ay palaging magbabalik ng 200, at ang replica ay palaging magbabalik ng 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

Dahil nasa direktoryo kung saan "nagsisinungaling" ang pareho nating mga file, isagawa natin nang sunud-sunod ang mga utos para sa pag-impake ng lalagyan, pati na rin ang paglulunsad nito sa pagpapasa ng mga kinakailangang port:

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

Ngayon, sa pamamagitan ng pagbubukas ng address ng iyong machine gamit ang HAproxy sa browser at pagtukoy ng port 7000, makikita mo ang mga istatistika sa iyong cluster.

Ang server na master ay nasa UP state, at ang mga replicas ay nasa DOWN state. Ito ay normal, sa katunayan gumagana sila, ngunit lumilitaw ang mga ito sa ganitong paraan dahil ibinabalik nila ang 503 para sa mga kahilingan mula sa HAproxy. Nagbibigay-daan ito sa amin na laging malaman kung alin sa tatlong server ang kasalukuyang master.

Konklusyon

Ikaw ay maganda! Sa loob lang ng 30 minuto, nakapag-deploy ka na ng napakahusay na fault-tolerant at high-performance na database cluster na may streaming replication at awtomatikong fallback. Kung pinaplano mong gamitin ang solusyon na ito, tingnan na may opisyal na dokumentasyon ng Patroni, at lalo na sa bahagi nito hinggil sa patronictl utility, na nagbibigay ng maginhawang access sa pamamahala sa iyong cluster.

Binabati kita!

Pinagmulan: www.habr.com

Magdagdag ng komento