Így történt, hogy a feladat kiírásakor nem volt elegendő tapasztalatom ahhoz, hogy ezt a megoldást egyedül fejlesszem és elindítsam. Így hát elkezdtem keresni az interneten.
Nem tudom, mi a probléma, de már sokadszorra tapasztalom, hogy még ha lépésről lépésre követem is a tutorialt, és elkészítem ugyanazt a környezetet, mint a szerző, akkor sem működik semmi. Fogalmam sincs, mi lehet a háttérben, de amikor újra szembesültem ezzel, úgy döntöttem — írok egy saját tutorialt, amikor minden működik. Olyat, ami biztosan működik.
Internetbeli útmutatók
Így történt, hogy az internet nem szenved a különféle útmutatók, tutorialok és lépésről lépésre leírások hiányától. A feladatom az volt, hogy egy megbízható PostgreSQL klaszter megoldását fejlesszem ki, amelynek főbb követelményei a Master szerverről az összes replikára történő folytonos replikáció és a Master szerver meghibásodása esetén az automatikus váltás voltak.
Ezen a ponton meg lett határozva a használandó technológiai stack:
- PostgreSQL mint adatbázis-kezelő rendszer
- mint a klaszterezési megoldás
- etcd mint elosztott tároló a Patroni számára
- HAProxy az alkalmazások számára egységes belépési pont létrehozására, amelyek az adatbázist használják
Telepítés
Önöknek bemutatjuk a PostgreSQL magas rendelkezésre állású klaszterének felépítését Patroni, etcd, HAProxy segítségével.
Minden művelet Debian 10 rendszerű virtuális gépeken történt.
etcd
Nem ajánlom, hogy az etcd-t ugyanazon gépeken telepítsük, ahol a Patroni és PostgreSQL található, mivel az etcd számára nagyon fontos a lemezek terhelése. De oktatási célokból így fogunk eljárni.
Telepítsük az etcd-t.
#!/bin/bash
apt-get update
apt-get install etcdAdja hozzá a tartalmat a fájlhoz /etc/default/etcd
[member]
ETCD_NAME=datanode1 # a gép hostname-je
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
MINDEN IP CÍMNEK ÉRVÉNYESNEK KELL LENNIE. A LISTER PEER, CLIENT stb. AZ IP CÍMNEK A GÉPÉRE KELL BEÁLLÍTANI
ETCD_LISTEN_PEER_URLS="" # a gép címe
ETCD_LISTEN_CLIENT_URLS="" # a gép címe
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # a gép címe
ETCD_INITIAL_CLUSTER="datanode1=" # a klaszter összes gépének címei az etcd-ben
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # a gép címe
Futtassa a parancsot
systemctl restart etcdPostgreSQL 9.6 + patroni
Az első lépés, hogy három virtuális gépet állítsunk be a szükséges szoftver telepítéséhez. A gépek telepítése után, ha követi az útmutatómat, futtathatja ezt az egyszerű szkriptet, amely (majdnem) mindent elvégez Ön helyett. A root felhasználóként indítandó.
Felhívjuk figyelmét, hogy a szkript a PostgreSQL 9.6-os verzióját használja, amely a vállalatunk belső követelményeiből fakad. A megoldás nem volt tesztelve más PostgreSQL verziókon.
#!/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.ymlA most létrehozott fájlba, a /etc/patroni.yml-ba a következő tartalmat kell elhelyeznie, természetesen módosítva a címeket az Ön által használt IP-címekre minden esetben.
Felhívjuk figyelmét a YAML fájlban található megjegyzésekre. Módosítsa a címeket a sajátjaira, a klaszter minden egyes gépén.
/etc/patroni.yml
scope: pgsql # minden node-on egyenlőnek kell lennie
namespace: /cluster/ # minden node-on egyenlőnek kell lennie
name: postgres1 # minden node-on eltérőnek kell lennie
restapi:
listen: 192.168.0.143:8008 # az a node címe, ahol ez a fájl található
connect_address: 192.168.0.143:8008 # az a node címe, ahol ez a fájl található
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # itt sorolja fel az összes node-ját, ha az etcd-t ugyanott állítja be
# ez a szakasz (bootstrap) az Etcd: // /config-be kerül írásra, miután az új klaszter inicializálása megtörtént
# és minden más klasztertag ezt használja majd mint `globális konfiguráció`
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: hu_HU.UTF8
# az init pg_hba.conf-nak tartalmaznia kell az összes gép címét, amelyet a klaszterben használnak
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 # az a node címe, ahol ez a fájl található
connect_address: 192.168.0.143:5432 # az a node címe, ahol ez a fájl található
data_dir: /data/patroni # ezt a könyvtárat a fenti szkript hozza létre a megfelelő jogosultságokkal
bin_dir: /usr/lib/postgresql/9.6/bin # adja meg a postgresql könyvtárához vezető utat
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: falseA szkriptet futtatni kell minden három gépen a klaszterben, és a megadott konfigurációt be kell helyezni a /etc/patroni.yml fájlba minden gépen.
Amikor ezeket a műveleteket minden gépen elvégezte, futtassa a következő parancsot bármelyikükön
systemctl start patroni
systemctl start postgresqlVárjon körülbelül 30 másodpercet, majd futtassa ezt a parancsot a klaszter többi gépén.
HAproxy
Csodálatos HAproxy-t használunk, hogy egyetlen belépési pontot biztosítsunk. A Master szerver mindig elérhető lesz a HAproxy-t futtató gép címén.
Annak érdekében, hogy az HAproxy ne legyen egyetlen hibaértékpont, Docker konténerben indítsuk el, később K8s klaszterbe is elindítható, és így a hibatűrő klaszterünk még megbízhatóbbá válik.
Hozzon létre egy könyvtárat, ahol tárolhatja a két fájlt - Dockerfile és haproxy.cfg. Lépjen be ebbe a könyvtárba.
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.logLegyen óvatos, a haproxy.cfg fájl utolsó három sorában fel kell tüntetni a gépei címeit. Az HAproxy a Patrónira fog hivatkozni, a HTTP fejlécben a master szerver mindig 200-at fog visszaadni, míg a replika 503-at.
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
A könyvtárban, ahol a két fájlunk található, hajtsuk végre sorban a konténer csomagolására és indítására vonatkozó parancsokat, valamint a szükséges portok átirányítását:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Most, ha megnyitja a böngészőben a HAproxy-val rendelkező gépe címet és megadja a 7000-es portot, látni fogja a klaszterének statisztikáit.
Az UP állapotban az a szerver lesz, amelyik a mester, míg a replikák DOWN állapotban. Ez normális, valójában működnek, de így jelennek meg, mivel 503-at adnak vissza a HAproxy-tól érkező kérésekre. Ez lehetővé teszi számunkra, hogy mindig pontosan tudjuk, melyik három szerver a jelenlegi mester.
Zárás
Csodálatos vagy! Mindössze 30 perc alatt létrehoztál egy kiváló hibatűrő és teljesítményorientált adatbázis klasztert, amely folyamatos replikálással és automatikus hibakereséssel működik. Ha ezt a megoldást tervezed használni, nézd meg , különösen a patronictl segédeszközzel kapcsolatos részét, amely kényelmes hozzáférést biztosít a klasztered kezeléséhez.
Gratulálok!
Forrás: habr.com
