ProHoster > Blog > administratë > Ndërtimi i një grupi PostgreSQL shumë të disponueshëm duke përdorur Patroni, etcd, HAProxy
Ndërtimi i një grupi PostgreSQL shumë të disponueshëm duke përdorur Patroni, etcd, HAProxy
Thjesht ndodhi që në kohën kur u shtrua problemi, unë nuk kisha përvojë të mjaftueshme për të zhvilluar dhe nisur vetëm këtë zgjidhje. Dhe pastaj fillova të google-oja.
Nuk e di se çfarë është kapja, por për të disatën herë jam përballur me faktin që edhe nëse bëj gjithçka hap pas hapi si në tutorial, përgatit të njëjtin mjedis si autori, atëherë asgjë nuk funksionon. Nuk e kam idenë se çfarë është çështja, por kur e hasa përsëri këtë, vendosa që do të shkruaj tutorialin tim kur gjithçka të funksionojë. Një që patjetër do të funksionojë.
Udhëzues në internet
Ndodh që interneti të mos vuajë nga mungesa e udhëzuesve të ndryshëm, tutorialeve, hap pas hapi e të ngjashme. Kështu ndodhi që unë u ngarkova me zhvillimin e një zgjidhjeje për organizimin dhe ndërtimin e një grupi të zhgënjyer PostgreSQL, kërkesat kryesore për të cilat ishin riprodhimi i transmetimit nga serveri Master në të gjitha kopjet dhe sigurimi automatik i një rezerve në rast të një serveri Master. dështimi.
Në këtë fazë, u përcaktua grupi i teknologjive të përdorura:
HAproxy për organizimin e një pike të vetme hyrëse për aplikacionet që përdorin bazën e të dhënave
Instalim
Për vëmendjen tuaj - ndërtimi i një grupi PostgreSQL shumë të disponueshëm duke përdorur Patroni, etcd, HAProxy.
Të gjitha operacionet u kryen në makina virtuale me Debian 10 OS të instaluar.
etj
Unë nuk rekomandoj instalimin e etcd në të njëjtat makina ku do të vendosen patroni dhe postgresql, pasi ngarkesa e diskut është shumë e rëndësishme për etcd. Por për qëllime edukative, ne do të bëjmë pikërisht këtë.
Le të instalojmë etjd.
#!/bin/bash
apt-get update
apt-get install etcd
Shtoni përmbajtje në skedarin /etc/default/etcd
[anëtar]
ETCD_NAME=datanode1 # emri i hostit të kompjuterit tuaj
ETCD_DATA_DIR=”/var/lib/etcd/default.etcd”
TE GJITHA ADRESAT IP DUHET TE JENE VLEFSHME. LISTER PEER, KLIENTI etj DUHET TË CAKTOHET NË ADRESA IP të HOST
Gjëja e parë që duhet të bëni është të vendosni tre makina virtuale për të instaluar softuerin e nevojshëm në to. Pas instalimit të makinave, nëse ndiqni tutorialin tim, mund të ekzekutoni këtë skript të thjeshtë që (pothuajse) do të bëjë gjithçka për ju. Punon si rrënjë.
Ju lutemi vini re se skripti përdor versionin 9.6 të PostgreSQL, kjo është për shkak të kërkesave të brendshme të kompanisë sonë. Zgjidhja nuk është testuar në versionet e tjera të PostgreSQL.
Më pas, në skedarin /etc/patroni.yml që sapo keni krijuar, duhet të vendosni përmbajtjet e mëposhtme, natyrisht duke ndryshuar adresat IP në të gjitha vendet në adresat që përdorni.
Kushtojini vëmendje komenteve në këtë yaml. Ndryshoni adresat në adresat tuaja në secilën makinë në grup.
/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
Skripti duhet të ekzekutohet në të tre makinat e grupit dhe konfigurimi i mësipërm duhet të vendoset gjithashtu në skedarin /etc/patroni.yml në të gjitha makinat.
Pasi të keni përfunduar këto operacione në të gjitha makinat në grup, ekzekutoni komandën e mëposhtme në secilën prej tyre
Prisni rreth 30 sekonda, pastaj ekzekutoni këtë komandë në makinat e mbetura në grup.
HAproxy
Ne përdorim HAproxy-in e mrekullueshëm për të siguruar një pikë të vetme hyrjeje. Serveri kryesor do të jetë gjithmonë i disponueshëm në adresën e makinës në të cilën është vendosur HAproxy.
Për të mos e bërë makinën me HAproxy një pikë të vetme dështimi, ne do ta lëshojmë atë në një kontejner Docker; në të ardhmen ajo mund të lëshohet në grupin e K8 dhe ta bëjë grupin tonë të dështimit edhe më të besueshëm.
Krijoni një direktori ku mund të ruani dy skedarë - Dockerfile dhe haproxy.cfg. Shkoni tek ajo.
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
Kini kujdes, tre rreshtat e fundit të skedarit haproxy.cfg duhet të listojnë adresat e makinerive tuaja. HAproxy do të kontaktojë Patroni, në kokat e HTTP serveri kryesor do të kthejë gjithmonë 200 dhe kopja do të kthejë gjithmonë 503.
haproksi.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
Duke qenë në drejtorinë në të cilën të dy skedarët tanë "shtrihen", le të ekzekutojmë në mënyrë sekuenciale komandat për paketimin e kontejnerit, si dhe ta lëshojmë atë me përcjelljen e portave të nevojshme:
Tani, duke hapur adresën e kompjuterit tuaj me HAproxy në shfletues dhe duke specifikuar portin 7000, do të shihni statistika në grupin tuaj.
Serveri që është master do të jetë në gjendjen UP, dhe kopjet do të jenë në gjendjen DOWN. Kjo është normale, në fakt funksionojnë, por shfaqen kështu sepse kthejnë 503 për kërkesat nga HAproxy. Kjo na lejon të dimë gjithmonë saktësisht se cili nga tre serverët është masteri aktual.
Përfundim
Ju jeni i mrekullueshëm! Në vetëm 30 minuta ju keni vendosur një grup bazë të dhënash të shkëlqyera tolerante ndaj gabimeve dhe me performancë të lartë me përsëritje të transmetimit dhe rikthim automatik. Nëse po planifikoni të përdorni këtë zgjidhje, shikoni me dokumentacion zyrtar Patroni, dhe veçanërisht me pjesën e tij në lidhje me shërbimin patronictl, i cili ofron akses të përshtatshëm për menaxhimin e grupit tuaj.