Π’Π°ΠΊ ΡΠΆ Π²ΡΡΠ»ΠΎ, ΡΡΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π·Π°Π΄Π°ΡΠΈ Ρ Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Π» Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΡΡ ΠΎΠΏΡΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎΠ±Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΡ. Π ΡΠΎΠ³Π΄Π° Ρ Π½Π°ΡΠ°Π» Π³ΡΠ³Π»ΠΈΡΡ.
ΠΠ΅ Π·Π½Π°Ρ, Π² ΡΠ΅ΠΌ Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ°, Π½ΠΎ ΡΠΆΠ΅ Π² ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π· Ρ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π΄Π΅Π»Π°ΡΡ Π²ΡΠ΅ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎ ΠΊΠ°ΠΊ Π² ΡΡΡΠΎΡΠΈΠ°Π»Π΅, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ enviroment ΠΊΠ°ΠΊ Ρ Π°Π²ΡΠΎΡΠ°, ΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΠ½ΡΡΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Ρ, Π² ΡΠ΅ΠΌ ΡΡΡ Π΄Π΅Π»ΠΎ, Π½ΠΎ ΠΊΠΎΠ³Π΄Π° Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΡΠΈΠΌ Π² ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΡΠ°Π·, Ρ ΡΠ΅ΡΠΈΠ» β Π° Π½Π°ΠΏΠΈΡΡ-ΠΊΠ° Ρ ΡΠ²ΠΎΠΉ ΡΡΡΠΎΡΠΈΠ°Π», ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ. Π’ΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΠ°ΠΉΠ΄Ρ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅
Π’Π°ΠΊ ΡΠΆ Π²ΡΡΠ»ΠΎ, ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ Π½Π΅ ΡΡΡΠ°Π΄Π°Π΅Ρ ΠΎΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΊΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π³Π°ΠΉΠ΄ΠΎΠ², ΡΡΡΠΎΡΠΈΠ°Π»ΠΎΠ², step-by-step ΠΈ ΡΠΎΠΌΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ Π²Π΅ΡΠ΅ΠΉ. Π’Π°ΠΊ ΡΠΆ Π²ΡΡΠ»ΠΎ, ΡΡΠΎ ΠΌΠ½Π΅ Π±ΡΠ»Π° ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π° Π·Π°Π΄Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° PostgreSQL, Π³Π»Π°Π²Π½ΡΠΌΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΠ²Π»ΡΠ»ΠΈΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²Π°Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Ρ Master-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° Π²ΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ ΡΠ΅Π·Π΅ΡΠ²Π° ΠΏΡΠΈ ΠΎΡΠΊΠ°Π·Π΅ Master-ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ° ΡΡΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π±ΡΠ» ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΡΠ΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ:
- PostgreSQL Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π‘Π£ΠΠ
Patroni Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ- etcd Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ Patroni
- HAproxy Π΄Π»Ρ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π° Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Π±Π°Π·Ρ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΠ°ΡΠ΅ΠΌΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ β ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° PostgreSQL Π²ΡΡΠΎΠΊΠΎΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Patroni, etcd, HAProxy.
ΠΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΠΈΡΡ Π½Π° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ ΠΠ‘ Debian 10.
etcd
ΠΠ΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ etcd Π½Π° ΡΠ΅Ρ
ΠΆΠ΅ ΠΌΠ°ΡΠΈΠ½Π°Ρ
, Π³Π΄Π΅ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ patroni ΠΈ postgresql, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄Π»Ρ etcd ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½Π° Π½Π°Π³ΡΡΠ·ΠΊΠ° Π½Π° Π΄ΠΈΡΠΊΠΈ. ΠΠΎ Π² ΡΠ΅Π»ΡΡ
ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, ΠΌΡ ΠΏΠΎΡΡΡΠΏΠΈΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ etcd.
#!/bin/bash
apt-get update
apt-get install etcd
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π² ΡΠ°ΠΉΠ» /etc/default/etcd
[member]
ETCD_NAME=datanode1 # hostname Π²Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Ρ
ETCD_DATA_DIR=»/var/lib/etcd/default.etcd»
ALL IP ADRESSES SHOULD BE VALID. LISTER PEER, CLIENT etc SHOULD BE SET TO IP ADDRESS OF HOST
ETCD_LISTEN_PEER_URLS=»
ETCD_LISTEN_CLIENT_URLS=»
[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS=»
ETCD_INITIAL_CLUSTER=»datanode1=
ETCD_INITIAL_CLUSTER_STATE=»new»
ETCD_INITIAL_CLUSTER_TOKEN=»etcd-cluster-1″
ETCD_ADVERTISE_CLIENT_URLS=»
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
systemctl restart etcd
PostgreSQL 9.6 + patroni
ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΠΈ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΠΈΠ½Ρ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π° Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΠ. ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΌΠ°ΡΠΈΠ½, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ»Π΅Π΄ΡΠ΅ΡΠ΅ ΠΌΠΎΠ΅ΠΌΡ ΡΡΡΠΎΡΠΈΠ°Π»Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΡΠΎΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΡΠΎΡΡΠΉ (ΠΏΠΎΡΡΠΈ) Π²ΡΠ΅ ΡΠ΄Π΅Π»Π°Π΅Ρ Π·Π° Π²Π°Ρ. ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΈΠ·-ΠΏΠΎΠ΄ root.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠΊΡΠΈΠΏΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡ PostgreSQL 9.6, ΡΡΠΎ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌΠΈ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»ΠΎΡΡ Π½Π° Π΄ΡΡΠ³ΠΈΡ Π²Π΅ΡΡΠΈΡΡ 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.yml
ΠΠ°Π»Π΅Π΅, Π² ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠ°ΠΉΠ» /etc/patroni.yml Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ip-Π°Π΄ΡΠ΅ΡΠ° Π²ΠΎ Π²ΡΠ΅Ρ
ΠΌΠ΅ΡΡΠ°Ρ
, Π½Π° Π°Π΄ΡΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ Π²Ρ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ yaml. ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° Π½Π° ΡΠ²ΠΎΠΈ, Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
/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
Π‘ΠΊΡΠΈΠΏΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π½Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²ΡΠ΅Ρ ΡΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π² ΡΠ°ΠΉΠ» /etc/patroni.yml Π½Π° Π²ΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°Ρ .
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΏΡΠΎΠ΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π²ΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ
systemctl start patroni
systemctl start postgresql
ΠΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 30 ΡΠ΅ΠΊΡΠ½Π΄, Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½Π° ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΠΌΠ°ΡΠΈΠ½Π°Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
HAproxy
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ΄Π΅ΡΠ½ΡΠΉ HAproxy Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΈ Π²Ρ ΠΎΠ΄Π°. Master-ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ HAproxy.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π½Π΅ ΡΠ΄Π΅Π»Π°ΡΡ ΠΌΠ°ΡΠΈΠ½Ρ Ρ HAproxy Π΅Π΄ΠΈΠ½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ ΠΎΡΠΊΠ°Π·Π°, Π·Π°ΠΏΡΡΡΠΈΠΌ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Docker, Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΡΠΈΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅Ρ K8’s ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π½Π°Ρ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΌ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, Π³Π΄Π΅ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Ρ ΡΠ°Π½ΠΈΡΡ Π΄Π²Π° ΡΠ°ΠΉΠ»Π° β Dockerfile ΠΈ haproxy.cfg. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² Π½Π΅Π΅.
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
ΠΡΠ΄ΡΡΠ΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Ρ, Π² ΡΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΡΡΡΠΎΠΊΠ°Ρ ΡΠ°ΠΉΠ»Π° haproxy.cfg Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π°Π΄ΡΠ΅ΡΠ° Π²Π°ΡΠΈΡ ΠΌΠ°ΡΠΈΠ½. HAproxy Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ Patroni, Π² HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ master-ΡΠ΅ΡΠ²Π΅Ρ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ 200, Π° 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
ΠΠ°Ρ ΠΎΠ΄ΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ «Π»Π΅ΠΆΠ°Ρ» ΠΎΠ±Π° Π½Π°ΡΠΈΡ ΡΠ°ΠΉΠ»Π°, Π²ΡΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ Π΅Π³ΠΎ Π·Π°ΠΏΡΡΠΊ Ρ ΠΏΡΠΎΠ±ΡΠΎΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠΎΡΡΠΎΠ²:
docker build -t my-haproxy .
docker run -d -p5000:5000 -p7000:7000 my-haproxy
Π’Π΅ΠΏΠ΅ΡΡ, ΠΎΡΠΊΡΡΠ² Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Π°Π΄ΡΠ΅Ρ Π²Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Ρ Ρ HAproxy ΠΈ ΡΠΊΠ°Π·Π°Π² ΠΏΠΎΡΡ 7000, Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΡ ΠΏΠΎ Π²Π°ΡΠ΅ΠΌΡ ΠΊΠ»Π°ΡΡΠ΅ΡΡ.
Π ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ UP Π±ΡΠ΄Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΡΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠ΅ΡΠΎΠΌ, Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ DOWN. ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ, Π½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ 503 Π½Π° Π·Π°ΠΏΡΠΎΡΡ ΠΎΡ HAproxy. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ Π²ΡΠ΅Π³Π΄Π° ΡΠΎΡΠ½ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· ΡΡΠ΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠ΅ΡΠΎΠΌ Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡ Π²ΠΎΡΡ
ΠΈΡΠΈΡΠ΅Π»ΡΠ½Ρ! ΠΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Π·Π° 30 ΠΌΠΈΠ½ΡΡ Π²Ρ ΡΠ°Π·Π²Π΅ΡΠ½ΡΠ»ΠΈ ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΉ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ Π±Π°Π· Π΄Π°Π½Π½ΡΡ
Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ Π²Π²ΠΎΠ΄ΠΎΠΌ ΡΠ΅Π·Π΅ΡΠ²Π°. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ
ΠΠΎΠ·Π΄ΡΠ°Π²Π»ΡΡ!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com