Ġara li fiż-żmien li nqalgħet il-problema, ma kellix biżżejjed esperjenza biex niżviluppa u nniedi din is-soluzzjoni waħdi. U mbagħad bdejt niddejjaq fuq Google.
Ma nafx x'inhi l-qabda, iżda għall-engħa darba qed niffaċċja l-fatt li anke jekk nagħmel kollox pass pass bħal fit-tutorja, nipprepara l-istess ambjent bħall-awtur, allura qatt ma jaħdem xejn. M'għandi l-ebda idea x'inhi l-kwistjoni, imma meta erġajt iltqajt ma' dan, iddeċidejt li nikteb it-tutorja tiegħi stess meta kollox jaħdem. Waħda li żgur taħdem.
Gwidi fuq l-Internet
Jiġri li l-Internet ma jbatix minn nuqqas ta 'diversi gwidi, tutorials, pass pass u simili. Ġara li jien kont inkarigat li niżviluppa soluzzjoni biex norganizza u nibni b’mod konvenjenti cluster PostgreSQL ta’ failover, li r-rekwiżiti ewlenin tagħhom kienu streaming replikazzjoni mis-server Master għar-repliki kollha u forniment awtomatiku ta’ riserva fil-każ ta’ server Master. falliment.
F'dan l-istadju, ġie determinat il-munzell ta 'teknoloġiji użati:
- PostgreSQL bħala DBMS
- bħala soluzzjoni ta' raggruppament
- etcd bħala ħażna mqassma għal Patroni
- HAproxy għall-organizzazzjoni ta' punt ta' dħul wieħed għall-applikazzjonijiet li jużaw id-database
Installazzjoni
Għall-attenzjoni tiegħek - bini ta 'cluster PostgreSQL disponibbli ħafna bl-użu ta' Patroni, etcd, HAProxy.
Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.
eċċd
Ma nirrakkomandax li ninstalla etcd fuq l-istess magni fejn se jkunu jinsabu patroni u postgresql, peress li t-tagħbija tad-disk hija importanti ħafna għal etcd. Iżda għal skopijiet edukattivi, aħna se nagħmlu dan.
Ejja ninstallaw etcd.
#!/bin/bash
apt-get update
apt-get install etcdŻid il-kontenut fil-fajl /etc/default/etcd
[Membru]
ETCD_NAME=datanode1 # hostname tal-magna tiegħek
ETCD_DATA_DIR="/var/lib/etcd/default.etcd”
L-INDIRIZZI IP KOLLHA GĦANDHOM IKUNU VALIDI. LISTER PEER, KLIJENT eċċ GĦANDHOM JIĠI FISSAT GĦAL INDIRIZZ IP TAL-Ospitanti
ETCD_LISTEN_PEER_URLS="» # indirizz tal-karozza tiegħek
ETCD_LISTEN_CLIENT_URLS="» # indirizz tal-karozza tiegħek
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="» # indirizz tal-karozza tiegħek
ETCD_INITIAL_CLUSTER=»datanode1=» # indirizzi tal-magni kollha fil-cluster etcd
ETCD_INITIAL_CLUSTER_STATE="ġdid"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="» # indirizz tal-karozza tiegħek
Mexxi l-kmand
systemctl restart etcdPostgreSQL 9.6 + patroni
L-ewwel ħaġa li trid tagħmel hu li twaqqaf tliet magni virtwali biex tinstalla s-softwer meħtieġ fuqhom. Wara li tinstalla l-magni, jekk issegwi t-tutorja tiegħi, tista 'tmexxi dan l-iskrittura sempliċi li (kważi) tagħmel kollox għalik. Runs bħala għerq.
Jekk jogħġbok innota li l-iskrittura juża PostgreSQL verżjoni 9.6, dan huwa dovut għar-rekwiżiti interni tal-kumpanija tagħna. Is-soluzzjoni ma ġietx ittestjata fuq verżjonijiet oħra ta '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.ymlSussegwentement, fil-fajl /etc/patroni.yml li għadek kif ħoloq, għandek bżonn tpoġġi l-kontenut li ġej, ovvjament tibdel l-indirizzi IP fil-postijiet kollha għall-indirizzi li tuża.
Oqgħod attent għall-kummenti f'dan il-yaml. Ibdel l-indirizzi għal tiegħek fuq kull magna fil-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: falseL-iskript għandu jitħaddem fuq it-tliet magni tal-cluster, u l-konfigurazzjoni ta 'hawn fuq trid titqiegħed ukoll fil-fajl /etc/patroni.yml fuq il-magni kollha.
Ladarba tkun lestejt dawn l-operazzjonijiet fuq il-magni kollha fil-cluster, mexxi l-kmand li ġej fuq kwalunkwe waħda minnhom
systemctl start patroni
systemctl start postgresqlStenna madwar 30 sekonda, imbagħad ħaddem dan il-kmand fuq il-magni li jifdal fil-cluster.
HAproxy
Aħna nużaw l-HAproxy mill-isbaħ biex nipprovdu punt wieħed tad-dħul. Is-server prinċipali dejjem ikun disponibbli fl-indirizz tal-magna li fuqha jiġi skjerat HAproxy.
Sabiex il-magna b'HAproxy ma tagħmilx punt wieħed ta' falliment, aħna se nnieduha f'kontenitur Docker; fil-futur tista 'tiġi mnedija fil-cluster tal-K8 u tagħmel il-cluster ta' failover tagħna saħansitra aktar affidabbli.
Oħloq direttorju fejn tista' taħżen żewġ fajls - Dockerfile u haproxy.cfg. Mur għaliha.
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.logOqgħod attent, l-aħħar tliet linji tal-fajl haproxy.cfg għandhom jelenkaw l-indirizzi tal-magni tiegħek. HAproxy se jikkuntattja lil Patroni, fl-intestaturi HTTP is-server prinċipali dejjem se jirritorna 200, u r-replika dejjem se jirritorna 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
Peress li tkun fid-direttorju li fih iż-żewġ fajls tagħna "jimteddu", ejja nwettqu b'mod sekwenzjali l-kmandi għall-ippakkjar tal-kontenitur, kif ukoll innieduh bit-trażmissjoni tal-portijiet meħtieġa:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Issa, billi tiftaħ l-indirizz tal-magna tiegħek b'HAproxy fil-browser u tispeċifika l-port 7000, se tara statistika dwar il-cluster tiegħek.
Is-server li huwa l-kaptan se jkun fl-istat UP, u r-repliki se jkunu fl-istat DOWN. Dan huwa normali, fil-fatt jaħdmu, iżda jidhru b'dan il-mod għax jirritornaw 503 għal talbiet minn HAproxy. Dan jippermettilna dejjem inkunu nafu eżattament liema mit-tliet servers huwa l-kaptan attwali.
Konklużjoni
Inti sabiħ ħafna! Fi 30 minuta biss użajt raggruppament ta 'databases eċċellenti tolleranti għall-ħsarat u ta' prestazzjoni għolja b'replikazzjoni ta' streaming u fallback awtomatiku. Jekk qed tippjana li tuża din is-soluzzjoni, iċċekkja , u speċjalment bil-parti tagħha li tikkonċerna l-utilità patronictl, li tipprovdi aċċess konvenjenti għall-ġestjoni tal-cluster tiegħek.
Prosit!
Sors: www.habr.com
