Patroni, etcd, HAProxy เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดณเดฐเต† เดฒเดญเตเดฏเดฎเดพเดฏ เด’เดฐเต PostgreSQL เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต

เดชเตเดฐเดถเตเดจเด‚ เด‰เดจเตเดจเดฏเดฟเดšเตเดš เดธเดฎเดฏเดคเตเดคเต, เดˆ เดชเดฐเดฟเดนเดพเดฐเด‚ เดฎเดพเดคเตเดฐเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเดจเตเด‚ เดŽเดจเดฟเด•เตเด•เต เดฎเดคเดฟเดฏเดพเดฏ เด…เดจเตเดญเดตเด‚ เด‡เดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต. เดชเดฟเดจเตเดจเต† เดžเดพเตป เด—เต‚เด—เดฟเตพ เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เดฟ.

เด•เตเดฏเดพเดšเตเดšเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดŽเดจเดฟเด•เตเด•เดฑเดฟเดฏเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเดฒเดฟเดฒเต†เดจเตเดจเดชเต‹เดฒเต† เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเดฟ เดŽเดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดคเดพเดฒเตเด‚ เดฐเดšเดฏเดฟเดคเดพเดตเดฟเดจเตเดฑเต† เด…เดคเต‡ เด…เดจเตเดคเดฐเต€เด•เตเดทเด‚ เด’เดฐเตเด•เตเด•เตเด•, เดชเดฟเดจเตเดจเต† เด’เดจเตเดจเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ เดŽเดจเตเดจ เดตเดธเตเดคเตเดค เดชเดคเดฟเดจเดพเดฒเดพเด‚ เดคเดตเดฃ เดžเดพเตป เด…เดญเดฟเดฎเตเด–เต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดคเดพเดฃเต เด•เดพเดฐเตเดฏเดฎเต†เดจเตเดจเต เดŽเดจเดฟเด•เตเด•เดฑเดฟเดฏเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เด‡เดคเต เดตเต€เดฃเตเดŸเตเด‚ เดจเต‡เดฐเดฟเดŸเตเดŸเดชเตเดชเต‹เตพ, เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเด•เตเดฎเตเดชเต‹เตพ เดŽเดจเตเดฑเต† เดธเตเดตเดจเตเดคเด‚ เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเตฝ เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด’เดจเตเดจเต.

เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเดฒเต† เด—เตˆเดกเตเด•เตพ

เดตเดฟเดตเดฟเดง เด—เตˆเดกเตเด•เตพ, เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเดฒเตเด•เตพ, เด˜เดŸเตเดŸเด‚ เด˜เดŸเตเดŸเดฎเดพเดฏเตเดณเตเดณ เดคเตเดŸเด™เตเด™เดฟเดฏเดตเดฏเตเดŸเต† เด…เดญเดพเดตเด‚ เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเต เด…เดจเตเดญเดตเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เด’เดฐเต เดชเดฐเดพเดœเดฏ PostgreSQL เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดŽเดจเตเดจเต† เดšเตเดฎเดคเดฒเดชเตเดชเต†เดŸเตเดคเตเดคเดฟ, เด…เดคเดฟเดจเตเดฑเต† เดชเตเดฐเดงเดพเดจ เด†เดตเดถเตเดฏเด•เดคเด•เตพ เดฎเดพเดธเตเดฑเตเดฑเตผ เดธเต†เตผเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดฒเตเดฒเดพ เดชเด•เตผเดชเตเดชเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดชเด•เตผเดชเตเดชเตเด•เตพ เดธเตเดŸเตเดฐเต€เด‚ เดšเต†เดฏเตเดฏเดฒเตเด‚ เด’เดฐเต เดฎเดพเดธเตเดฑเตเดฑเตผ เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด’เดฐเต เด•เดฐเตเดคเตฝ เดธเตเดตเดฏเดฎเต‡เดต เดจเตฝเด•เดฒเตเด‚ เด†เดฏเดฟเดฐเตเดจเตเดจเต. เดชเดฐเดพเดœเดฏเด‚.

เดˆ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ, เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเด•เดณเตเดŸเต† เดถเต‡เด–เดฐเด‚ เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดšเตเดšเต:

  • เด’เดฐเต DBMS เด†เดฏเดฟ PostgreSQL
  • เดชเดคเตเดฐเต‹เดฃเดฟ เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเด‚เด—เต เดชเดฐเดฟเดนเดพเดฐเดฎเดพเดฏเดฟ
  • เดคเตเดŸเด™เตเด™เดฟเดฏเดต เดชเดคเตเดฐเต‹เดฃเดฟเด•เตเด•เต เดตเดฟเดคเดฐเดฃเด‚ เดšเต†เดฏเตเดค เดธเด‚เดญเดฐเดฃเดฎเดพเดฏเดฟ
  • เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเตŠเดฑเตเดฑ เดŽเตปเดŸเตเดฐเดฟ เดชเต‹เดฏเดฟเดจเตเดฑเต เดธเด‚เด˜เดŸเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ HAproxy

เด‡เตปเดธเตเดฑเตเดฑเดฒเต‡เดทเตป

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเตเด•เตเด•เต - Patroni, etcd, HAProxy เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดตเดณเดฐเต† เดฒเดญเตเดฏเดฎเดพเดฏ PostgreSQL เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•.

เดกเต†เดฌเดฟเดฏเตป 10 เด’เดŽเดธเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเด•เดณเดฟเดฒเดพเดฃเต เดŽเดฒเตเดฒเดพ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดจเดŸเดคเตเดคเดฟเดฏเดคเต.

เดคเตเดŸเด™เตเด™เดฟเดฏเดต

patroni, postgresql เดŽเดจเตเดจเดฟเดต เดธเตเดฅเดฟเดคเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจ เด…เดคเต‡ เดฎเต†เดทเต€เดจเตเด•เดณเดฟเตฝ etcd เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚ etcd-เด•เตเด•เต เดกเดฟเดธเตเด•เต เดฒเต‹เดกเต เดตเดณเดฐเต† เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต. เดŽเดจเตเดจเดพเตฝ เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ, เดžเด™เตเด™เตพ เด…เดคเต เดšเต†เดฏเตเดฏเตเด‚.
etcd เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚.

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

/etc/default/etcd เดซเดฏเดฒเดฟเดฒเต‡เด•เตเด•เต เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดšเต‡เตผเด•เตเด•เตเด•

[เด…เด‚เด—เด‚]

ETCD_NAME=datanode1 # เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฎเต†เดทเต€เดจเตเดฑเต† เดนเต‹เดธเตเดฑเตเดฑเตเดจเดพเดฎเด‚
ETCD_DATA_DIR=โ€/var/lib/etcd/default.etcdโ€

เดŽเดฒเตเดฒเดพ IP เดตเดฟเดฒเดพเดธเด™เตเด™เดณเตเด‚ เดธเดพเดงเตเดคเดฏเตเดณเตเดณเดคเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚. เดฒเดฟเดธเตเดฑเตเดฑเตผ เดชเดฟเดฏเตผ, เด•เตเดฒเดฏเดจเตเดฑเต เดคเตเดŸเด™เตเด™เดฟเดฏเดตเตผ เดนเต‹เดธเตเดฑเตเดฑเดฟเดจเตเดฑเต† เดเดชเดฟ เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เดฃเด‚

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 เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต† เดŽเดฒเตเดฒเดพ เดฎเต†เดทเต€เดจเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดตเดฟเดฒเดพเดธเด™เตเด™เตพ
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 + เดฐเด•เตเดทเดพเดงเดฟเด•เดพเดฐเดฟ

เด†เดตเดถเตเดฏเดฎเดพเดฏ เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เดฎเต‚เดจเตเดจเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเด•เตพ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เดจเดฟเด™เตเด™เตพ เด†เดฆเตเดฏเด‚ เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต. เดฎเต†เดทเต€เดจเตเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดค เดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพ เดŽเดจเตเดฑเต† เดŸเตเดฏเต‚เดŸเตเดŸเต‹เดฑเดฟเดฏเตฝ เดชเดฟเดจเตเดคเตเดŸเดฐเตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดคเต (เดเดคเดพเดฃเตเดŸเต) เดจเดฟเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดŽเดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดฏเตเด‚. เดฑเต‚เดŸเตเดŸเต เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.

เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต 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 เด‰เดณเตเดณ เดฏเดจเตเดคเตเดฐเดคเตเดคเต† เดชเดฐเดพเดœเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดชเต‹เดฏเดฟเดจเตเดฑเต เด†เด•เตเด•เดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป, เดžเด™เตเด™เตพ เด…เดคเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตฝ เดฒเต‹เดžเตเดšเต เดšเต†เดฏเตเดฏเตเด‚; เดญเดพเดตเดฟเดฏเดฟเตฝ เด‡เดคเต 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 เดฎเดฟเดจเดฟเดฑเตเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดจเดฟเด™เตเด™เตพ เดธเตเดŸเตเดฐเต€เดฎเดฟเด‚เด—เต เดฑเต†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด‚ เด“เดŸเตเดŸเต‹เดฎเดพเดฑเตเดฑเดฟเด•เต เดซเดพเตพเดฌเดพเด•เตเด•เตเด‚ เด‰เดณเตเดณ เดฎเดฟเด•เดšเตเดš เดชเดฟเดดเดตเต-เดธเดนเดฟเดทเตเดฃเตเดคเดฏเตเดณเตเดณเดคเตเด‚ เด‰เดฏเตผเดจเตเดจ เดชเตเดฐเด•เดŸเดจเดฎเตเดณเตเดณเดคเตเดฎเดพเดฏ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด•เตเดฒเดธเตเดฑเตเดฑเตผ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเต. เดจเดฟเด™เตเด™เตพ เดˆ เดชเดฐเดฟเดนเดพเดฐเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เด™เตเด•เดฟเตฝ, เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเด• เด”เดฆเตเดฏเต‹เด—เดฟเด• เดชเดคเตเดฐเต‹เดฃเดฟ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เดธเดนเดฟเดคเด‚, เดชเตเดฐเดคเตเดฏเต‡เด•เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เด†เด•เตโ€Œเดธเดธเต เดจเตฝเด•เตเดจเตเดจ patronictl เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเต†เดŸเตเดŸ เด…เดคเดฟเดจเตเดฑเต† เดญเดพเด—เด‚.

เด…เดญเดฟเดจเดจเตเดฆเดจเด™เตเด™เตพ!

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•