Patroni, etcd, HAProxy yordamida yuqori darajada mavjud PostgreSQL klasterini yaratish

Shunday bo'ldiki, muammo paydo bo'lgan paytda menda ushbu echimni ishlab chiqish va ishga tushirish uchun etarli tajriba yo'q edi. Va keyin men Googlingni boshladim.

Tushunish nima ekanligini bilmayman, lekin o'n ikkinchi marta men hamma narsani o'quv qo'llanmadagi kabi bosqichma-bosqich bajarsam ham, muallif bilan bir xil muhitni tayyorlasam ham, hech narsa ishlamasligiga duch keldim. Nima bo'lganini bilmayman, lekin men bunga yana duch kelganimda, hamma narsa yaxshi bo'lganda, o'zimning darslikimni yozishga qaror qildim. Bu, albatta, ishlaydi.

Internetda qo'llanmalar

Shunday bo'ladiki, Internet turli xil qo'llanmalar, qo'llanmalar, bosqichma-bosqich va shunga o'xshash narsalar etishmasligidan aziyat chekmaydi. Shunday bo'ldiki, menga PostgreSQL klasterini qulay tarzda tashkil etish va qurish bo'yicha yechim ishlab chiqish vazifasi qo'yildi, uning asosiy talablari Master serverdan barcha replikalarga oqimli replikatsiya va Master server bo'lgan taqdirda zaxirani avtomatik ravishda ta'minlash edi. muvaffaqiyatsizlik.

Ushbu bosqichda ishlatiladigan texnologiyalar to'plami aniqlandi:

  • PostgreSQL ma'lumotlar bazasi sifatida
  • Patroni klasterlash yechimi sifatida
  • etcd Patroni uchun taqsimlangan saqlash sifatida
  • Ma'lumotlar bazasidan foydalangan holda ilovalar uchun yagona kirish nuqtasini tashkil qilish uchun HAproxy

sozlama

Sizning e'tiboringizga - Patroni, etcd, HAProxy-dan foydalangan holda yuqori darajada mavjud PostgreSQL klasterini yaratish.

Barcha operatsiyalar Debian 10 OS o'rnatilgan virtual mashinalarda amalga oshirildi.

va boshqalar

Men etcd ni patroni va postgresql joylashgan bir xil mashinalarga o'rnatishni tavsiya etmayman, chunki disk yuki etcd uchun juda muhim. Ammo ta'lim maqsadlarida biz buni qilamiz.
Keling, etcd ni o'rnatamiz.

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

/etc/default/etcd fayliga tarkib qo'shing

[a'zo]

ETCD_NAME=datanode1 # kompyuteringizning xost nomi
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”

HAMMA IP MANZILLAR TO'ROQ BO'LISHI KERAK. LISTER PEER, CLIENT va h.k.lar XOST IP MANZILGA O'RNATILISHI KERAK

ETCD_LISTEN_PEER_URLS=""http://192.168.0.143:2380» # mashinangiz manzili
ETCD_LISTEN_CLIENT_URLS=""http://192.168.0.143:2379,http://127.0.0.1:2379» # mashinangiz manzili

[klaster]

ETCD_INITIAL_ADVERTISE_PEER_URLS=""http://192.168.0.143:2380» # mashinangiz manzili
ETCD_INITIAL_CLUSTER=»datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380» etcd klasteridagi barcha mashinalarning # manzillari
ETCD_INITIAL_CLUSTER_STATE="yangi"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS=""http://192.168.0.143:2379» # mashinangiz manzili

Buyruqni bajaring

systemctl restart etcd

PostgreSQL 9.6 + patroni

Siz qilishingiz kerak bo'lgan birinchi narsa, ularga kerakli dasturiy ta'minotni o'rnatish uchun uchta virtual mashinani o'rnatishdir. Mashinalarni o'rnatganingizdan so'ng, agar siz mening qo'llanmamga amal qilsangiz, siz (deyarli) siz uchun hamma narsani bajaradigan ushbu oddiy skriptni ishga tushirishingiz mumkin. Ildiz sifatida ishlaydi.

E'tibor bering, skript PostgreSQL 9.6 versiyasidan foydalanadi, bu bizning kompaniyamizning ichki talablari bilan bog'liq. Yechim PostgreSQL ning boshqa versiyalarida sinovdan o‘tkazilmagan.

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

Keyinchalik, siz yaratgan /etc/patroni.yml faylida quyidagi tarkibni joylashtirishingiz kerak, albatta, barcha joylarda IP manzillarni siz foydalanadigan manzillarga o'zgartiring.
Ushbu yamldagi izohlarga e'tibor bering. Klasterdagi har bir mashinada manzillarni o'zingizga o'zgartiring.

/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

Skript klasterning barcha uchta mashinasida ishga tushirilishi kerak va yuqoridagi konfiguratsiya ham barcha mashinalarda /etc/patroni.yml fayliga joylashtirilishi kerak.

Klasterdagi barcha mashinalarda ushbu operatsiyalarni bajarganingizdan so'ng, ulardan biron birida quyidagi buyruqni bajaring

systemctl start patroni
systemctl start postgresql

Taxminan 30 soniya kuting, so'ngra ushbu buyruqni klasterdagi qolgan mashinalarda bajaring.

HAproksi

Biz bitta kirish nuqtasini ta'minlash uchun ajoyib HAproxy-dan foydalanamiz. Asosiy server har doim HAproxy o'rnatilgan mashina manzilida mavjud bo'ladi.

HAproxy bilan ishlaydigan mashinani bitta nosozlik nuqtasiga aylantirmaslik uchun biz uni Docker konteynerida ishga tushiramiz; kelajakda u K8 klasterida ishga tushirilishi mumkin va bizning muvaffaqiyatsiz klasterimizni yanada ishonchli qiladi.

Ikkita faylni saqlashingiz mumkin bo'lgan katalog yarating - Dockerfile va haproxy.cfg. Unga boring.

Docker fayli

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

Ehtiyot bo'ling, haproxy.cfg faylining oxirgi uchta satrida mashinalaringiz manzillari ko'rsatilishi kerak. HAproxy Patroni bilan bog'lanadi, HTTP sarlavhalarida asosiy server har doim 200 ni qaytaradi va replika har doim 503 ni qaytaradi.

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

Ikkala faylimiz "yotadigan" katalogda bo'lgan holda, keling, konteynerni qadoqlash buyruqlarini ketma-ket bajaramiz, shuningdek, kerakli portlarni yo'naltirish bilan ishga tushiramiz:

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

Endi brauzerda HAproxy yordamida kompyuteringiz manzilini ochib, 7000 portini ko'rsatsangiz, klasteringizdagi statistikani ko'rasiz.

Usta bo'lgan server UP holatida bo'ladi va replikalar DOWN holatida bo'ladi. Bu normal holat, aslida ular ishlaydi, lekin ular shunday ko'rinadi, chunki ular HAproxy so'rovlari uchun 503 ni qaytaradilar. Bu bizga har doim uchta serverdan qaysi biri joriy master ekanligini aniq bilish imkonini beradi.

xulosa

Siz ajoyibsiz! Atigi 30 daqiqada siz oqimli replikatsiya va avtomatik qayta tiklash bilan mukammal xatoga chidamli va yuqori samarali ma'lumotlar bazasi klasterini o'rnatdingiz. Agar siz ushbu yechimdan foydalanishni rejalashtirmoqchi bo'lsangiz, tekshiring rasmiy Patroni hujjatlari bilan, va ayniqsa, klasteringizni boshqarish uchun qulay foydalanish imkonini beruvchi patronictl yordam dasturiga tegishli qismi bilan.

Tabriklaymiz!

Manba: www.habr.com

a Izoh qo'shish