Va succeir que en el moment d'establir la tasca, no tenia el grau d'experiència suficient per desenvolupar i executar aquesta solució sol. I després vaig començar a buscar a Google.
No sé quina és la trampa, però per enèsima vegada m'he trobat amb el fet que encara que ho feu tot pas a pas com al tutorial, prepareu el mateix entorn que el de l'autor, encara no funciona mai. No tinc ni idea de què passa, però quan em vaig tornar a trobar amb això, vaig decidir, i escriuré el meu tutorial quan tot funcioni. Un que sens dubte funcionarà.
Guies a Internet
Succeeix que Internet no pateix la manca de diverses guies, tutorials, passos a pas i similars. Va donar la casualitat que em van donar la tasca de desenvolupar una solució per organitzar i construir còmodament un clúster de migració per error PostgreSQL, els requisits principals per als quals eren la rèplica en temps real des del servidor mestre a totes les rèpliques i la reserva automàtica quan falla el servidor mestre.
En aquesta etapa, es va determinar la pila de tecnologies utilitzades:
- PostgreSQL com a SGBD
- com a solució de clúster
- etcd com a emmagatzematge distribuït per a Patroni
- HAproxy per organitzar un únic punt d'entrada per a aplicacions que utilitzen la base de dades
Instal · lació
La vostra atenció està construint un clúster PostgreSQL d'alta disponibilitat mitjançant Patroni, etcd, HAProxy.
Все операции выполнялись на виртуальных машинах с установленной ОС Debian 10.
etc.
No recomano instal·lar etcd a les mateixes màquines on es trobaran patroni i postgresql, ja que la càrrega del disc és molt important per a etcd. Però amb finalitats educatives, ho farem.
Instal·leu etcd.
#!/bin/bash
apt-get update
apt-get install etcdAfegiu contingut al fitxer /etc/default/etcd
[membre]
ETCD_NAME=datanode1 # nom d'amfitrió de la vostra màquina
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
TOTES LES ADRECES IP HAN DE SER VÀLIDES. EL LISTADOR PEER, EL CLIENT, etc. S'HAN DE CONFIGURAR A L'ADREÇA IP DE L'AMFITRIÓ
ETCD_LISTEN_PEER_URLS="» # adreça de la vostra màquina
ETCD_LISTEN_CLIENT_URLS="» # adreça de la vostra màquina
[clúster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="» # adreça de la vostra màquina
ETCD_INITIAL_CLUSTER="datanode1=» # adreces de totes les màquines del clúster etcd
ETCD_INITIAL_CLUSTER_STATE="nou"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_ADVERTISE_CLIENT_URLS="» # adreça de la vostra màquina
Executeu l'ordre
systemctl restart etcdPostgreSQL 9.6 + patroni
El primer que cal fer és configurar tres màquines virtuals per instal·lar-hi el programari necessari. Després d'instal·lar les màquines, si seguiu el meu tutorial, podeu executar aquest senzill script que (gairebé) ho farà tot per vosaltres. S'executa com a root.
Tingueu en compte que l'script utilitza la versió de PostgreSQL 9.6, això es deu als requisits interns de la nostra empresa. La solució no s'ha provat en altres versions de 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.ymlA continuació, al fitxer /etc/patroni.yml que acabeu de crear, heu de posar el següent contingut, per descomptat, canviant les adreces IP a tots els llocs per les adreces que feu servir.
Pareu atenció als comentaris d'aquest yaml. Canvieu les adreces per les vostres, a cada màquina del clúster.
/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'script s'ha d'executar a les tres màquines del clúster, de la mateixa manera que la configuració anterior s'ha de col·locar al fitxer /etc/patroni.yml de totes les màquines.
Quan hàgiu fet aquestes operacions a totes les màquines del clúster, executeu l'ordre següent en qualsevol d'elles
systemctl start patroni
systemctl start postgresqlEspereu uns 30 segons i, a continuació, executeu aquesta ordre a les màquines restants del clúster.
HAproxy
Utilitzem el meravellós HAproxy per proporcionar un únic punt d'entrada. El servidor mestre sempre estarà disponible a l'adreça de la màquina on s'ha desplegat HAproxy.
Per no fer que la màquina amb HAproxy sigui un únic punt de fallada, l'executarem en un contenidor Docker, en el futur serà possible executar-la en un clúster de K8 i fer que el nostre clúster de failover encara sigui més fiable.
Creeu un directori on pugueu emmagatzemar dos fitxers: Dockerfile i haproxy.cfg. Entra-hi.
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.logAneu amb compte, les tres últimes línies del fitxer haproxy.cfg haurien d'enumerar les adreces de les vostres màquines. HAproxy es posarà en contacte amb Patroni, a les capçaleres HTTP el servidor mestre sempre retornarà 200 i la rèplica sempre retornarà 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
En trobar-se al directori en què "es troben" els nostres dos fitxers, executarem seqüencialment les ordres per empaquetar el contenidor, així com el llançarem amb els ports necessaris reenviats:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy Ara, quan obriu l'adreça de la vostra màquina amb HAproxy al navegador i especifiqueu el port 7000, veureu les estadístiques del vostre clúster.
El servidor que és el mestre estarà en estat UP i les rèpliques estaran en estat DOWN. Això és normal, de fet funcionen, però es mostren en aquest formulari pel fet que tornen 503 a les sol·licituds d'HAproxy. Això ens permet saber sempre exactament quin dels tres servidors és el mestre actual.
Conclusió
Ets preciosa! En només 30 minuts, heu desplegat un excel·lent clúster de bases de dades de rendiment i migració per error amb replicació en temps real i migració automàtica per error. Si teniu previst utilitzar aquesta solució, consulteu , i especialment amb la seva part pel que fa a la utilitat patronictl, que proporciona un accés còmode per gestionar el vostre clúster.
Enhorabona!
Font: www.habr.com
