Det visade sig att vid tidpunkten för uppgiften hade jag inte tillrÀcklig erfarenhet för att utveckla och lansera denna lösning ensam. SÄ jag började googla.
Jag vet inte vad problemet Àr, men jag har gÄng pÄ gÄng stött pÄ att Àven om jag gör allt steg för steg som i tutorialen, och förbereder en liknande miljö som författaren, sÄ fungerar det aldrig. Jag har ingen aning om vad som Àr fel, men nÀr jag stötte pÄ det hÀr igen, bestÀmde jag mig för att skriva min egen tutorial nÀr allt fungerar. Den som definitivt kommer att fungera.
Guider pÄ Internet
Det Àr sÄ att internet inte lider av brist pÄ olika guider, tutorials, steg-för-steg och liknande saker. Det Àr sÄ att jag fick i uppdrag att utveckla en lösning för praktisk organisation och byggande av en felÄterstÀllande kluster av PostgreSQL, med de frÀmsta kraven att vara strömmande replikering frÄn Master-server till alla replikat och automatisk inmatning av reserv nÀr Master-servern gÄr ner.
Vid detta steg bestÀmdes teknikstacken som skulle anvÀndas:
- PostgreSQL som databas
- som lösning för klustring
- etcd som ett distribuerat lagringssystem för Patroni
- HAproxy för att organisera en enhetlig ingÄngspunkt för program som anvÀnder databasen
Installation
Vi presenterar byggandet av ett PostgreSQL-kapabel kluster med hög tillgÀnglighet med anvÀndning av Patroni, etcd, HAProxy.
Alla operationer utfördes pÄ virtuella maskiner med installerat Debian 10.
i den motsvarande Docker-bilden
Jag rekommenderar inte att installera etcd pÄ samma maskiner dÀr patroni och postgresql kommer att vara, eftersom arbetsbelastningen pÄ diskarna Àr vÀldigt viktig för etcd. Men för utbildningens skull kommer vi att göra just det.
Vi installerar etcd.
#!/bin/bash
apt-get update
apt-get install etcdLÀgg till innehÄllet i filen /etc/default/etcd
[member]
ETCD_NAME=datanode1 # vÀrdnamn för din enhet
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ALLA IP-ADRESSER MĂ STE VARA GILTIGA. LISSENTER PEER, KLCLIENT ETC SKA VARA INSTĂLLDA PĂ VĂRDENS IP-ADRESS
ETCD_LISTEN_PEER_URLS="" # adressen till din maskin
ETCD_LISTEN_CLIENT_URLS="" # adressen till din maskin
[kluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # adressen till din maskin
ETCD_INITIAL_CLUSTER="datanode1=" # adresserna för alla maskiner i klustret etcd
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # adressen till din maskin
Kör kommandot
systemctl restart etcdPostgreSQL 9.6 + patroni
Det första du behöver göra Àr att installera tre virtuella maskiner för att installera den nödvÀndiga programvaran. Efter att ha installerat maskinerna, om du följer min handledning, kan du köra det hÀr enkla skriptet som (nÀstan) gör allt Ät dig. Det körs som root.
Observera att skriptet anvÀnder version PostgreSQL 9.6, vilket beror pÄ interna krav frÄn vÄrt företag. Lösningen har inte testats pÄ andra versioner av 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.ymlDÀrefter mÄste du placera följande innehÄll i den nyss skapade filen /etc/patroni.yml, givetvis efter att ha Àndrat IP-adresserna pÄ alla stÀllen till de adresser som du anvÀnder.
Observera kommentarerna i denna yaml. Ăndra adresserna till dina, pĂ„ varje maskin i klustret.
/etc/patroni.yml
scope: pgsql # bör vara densamma pÄ alla noder
namespace: /cluster/ # bör vara densamma pÄ alla noder
name: postgres1 # bör vara olika pÄ alla noder
restapi:
listen: 192.168.0.143:8008 # adressen till den nod dÀr den hÀr filen finns
connect_address: 192.168.0.143:8008 # adressen till den nod dÀr den hÀr filen finns
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # lista alla dina noder hÀr, ifall du installerar etcd pÄ dem
# den hÀr sektionen (bootstrap) kommer att skrivas in i Etcd:///config efter att den nya klustret har initierats
# och alla andra klustermedlemmar kommer att anvÀnda den som en `global konfiguration`
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: sv_SE.UTF8
# init pg_hba.conf mÄste innehÄlla adresserna TILL ALLA maskiner som anvÀnds i klustret
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 # adressen till den nod dÀr den hÀr filen finns
connect_address: 192.168.0.143:5432 # adressen till den nod dÀr den hÀr filen finns
data_dir: /data/patroni # den hÀr katalogen kommer att skapas av skriptet som beskrivs ovan och de nödvÀndiga rÀttigheterna kommer att stÀllas in
bin_dir: /usr/lib/postgresql/9.6/bin # ange sökvÀgen till din postgresql-katalog
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: falseSkriptet mÄste köras pÄ alla tre maskiner i klustret, och samma konfiguration mÄste placeras i filen /etc/patroni.yml pÄ alla maskiner.
NÀr du har utfört dessa ÄtgÀrder pÄ alla maskiner i klustret, kör nÀsta kommando pÄ valfri maskin.
systemctl start patroni
systemctl start postgresqlVÀnta cirka 30 sekunder och kör sedan det hÀr kommandot pÄ de andra maskinerna i klustret.
HAproxy
Vi anvÀnder fantastiska HAproxy för att tillhandahÄlla en enhetlig ingÄngspunkt. Master-servern kommer alltid att vara tillgÀnglig pÄ adressen till maskinen dÀr HAproxy Àr implementerat.
För att undvika att göra maskinen med HAproxy till en enda felpunkt, kommer vi att köra den i en Docker-container, och senare kan den startas i en K8s-kluster för att göra vÄr redundanta kluster Ànnu mer pÄlitlig.
Skapa en katalog dĂ€r du kan lagra tvĂ„ filer â Dockerfile och haproxy.cfg. GĂ„ till den.
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.logVar försiktig, de tre sista raderna i filen haproxy.cfg ska innehÄlla adresserna till dina maskiner. HAproxy kommer att kommunicera med Patroni, i HTTP-huvuden kommer master-servern alltid att returnera 200, medan replica returnerar 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
NÀr vi Àr i katalogen dÀr bÄda vÄra filer finns, kör vi steg för steg kommandona för att paketera containern samt starta den med vidarebefordran av nödvÀndiga portar:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Nu kan du öppna din webblÀsare och ange adressen till din maskin med HAproxy och port 7000, sÄ kommer du att se statistiken för ditt kluster.
Den server som Àr i UP-status kommer att vara den som Àr master, medan replications Àr i DOWN-status. Det Àr normalt, de fungerar faktiskt, men visar sÄ hÀr eftersom de returnerar 503 pÄ förfrÄgningar frÄn HAproxy. Detta gör att vi alltid vet exakt vilken av de tre servrarna som Àr master just nu.
Slutsats
Du Àr fantastisk! PÄ bara 30 minuter har du rullat ut ett utmÀrkt redundanta och högpresterande databas-kluster med strömmande replikering och automatisk failover. Om du planerar att anvÀnda denna lösning, lÀs , sÀrskilt delen som handlar om verktyget patronictl, som ger enkel Ätkomst till att hantera ditt kluster.
Grattis!
KĂ€lla: habr.com
