Patroni, etcd, HAProxy рд╡рд╛рдкрд░реВрди рдЕрддреНрдпрдВрдд рдЙрдкрд▓рдмреНрдз PostgreSQL рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ

рд╣реЗ рдЕрд╕реЗ рдШрдбрд▓реЗ рдХреА рдЬреНрдпрд╛ рд╡реЗрд│реА рд╕рдорд╕реНрдпрд╛ рд╕рдореЛрд░ рдЖрд▓реА, рддреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рдПрдХрдЯреНрдпрд╛рдиреЗ рд╣реЗ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪрд╛ рдЖрдгрд┐ рд▓реЙрдиреНрдЪ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреБрд░реЗрд╕рд╛ рдЕрдиреБрднрд╡ рдирд╡реНрд╣рддрд╛. рдЖрдгрд┐ рдордЧ рдореА рдЧреБрдЧрд▓рд┐рдВрдЧ рд╕реБрд░реВ рдХреЗрд▓реЗ.

рдорд▓рд╛ рдХрд│рдд рдирд╛рд╣реА рдХреА рдХреЕрдЪ рдХрд╛рдп рдЖрд╣реЗ, рдкрд░рдВрддреБ рдорд▓рд╛ рдпрд╛ рдЧреЛрд╖реНрдЯреАрдЪрд╛ рд╕рд╛рдордирд╛ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрд▓рд╛ рдЖрд╣реЗ рдХреА рдореА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкреНрд░рдорд╛рдгреЗ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЪрд░рдг-рджрд░-рдЪрд░рдг рдХреЗрд▓реЗ рддрд░реАрд╣реА, рд▓реЗрдЦрдХрд╛рдкреНрд░рдорд╛рдгреЗрдЪ рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдХреЗрд▓реЗ, рддрд░ рдХрд╛рд╣реАрд╣реА рдХрд╛рд░реНрдп рдХрд░рдд рдирд╛рд╣реА. рдорд▓рд╛ рдХрд╛рд╣реА рдХрд│рдд рдирд╛рд╣реА рдХреА рдХрд╛рдп рдкреНрд░рдХрд░рдг рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЬреЗрд╡реНрд╣рд╛ рдорд▓рд╛ рд╣реЗ рдкреБрдиреНрд╣рд╛ рд╕рдореЛрд░ рдЖрд▓реЗ рддреЗрд╡реНрд╣рд╛ рдореА рдард░рд╡рд▓реЗ рдХреА рд╕рд░реНрд╡ рдХрд╛рд╣реА рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рдореА рдорд╛рдЭреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд▓рд┐рд╣реАрди. рдПрдХ рдЬреЗ рдирдХреНрдХреАрдЪ рдХрд╛рдо рдХрд░реЗрд▓.

рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

рдЕрд╕реЗ рдШрдбрддреЗ рдХреА рдЗрдВрдЯрд░рдиреЗрдЯ рд╡рд┐рд╡рд┐рдз рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ, рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЖрдгрд┐ рдпрд╛рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрднрд╛рд╡рд╛рдиреЗ рдЧреНрд░рд╕реНрдд рдирд╛рд╣реА. рд╣реЗ рдЕрд╕реЗрдЪ рдШрдбрд▓реЗ рдХреА рдорд▓рд╛ рдПрдХ рдлреЗрд▓рдУрд╡реНрд╣рд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд▓рд╕реНрдЯрд░ рд╕реЛрдпреАрд╕реНрдХрд░рдкрдгреЗ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЙрдкрд╛рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреЗ рдХрд╛рдо рджреЗрдгреНрдпрд╛рдд рдЖрд▓реЗ рд╣реЛрддреЗ, рдЬреНрдпрд╛рд╕рд╛рдареА рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░реВрди рд╕рд░реНрд╡ рдкреНрд░рддрд┐рдХреГрддреАрдВрдордзреНрдпреЗ рдкреНрд░рддрд┐рдХреГрддреА рдкреНрд░рд╡рд╛рд╣рд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдШрдЯрдиреЗрдд рд░рд┐рдЭрд░реНрд╡реНрд╣рдЪреА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рддрд░рддреВрдж рдХрд░рдгреЗ рдпрд╛ рд╣реЛрддреНрдпрд╛. рдЕрдкрдпрд╢

рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рддрдВрддреНрд░рдЬреНрдЮрд╛рдирд╛рдЪрд╛ рд╕реНрдЯреЕрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛:

  • DBMS рдореНрд╣рдгреВрди PostgreSQL
  • рд╕рдВрд░рдХреНрд╖рдХ рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдЙрдкрд╛рдп рдореНрд╣рдгреВрди
  • Patroni рд╕рд╛рдареА рд╡рд┐рддрд░рд┐рдд рд╕реНрдЯреЛрд░реЗрдЬ рдореНрд╣рдгреВрди etcd
  • рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд╛рдкрд░реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрд╕рд╛рдареА рдПрдХрд▓ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреВ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА HAproxy

рд╕реЗрдЯрд┐рдВрдЧ

рддреБрдордЪреНрдпрд╛ рд▓рдХреНрд╖рд╛рд╕рд╛рдареА - Patroni, etcd, HAProxy рд╡рд╛рдкрд░реВрди рдПрдХ рдЕрддреНрдпрдВрдд рдЙрдкрд▓рдмреНрдз PostgreSQL рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ.

рд╕рд░реНрд╡ рдСрдкрд░реЗрд╢рдиреНрд╕ рдбреЗрдмрд┐рдпрди 10 OS рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЖрднрд╛рд╕реА рдорд╢реАрдирд╡рд░ рдХреЗрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛.

рдЗ

рдореА рддреНрдпрд╛рдЪ рдорд╢реАрдирд╡рд░ etcd рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рдд рдирд╛рд╣реА рдЬреЗрдереЗ Patroni рдЖрдгрд┐ postgresql рдЕрд╕реЗрд▓, рдХрд╛рд░рдг рдбрд┐рд╕реНрдХ рд▓реЛрдб etcd рд╕рд╛рдареА рдЦреВрдк рдорд╣рддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ. рдкрдг рд╢реИрдХреНрд╖рдгрд┐рдХ рд╣реЗрддреВрдВрд╕рд╛рдареА рдЖрдореНрд╣реА рддреЗрдЪ рдХрд░реВ.
рдЪрд▓рд╛ рдЗрддреНрдпрд╛рджрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛.

#!/bin/bash
apt-get update
apt-get install etcd

/etc/default/etcd рдлрд╛рдЗрд▓рдордзреНрдпреЗ рд╕рд╛рдордЧреНрд░реА рдЬреЛрдбрд╛

[рд╕рджрд╕реНрдп]

рддреБрдордЪреНрдпрд╛ рдорд╢реАрдирдЪреЗ ETCD_NAME=datanode1 # рд╣реЛрд╕реНрдЯрдирд╛рд╡
ETCD_DATA_DIR=тАЭ/var/lib/etcd/default.etcdтАЭ

рд╕рд░реНрд╡ рдЖрдпрдкреА рдкрддреНрддреЗ рд╡реИрдз рдЕрд╕рд╛рд╡реЗрдд. рд▓рд┐рд╕реНрдЯрд░ рдкреАрдЕрд░, рдХреНрд▓рд╛рдпрдВрдЯ рдЗ. рд╣реЛрд╕реНрдЯрдЪреНрдпрд╛ рдЖрдпрдкреА рдкрддреНрддреНрдпрд╛рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рд╡реЗ

ETCD_LISTEN_PEER_URLS="http://192.168.0.143:2380┬╗ # рддреБрдордЪреНрдпрд╛ рдХрд╛рд░рдЪрд╛ рдкрддреНрддрд╛
ETCD_LISTEN_CLIENT_URLS="http://192.168.0.143:2379,http://127.0.0.1:2379┬╗ # рддреБрдордЪреНрдпрд╛ рдХрд╛рд░рдЪрд╛ рдкрддреНрддрд╛

[рдХреНрд▓рд╕реНрдЯрд░]

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.0.143:2380┬╗ # рддреБрдордЪреНрдпрд╛ рдХрд╛рд░рдЪрд╛ рдкрддреНрддрд╛
ETCD_INITIAL_CLUSTER=┬╗рдбреЗрдЯрд╛рдиреЛрдб1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380┬╗# etcd рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рд╕рд░реНрд╡ рдорд╢реАрдирдЪреЗ рдкрддреНрддреЗ
ETCD_INITIAL_CLUSTER_STATE="рдирд╡реАрди"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1тА│
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379┬╗ # рддреБрдордЪреНрдпрд╛ рдХрд╛рд░рдЪрд╛ рдкрддреНрддрд╛

рдХрдорд╛рдВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рд╛

systemctl restart etcd

PostgreSQL 9.6 + patroni

рдкреНрд░рдердо рддреБрдореНрд╣рд╛рд▓рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреАрди рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рд╕реЗрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдорд╢реАрдиреНрд╕ рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рддреБрдореНрд╣реА рдорд╛рдЭреНрдпрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдЪреЗ рдЕрдиреБрд╕рд░рдг рдХреЗрд▓реНрдпрд╛рд╕, рддреБрдореНрд╣реА рд╣реА рд╕реЛрдкреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡реВ рд╢рдХрддрд╛ рдЬреА рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА (рдЬрд╡рд│рдЬрд╡рд│) рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд░реЗрд▓. рд░реВрдЯ рдореНрд╣рдгреВрди рдЪрд╛рд▓рддреЗ.

рдХреГрдкрдпрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ 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 рдкрддреНрддреЗ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрддреНрддреНрдпрд╛рдВрд╡рд░ рдмрджрд▓рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдпрд╛ рдпрдорд╛рддреАрд▓ рдЯрд┐рдкреНрдкрдгреНрдпрд╛рдВрдХрдбреЗ рд▓рдХреНрд╖ рджреНрдпрд╛. рдХреНрд▓рд╕реНрдЯрд░рдордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрдирд╡рд░ рд╕реНрд╡рддрдГрдЪреЗ рдкрддреНрддреЗ рдмрджрд▓рд╛.

/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 рд╡рд╛рдкрд░рддреЛ. рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдиреЗрд╣рдореА рдорд╢реАрдирдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдЙрдкрд▓рдмреНрдз рдЕрд╕реЗрд▓ рдЬреНрдпрд╛рд╡рд░ HAproxy рддреИрдирд╛рдд рдЖрд╣реЗ.

HAproxy рд╕рд╣ рдорд╢реАрдирд▓рд╛ рдЕрдкрдпрд╢рд╛рдЪрд╛ рдПрдХрдЪ рдмрд┐рдВрджреВ рдмрдирд╡реВ рдирдпреЗ рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рддреЗ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░рдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХрд░реВ; рднрд╡рд┐рд╖реНрдпрд╛рдд рддреЗ K8 рдЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рд▓реЙрдиреНрдЪ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ рдЖрдгрд┐ рдЖрдордЪреНрдпрд╛ рдлреЗрд▓рдУрд╡реНрд╣рд░ рдХреНрд▓рд╕реНрдЯрд░рд▓рд╛ рдЖрдгрдЦреА рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдмрдирд╡реВ рд╢рдХрддреЗ.

рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдпрд╛рд░ рдХрд░рд╛ рдЬрд┐рдереЗ рддреБрдореНрд╣реА рджреЛрди рдлрд╛рдЗрд▓реНрд╕ - Dockerfile рдЖрдгрд┐ haproxy.cfg рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░реВ рд╢рдХрддрд╛. рддреНрдпрд╛рд╡рд░ рдЬрд╛.

рдбреЙрдХрд░рдлрд╛рдЗрд▓

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 рд╢реАрд░реНрд╖рд▓реЗрдЦрд╛рдВрдордзреНрдпреЗ рдорд╛рд╕реНрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдиреЗрд╣рдореА 200 рдкрд░рдд рдХрд░реЗрд▓ рдЖрдгрд┐ рдкреНрд░рддрд┐рдХреГрддреА рдиреЗрд╣рдореА 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 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди, рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╕реНрдЯрд░рд╡рд░ рдЖрдХрдбреЗрд╡рд╛рд░реА рджрд┐рд╕реЗрд▓.

рдорд╛рд╕реНрдЯрд░ рдЕрд╕рд▓реЗрд▓рд╛ рд╕рд░реНрд╡реНрд╣рд░ рдпреВрдкреА рд░рд╛рдЬреНрдпрд╛рдд рдЕрд╕реЗрд▓ рдЖрдгрд┐ рдкреНрд░рддрд┐рдХреГрддреА рдЦрд╛рд▓реА рд╕реНрдерд┐рддреАрдд рдЕрд╕реЗрд▓. рд╣реЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗ, рдЦрд░рдВ рддрд░ рддреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рддреЗ рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ рджрд┐рд╕рддрд╛рдд рдХрд╛рд░рдг рддреЗ HAproxy рдХрдбреАрд▓ рд╡рд┐рдирдВрддреАрд╕рд╛рдареА 503 рдкрд░рдд рдХрд░рддрд╛рдд. рд╣реЗ рдЖрдореНрд╣рд╛рд▓рд╛ рдиреЗрд╣рдореА рдЬрд╛рдгреВрди рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ рдХреА рддреАрди рд╕рд░реНрд╡реНрд╣рд░рдкреИрдХреА рдХреЛрдгрддрд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рд╕реНрдЯрд░ рдЖрд╣реЗ.

рдирд┐рд╖реНрдХрд░реНрд╖

рддреВ рд╕реБрдВрджрд░ рдЖрд╣реЗ! рдХреЗрд╡рд│ 30 рдорд┐рдирд┐рдЯрд╛рдВрдд рддреБрдореНрд╣реА рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреГрддреА рдЖрдгрд┐ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдлреЙрд▓рдмреЕрдХрд╕рд╣ рдЙрддреНрдХреГрд╖реНрдЯ рджреЛрд╖-рд╕рд╣рд┐рд╖реНрдгреБ рдЖрдгрд┐ рдЙрдЪреНрдЪ-рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рддреИрдирд╛рдд рдХреЗрд▓реЗ рдЖрд╣реЗ. рдЬрд░ рддреБрдореНрд╣реА рд╣реЗ рдЙрдкрд╛рдп рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреА рдпреЛрдЬрдирд╛ рдЖрдЦрдд рдЕрд╕рд╛рд▓ рддрд░ рдкрд╣рд╛ рдЕрдзрд┐рдХреГрдд Patroni рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрд╕рд╣, рдЖрдгрд┐ рд╡рд┐рд╢реЗрд╖рдд: patronictl рдпреБрдЯрд┐рд▓рд┐рдЯреАрд╢реА рд╕рдВрдмрдВрдзрд┐рдд, рдЬреЗ рддреБрдордЪреЗ рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдпреАрд╕реНрдХрд░ рдкреНрд░рд╡реЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рдЕрднрд┐рдирдВрджрди!

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛