ProHoster > Blog > podávání > Vytvoření vysoce dostupného clusteru PostgreSQL pomocí Patroni, etcd, HAProxy
Vytvoření vysoce dostupného clusteru PostgreSQL pomocí Patroni, etcd, HAProxy
Stalo se, že v době zadávání úkolu jsem neměl dostatečnou míru zkušeností na vývoj a provoz tohoto řešení sám. A pak jsem začal googlovat.
Nevím, v čem je háček, ale už po mnoho let se setkávám s tím, že i když vše děláte krok za krokem jako v tutoriálu, připravujete stejné prostředí jako má autor, stejně to nikdy nefunguje. Nemám ponětí, co se děje, ale když jsem na to znovu narazil, rozhodl jsem se – a až vše půjde, napíšu svůj návod. Takový, který bude určitě fungovat.
Průvodci na internetu
Stává se, že internet netrpí nedostatkem různých návodů, tutoriálů, krok za krokem a podobně. Náhodou jsem dostal za úkol vyvinout řešení pro pohodlnou organizaci a vybudování clusteru pro překonání selhání PostgreSQL, jehož hlavními požadavky bylo streamování replikace z hlavního serveru na všechny repliky a automatický návrat při selhání hlavního serveru.
V této fázi byl určen zásobník použitých technologií:
HAproxy pro organizaci jediného vstupního bodu pro aplikace využívající databázi
Instalace
Vaše pozornost je věnována budování vysoce dostupného clusteru PostgreSQL pomocí Patroni, etcd, HAProxy.
Všechny operace byly prováděny na virtuálních strojích s nainstalovaným OS Debian 10.
atd
Nedoporučuji instalovat etcd na stejné počítače, kde budou umístěny patroni a postgresql, protože zatížení disku je pro etcd velmi důležité. Ale pro vzdělávací účely to uděláme.
Nainstalujte atd.
#!/bin/bash
apt-get update
apt-get install etcd
Přidejte obsah do souboru /etc/default/etcd
[člen]
ETCD_NAME=datanode1 # název hostitele vašeho počítače
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
VŠECHNY IP ADRESY BY MĚLY BÝT PLATNÉ. LISTER PEER, KLIENT atd. BY MĚLI BÝT NASTAVENI NA IP ADRESU HOSTATELE
První věc, kterou musíte udělat, je nastavit tři virtuální počítače, abyste na ně nainstalovali potřebný software. Po instalaci strojů, pokud budete postupovat podle mého návodu, můžete spustit tento jednoduchý skript, který (téměř) udělá vše za vás. Běží jako root.
Upozorňujeme, že skript používá verzi PostgreSQL 9.6, je to z důvodu interních požadavků naší společnosti. Řešení nebylo testováno na jiných verzích PostgreSQL.
Dále do souboru /etc/patroni.yml, který jste právě vytvořili, musíte vložit následující obsah, samozřejmě změnit ip adresy na všech místech na adresy, které používáte.
Věnujte pozornost komentářům v tomto yaml. Změňte adresy na své vlastní na každém počítači v clusteru.
/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: false
Skript musí být spuštěn na všech třech počítačích v clusteru, stejně jako výše uvedená konfigurace musí být umístěna do souboru /etc/patroni.yml na všech počítačích.
Po provedení těchto operací na všech klastrových počítačích spusťte na kterémkoli z nich následující příkaz
Počkejte asi 30 sekund a poté spusťte tento příkaz na zbývajících počítačích v clusteru.
HAproxy
Používáme úžasné HAproxy k poskytování jediného vstupního bodu. Hlavní server bude vždy dostupný na adrese počítače, kde je nasazeno HAproxy.
Aby stroj s HAproxy nebyl jediným bodem selhání, spustíme jej v kontejneru Docker, v budoucnu jej bude možné provozovat v clusteru K8 a náš failover cluster bude ještě spolehlivější.
Vytvořte adresář, kam můžete uložit dva soubory – Dockerfile a haproxy.cfg. Jděte do toho.
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.log
Buďte opatrní, na posledních třech řádcích souboru haproxy.cfg by měly být uvedeny adresy vašich počítačů. HAproxy bude kontaktovat Patroni, v HTTP hlavičkách hlavní server vždy vrátí 200 a replika vždy vrátí 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
Tím, že jsme v adresáři, ve kterém „leží oba naše soubory“, budeme postupně provádět příkazy pro zabalení kontejneru a také jej spustíme s předáním potřebných portů:
Nyní, když v prohlížeči otevřete adresu vašeho počítače s HAproxy a zadáte port 7000, uvidíte statistiky pro váš cluster.
Server, který je hlavním serverem, bude ve stavu NAHORU a repliky budou ve stavu DOLŮ. To je normální, ve skutečnosti fungují, ale zobrazují se v této podobě kvůli tomu, že na požadavky z HAproxy vracejí 503. To nám umožňuje vždy přesně vědět, který ze tří serverů je aktuální master.
Závěr
Jste skvělí! Za pouhých 30 minut jste nasadili skvělý databázový cluster s podporou převzetí služeb při selhání a výkonem se streamovanou replikací a automatickým převzetím služeb při selhání. Pokud plánujete použít toto řešení, viz s oficiální dokumentací Patroni, a zejména s jeho částí týkající se utility patronictl, která poskytuje pohodlný přístup ke správě vašeho clusteru.