Det skete bare, at jeg på tidspunktet for opgaven ikke havde tilstrækkelig erfaring til at udvikle og lancere denne løsning alene. Og så begyndte jeg at google.
Jeg ved ikke, hvad problemet er, men jeg støder gang på gang på, at selvom jeg gør alt trin-for-trin som i tutorialen og forbereder et tilsvarende environment som forfatteren, så virker det aldrig. Jeg har ingen anelse om, hvad der er galt, men da jeg stødte på dette igen, besluttede jeg – jeg vil skrive min egen tutorial, når det hele lykkes. Den, der helt sikkert vil fungere.
Guider på internettet
Det er sådan, at internettet ikke lider under mangel på forskellige guider, tutorials, step-by-step og lignende. Det er sådan, at jeg blev tildelt opgaven at udvikle en løsning til nem organisering og opbygning af et fejlfindingsresistant PostgreSQL-klynge, hvor de vigtigste krav var streamingreplikation fra Master-serveren til alle repliker og automatisk failover ved fejl på Master-serveren.
På dette stadium blev techen bestemte:
- PostgreSQL som databaser
- som løsning til clustering
- etcd som distribueret lager til Patroni
- HAproxy til at organisere et enkelt indgangspunkt for applikationer, der bruger databasen
Installation
Vi præsenterer — opbygning af en højtilgængelig PostgreSQL-klynge ved hjælp af Patroni, etcd, HAProxy.
Alle operationer blev udført på virtuelle maskiner med Debian 10 installeret.
i den relevante Docker-container
Jeg anbefaler ikke at installere etcd på de samme maskiner, hvor patroni og postgresql vil være, da diskbelastningen er meget vigtig for etcd. Men til læringens skyld vil vi gøre netop det.
Lad os installere etcd.
#!/bin/bash
apt-get update
apt-get install etcdTilføj indholdet til filen /etc/default/etcd
[member]
ETCD_NAME=datanode1 # værtsnavn på din maskine
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ALLE IP-ADRESSER SKAL VÆRE GYLDIGE. LISTER PEER, CLIENT osv. SKAL SÆTTES TIL VERTENS IP-ADRESSE
ETCD_LISTEN_PEER_URLS="" # adressen på din maskine
ETCD_LISTEN_CLIENT_URLS="" # adressen på din maskine
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="" # adressen på din maskine
ETCD_INITIAL_CLUSTER="datanode1=" # adresserne på alle maskiner i etcd klyngen
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="" # adressen på din maskine
Udfør kommandoen
systemctl restart etcdPostgreSQL 9.6 + patroni
Det første, du skal gøre, er at installere tre virtuelle maskiner til installation af den nødvendige software. Efter installation af maskinerne, hvis du følger min tutorial, kan du køre dette enkle script, som (næsten) klarer alt for dig. Det køres som root.
Bemærk, at scriptet bruger version PostgreSQL 9.6, hvilket skyldes vores interne krav. Løsningen er ikke testet på andre versioner af 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.ymlDernæst skal du placere følgende indhold i den nyoprettede fil /etc/patroni.yml, og selvfølgelig ændre IP-adresserne alle steder til dem, du bruger.
Vær opmærksom på kommentarerne i denne yaml. Ændr adresserne til dine egne på hver maskine i klyngen.
/etc/patroni.yml
scope: pgsql # skal være det samme på alle noder
namespace: /cluster/ # skal være det samme på alle noder
name: postgres1 # skal være forskelligt på alle noder
restapi:
listen: 192.168.0.143:8008 # adressen på den node, hvor denne fil findes
connect_address: 192.168.0.143:8008 # adressen på den node, hvor denne fil findes
etcd:
hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 # list alle dine noder her, hvis du installerer etcd på dem
# denne sektion (bootstrap) vil blive skrevet til Etcd:/<namespace>/<scope>/config efter initialisering af det nye cluster
# og alle andre cluster medlemmer vil bruge det som en `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: da_DK.UTF8
# init pg_hba.conf skal indeholde adresserne PÅ ALLE maskiner, der bruges i clustret
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 på den node, hvor denne fil findes
connect_address: 192.168.0.143:5432 # adressen på den node, hvor denne fil findes
data_dir: /data/patroni # denne mappe vil scriptet, der er beskrevet ovenfor, oprette og sætte de nødvendige rettigheder
bin_dir: /usr/lib/postgresql/9.6/bin # angiv stien til din postgresql mappe
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: falseScriptet skal køres på alle tre maskiner i clustret, og den angivne konfiguration skal placeres i filen /etc/patroni.yml på alle maskiner.
Når du har udført disse operationer på alle maskiner i clustret, skal du køre følgende kommando på en af dem.
systemctl start patroni
systemctl start postgresqlVent cirka 30 sekunder, og kør derefter denne kommando på de øvrige maskiner i clustret.
HAproxy
Vi bruger det fantastiske HAproxy til at levere et enkelt indgangspunkt. Master-serveren vil altid være tilgængelig på adressen på den maskine, hvor HAproxy er implementeret.
For ikke at gøre maskinen med HAproxy til et enkelt fejlpunt, vil vi køre den i en Docker-container, som senere kan køres i et K8's-klynge og gøre vores fejltolerante klynge endnu mere pålidelig.
Opret et bibliotek, hvor du kan gemme to filer - Dockerfile og haproxy.cfg. Gå ind i det.
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.logVær forsigtig, de tre sidste linjer i filen haproxy.cfg skal angive adresserne på dine maskiner. HAproxy vil henvende sig til Patroni, i HTTP-headerne vil masterserveren altid returnere 200, mens replica vil returnere 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
Mens vi er i biblioteket, hvor begge vores filer ligger, lad os køre kommandoerne til pakning af containeren og derefter dens opstart med de nødvendige porte åbne:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Når du nu åbner adressen på din maskine med HAproxy i din browser og angiver port 7000, vil du se statistikken for din klynge.
Den server, der er i tilstand UP, vil være den, der er master, mens replikaerne er i tilstand DOWN. Det er normalt, de fungerer faktisk, men vises sådan, fordi de returnerer 503 på anmodninger fra HAproxy. Dette giver os altid præcis at vide, hvilken af de tre servere der er master i øjeblikket.
Konklusion
Du er fantastisk! På blot 30 minutter har du oprettet en fremragende fejltolerant og højtydende databaseklynge med streamingreplikering og automatisk failover. Hvis du planlægger at bruge denne løsning, skal du læse , især dens afdeling vedrørende værktøjet patronictl, som tilbyder nem adgang til at administrere din klynge.
Tillykke!
Kilde: habr.com
