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

рд╣реБрдЖ рдпреВрдВ рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдордиреЗ рдЖрдИ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдХреЗрд▓реЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдерд╛ред рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдЧреВрдЧрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдирдЧрд┐рдирдд рдмрд╛рд░ рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдореИрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рдЪрд░рдг рджрд░ рдЪрд░рдг рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдЦрдХ рдХреЗ рд╕рдорд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдлрд┐рд░ рднреА рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореБрдЭреЗ рджреЛрдмрд╛рд░рд╛ рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рддреЛ рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЬрдм рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рддреЛ рдореИрдВ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд▓рд┐рдЦреВрдВрдЧрд╛ред рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛.

рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛рдПрдБ

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

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкреНрд░рдпреБрдХреНрдд рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХрд╛ рдвреЗрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

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

рд╕реНрдерд╛рдкрдирд╛

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

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

рдЗрддреНрдпрд╛рджрд┐

рдореИрдВ рдЙрдиреНрд╣реАрдВ рдорд╢реАрдиреЛрдВ рдкрд░ рдЖрджрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдкреЗрдЯреНрд░реЛрдиреА рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕реНрдХреНрд▓ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд╕реНрдХ рд▓реЛрдб рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд▓реЗрдХрд┐рди рд╢реИрдХреНрд╖рд┐рдХ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдпрд╣реА рдХрд░реЗрдВрдЧреЗред
рдЖрдЗрдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдЖрджрд┐ред

#!/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='datanode1=http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380┬╗ # рдЖрджрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рднреА рдорд╢реАрдиреЛрдВ рдХреЗ рдкрддреЗ
ETCD_INITIAL_CLUSTER_STATE='рдирдпрд╛'
ETCD_INITIAL_CLUSTER_TOKEN='etcd-рдХреНрд▓рд╕реНрдЯрд░-1тА│
ETCD_ADVERTISE_CLIENT_URLS=''http://192.168.0.143:2379┬╗ # рдЖрдкрдХреА рдХрд╛рд░ рдХрд╛ рдкрддрд╛

рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

systemctl restart etcd

PostgreSQL 9.6 + рд╕рдВрд░рдХреНрд╖рдХ

рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдЙрди рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред рдорд╢реАрдиреЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП (рд▓рдЧрднрдЧ) рд╕рдм рдХреБрдЫ рдХрд░реЗрдЧреАред рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ.

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ 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 рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓рдиреА рд╣реЛрдЧреА, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдЖрдИрдкреА рдкрддреЗ рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрддреЗ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ 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 рддреИрдирд╛рдд рд╣реИред

HAproxy рд╡рд╛рд▓реА рдорд╢реАрди рдХреЛ рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рдПрдХ рднреА рдмрд┐рдВрджреБ рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВрдЧреЗ; рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ K8 рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдлреЗрд▓рдУрд╡рд░ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдФрд░ рднреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рдЖрдк рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - 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 рдкреЗрдЯреНрд░реЛрдиреА рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдЧрд╛, 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 рдорд┐рдирдЯ рдореЗрдВ рдЖрдкрдиреЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░рддрд┐рдХреГрддрд┐ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдлрд╝реЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рджреЛрд╖-рд╕рд╣рд┐рд╖реНрдгреБ рдФрд░ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдВрд░рдХреНрд╖рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд╕рд╛рде, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд░рдХреНрд╖рдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЗрд╕рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде, рдЬреЛ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ