Patroni, etcd, HAProxy рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрд▓рдмреНрдз PostgreSQL рдХреНрд▓рд╕реНрдЯрд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ

рдпреЛ рдпрд╕реНрддреЛ рднрдпреЛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЦрдбрд╛ рднрдПрдХреЛ рд╕рдордпрдорд╛, рдорд╕рдБрдЧ рдПрдХреНрд▓реИ рдпреЛ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрди рд░ рд╕реБрд░реБ рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рдерд┐рдПрдиред рдЕрдирд┐ рдореИрд▓реЗ рдЧреБрдЧрд▓рд┐рдЩ рд╕реБрд░реБ рдЧрд░реЗрдВред

рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдХреНрдпрд╛рдЪ рд╣реЛ, рддрд░ рдо рдпреЛ рддрдереНрдпрдХреЛ рд╕рд╛рдордирд╛ рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреБ рдХрд┐ рдореИрд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдорд╛ рдЬрд╕реНрддреИ рд╕рдмреИ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрд░реЗ рдкрдирд┐, рд▓реЗрдЦрдХрдХреЛ рдЬрд╕реНрддреИ рд╡рд╛рддрд╛рд╡рд░рдг рддрдпрд╛рд░ рдЧрд░реЗ, рддрдм рдХреЗрд╣рд┐ рдкрдирд┐ рдХрд╛рдо рдЧрд░реНрджреИрдиред рдорд▓рд╛рдИ рдХреЗ рд╣реЛ рднрдиреНрдиреЗ рдХреБрд░рд╛ рдерд╛рд╣рд╛ рдЫреИрди, рддрд░ рдЬрдм рдореИрд▓реЗ рдпреЛ рдлреЗрд░рд┐ рд╕рд╛рдордирд╛ рдЧрд░реЗрдВ, рдореИрд▓реЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ рдХрд┐ рдо рдореЗрд░реЛ рдЖрдлреНрдиреИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд▓реЗрдЦреНрдиреЗ рдЫреБ рдЬрдм рд╕рдмреИ рдХреБрд░рд╛ рдХрд╛рдо рдЧрд░реНрджрдЫред рдПрдХ рдЬрд╕рд▓реЗ рдкрдХреНрдХреИ рдХрд╛рдо рдЧрд░реНрдиреЗрдЫред

рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдЧрд╛рдЗрдбрд╣рд░реВ

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

рдпрд╕ рдЪрд░рдгрдорд╛, рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рд╕реНрдЯреНрдпрд╛рдХ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ:

  • PostgreSQL DBMS рдХреЛ рд░реВрдкрдорд╛
  • рд╕рдВрд░рдХреНрд╖рдХ рдХреНрд▓рд╕реНрдЯрд░рд┐рдЩ рд╕рдорд╛рдзрд╛рдирдХреЛ рд░реВрдкрдорд╛
  • Patroni рдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рддрд░рд┐рдд рднрдгреНрдбрд╛рд░рдг рд░реВрдкрдорд╛ etcd
  • рдбрд╛рдЯрд╛рдмреЗрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдиреНрджреБ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрди HAproxy

рд╕реЗрдЯрд┐рдЩ

рддрдкрд╛рдИрдВрдХреЛ рдзреНрдпрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ - Patroni, etcd, HAProxy рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЙрдЪреНрдЪ рдЙрдкрд▓рдмреНрдз PostgreSQL рдХреНрд▓рд╕реНрдЯрд░ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИред

рд╕рдмреИ рдЕрдкрд░реЗрд╕рдирд╣рд░реВ рдбреЗрдмрд┐рдпрди 10 рдУрдПрд╕ рд╕реНрдерд╛рдкрдирд╛ рднрдПрдХреЛ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдЖрджрд┐

рдо рдПрдЙрдЯреИ рдореЗрд╕рд┐рдирд╣рд░реВрдорд╛ 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=┬╗рдбреЗрдЯрд╛рдиреЛрдбрез=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 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрд░, рддрдкрд╛рдИрдВрд▓реЗ рдЖрдлреНрдиреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫред

рд╕рд░реНрднрд░ рдЬреБрди рдорд╛рд╕реНрдЯрд░ рд╣реЛ рддреНрдпреЛ UP рд░рд╛рдЬреНрдпрдорд╛ рд╣реБрдиреЗрдЫ, рд░ рдкреНрд░рддрд┐рдХреГрддрд┐рд╣рд░реВ DOWN рд░рд╛рдЬреНрдпрдорд╛ рд╣реБрдиреЗрдЫрдиреНред рдпреЛ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ, рд╡рд╛рд╕реНрддрд╡рдорд╛ рддрд┐рдиреАрд╣рд░реВ рдХрд╛рдо рдЧрд░реНрдЫрдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВ рдпрд╕рд░реА рджреЗрдЦрд╛ рдкрд░реНрджрдЫрдиреН рдХрд┐рдирднрдиреЗ рддрд┐рдиреАрд╣рд░реВ HAproxy рдмрд╛рдЯ рдЕрдиреБрд░реЛрдзрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ 503 рдлрд░реНрдХрд╛рдЙрдБрдЫрдиреНред рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдзреИрдВ рдЬрд╛рдиреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рдХрд┐ рддреАрди рд╕рд░реНрднрд░рд╣рд░реВ рдордзреНрдпреЗ рдХреБрди рд╣рд╛рд▓рдХреЛ рдорд╛рд╕реНрдЯрд░ рд╣реЛред

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

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

рдмрдзрд╛рдИ рдЫ!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди