ProHoster > Blog > Ma'muriyat > Patroni, etcd, HAProxy yordamida yuqori darajada mavjud PostgreSQL klasterini yaratish
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:
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
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.
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
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:
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.