Oli nii, et ülesande seadmisel mul ei olnud piisavat kogemust, et seda lahendust üksi arendada ja käivitada. Siis hakkasin Google'it kasutama.
Ma ei tea, mis probleem on, kuid olen juba mitmeid kordi kokku puutunud sellega, et isegi kui teha kõik samamoodi nagu õpetuses, ja luua sama keskkond nagu autoril, ei toimi see kunagi. Mul on aimugi, mis siin valesti on, kuid kui ma jälle sellega kokku puutusin, otsustasin — kirjutan oma õpetuse, kui kõik õnnestub. Selline, mis kindlasti töötab.
Juhendid Internetis
Oli nii, et internet ei kannata erinevatest juhenditest, õpetustest, samm-sammult juhenditest ja muudest sellistest asjadest puudust. Oli nii, et mulle pandi ülesanne töötada välja lahendus PostgreSQLi talitluskindla klastri mugavaks korraldamiseks, mille peamised nõudmised olid voogrepplikatsioon Master-serverilt kõigile replikaatidele ja automaatne varu sisseviimine Master-serveri tõrke korral.
Sellisel etapil määrati kasutatavate tehnoloogiate kogum:
- PostgreSQL andmebaasisüsteemina
- klastreerimise lahendusena
- etcd jaotatud salvestusruumana Patroni jaoks
- HAproxy rakenduste jaoks, mis kasutavad andmebaasi, sisenemise ühtse punkti loomimiseks.
Paigaldamine
Meie tähelepanu all on kõrge kättesaadavuse PostgreSQLi klastrite ehitamine Patroni, etcd ja HAProxy abil.
Kõik toimingud tehti Debian 10 opsüsteemiga virtuaalmasinatel.
etcd
Ma ei soovita etcd-d paigaldada samadesse masinatesse, kus asuvad patroni ja postgresql, kuna etcd jaoks on kettaruumi koormus väga oluline. Kuid õppe eesmärgil teeme me just nii.
Paigaldame etcd.
#!/bin/bash
apt-get update
apt-get install etcdLisage sisu faili /etc/default/etcd
[liige]
ETCD_NAME=datanode1 # teie masina hostinimi
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
KÕIK IP AADRESSID PEAVAD OLEMA KEHTIVAD. LISTENER PEER, CLIENT jne PEAVAD OLEMA SEADISTATUD HOSTI IP AADRISS.
ETCD_LISTEN_PEER_URLS="" # teie masina aadress
ETCD_LISTEN_CLIENT_URLS="" # teie masina aadress
[klaster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # teie masina aadress
ETCD_INITIAL_CLUSTER="datanode1=" # kõik masinate aadressid klastris etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # teie masina aadress
Käivitage käsk
systemctl restart etcdPostgreSQL 9.6 + patroni
Esimene samm on kolme virtuaalse masina installimine, et vajalik tarkvara paigaldada. Masinate installeerimise järel, kui järgite minu õpetust, saate käivitada selle lihtsa skripti, mis teeb (peaaegu) kõik teie eest. Skript käivitatakse root-i alt.
Pange tähele, et skript kasutab PostgreSQL versiooni 9.6, mis on meie ettevõtte sisemiste nõudmise tõttu. Lahendust ei ole testitud teiste PostgreSQL versioonide peal.
#!/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.ymlSeejärel peate just loodud failile /etc/patroni.yml lisama järgmise sisu, muutes loomulikult IP-aadressid kõigis kohtades oma kasutatavateks aadressideks.
Pöörake tähelepanu selle yaml-i kommentaaridele. Muutke aadresse enda omadeks, igas klastrimasinas.
/etc/patroni.yml
scope: pgsql # peab olema sama kõigil sõlmedel
namespace: /cluster/ # peab olema sama kõigil sõlmedel
name: postgres1 # peab olema erinev kõigil sõlmedel
restapi:
listen: 192.168.0.143:8008 # selle faili asukoha sõlme aadress
connect_address: 192.168.0.143:8008 # selle faili asukoha sõlme aadress
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # loetlege siin kõik teie sõlmed, kui paigaldate etcd neile
# see jaotis (bootstrap) kirjutatakse Etcd:///config pärast uue klastrinõuete algatamist
# ja kõik teised klastriliikmed kasutavad seda kui `globaalset konfiguratsiooni`
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 peab sisaldama KÕIKIDE klastris kasutatavate masinate aadresse
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 # selle faili asukoha sõlme aadress
connect_address: 192.168.0.143:5432 # selle faili asukoha sõlme aadress
data_dir: /data/patroni # selle kausta loob ülaltoodud skript ja määrab vajalikud õigused
bin_dir: /usr/lib/postgresql/9.6/bin # määrake oma postgresql kausta tee
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: falseSkripti tuleb käivitada kõikidel kolmel klastrimasinal, samuti tuleb antud konfiguratsioon paigutada faili /etc/patroni.yml kõigis masinates.
Kui olete need toimingud teinud kõikides klastrimasinates, käivitage järgmine käsk mõnel neist
systemctl start patroni
systemctl start postgresqlOodake umbes 30 sekundit, seejärel käivitage see käsk ülejäänud klastrimasinates.
HAproxy
Kasutame suurepärast HAproxy't, et pakkuda ühte sisenemispunkti. Master-server on alati kergesti ligipääsetav HAproxy rakenduse paigutuse aadressilt.
Kuna vältida, et HAproxy muutuks ainukeseks rikkepunktiks, käivitame selle Dockeris, hiljem saab selle käivitada K8’s klastris, muutes meie rikkevastupidava klastrite veelgi usaldusväärsemaks.
Looge direktorium, kuhu saate salvestada kaks faili — Dockerfile ja haproxy.cfg. Liikuge sinna.
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.logOlge ettevaatlik, haproxy.cfg faili kolmes viimases reas peavad olema loetletud teie serverite aadressid. HAproxy pöördub Patroni poole, HTTP-pealkirjades naaseb master-server alati 200, ja replica — 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
Olles kaustas, kus asuvad mõlemad meie failid, täidame järjestikku konteineri pakkimise käsud ja ka selle käivitamise koos vajalikku sadamate edastamisega:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Nüüd, avades brauseris oma HAproxy masina aadressi ja määrates sadama 7000, näete statistikat oma klastrite kohta.
UP-seisundis on see server, mis on master, ja replika on DOWN-seisundis. See on normaalne, tegelikult töötavad nad, kuid kuvatakse nii, kuna nad naasevad 503 päringutele HAproxy poolt. See võimaldab meil alati täpselt teada, milline kolmest serverist on praegu master.
Kokkuvõte
Te olete suurepärased! Ainult 30 minutiga olete käivitanud suurepärase rikkevastupidava ja tõhusa andmebaasi klastrite voogude replikatsiooni ja automaatse varu. Kui plaanite seda lahendust kasutada, tutvuge , eriti selle osaga, mis käsitleb patronictl utiliiti, mis pakub mugavat juurdepääsu teie klastrite haldamiseks.
Palju õnne!
Allikas: habr.com
