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"

เชฌเชงเชพ 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=ยปเชกเซ‡เชŸเชพเชจเซ‹เชก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-เช•เซเชฒเชธเซเชŸเชฐ-1โ€ณ
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.143:2379เชคเชฎเชพเชฐเซ€ เช•เชพเชฐเชจเซเช‚ # เชธเชฐเชจเชพเชฎเซเช‚

เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเซ‹

systemctl restart etcd

PostgreSQL 9.6 + patroni

เชคเชฎเชพเชฐเซ‡ เชœเซ‡ เชชเซเชฐเชฅเชฎ เชตเชธเซเชคเซ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เชคเซเชฐเชฃ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‹ เชคเซ‡เชฎเชจเชพ เชชเชฐ เชœเชฐเซ‚เชฐเซ€ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เช›เซ‡. เชฎเชถเซ€เชจเซ‹ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชœเซ‹ เชคเชฎเซ‡ เชฎเชพเชฐเชพ เชŸเซเชฏเซเชŸเซ‹เชฐเซ€เชฏเชฒเชจเซ‡ เช…เชจเซเชธเชฐเซ‹ เช›เซ‹, เชคเซ‹ เชคเชฎเซ‡ เช† เชธเชฐเชณ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ (เชฒเช—เชญเช—) เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชฌเชงเซเช‚ เชœ เช•เชฐเชถเซ‡. เชฐเซเชŸ เชคเชฐเซ€เช•เซ‡ เชšเชพเชฒเซ‡ เช›เซ‡.

เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชงเซ‹ เช•เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ PostgreSQL เชธเช‚เชธเซเช•เชฐเชฃ 9.6 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เช† เช…เชฎเชพเชฐเซ€ เช•เช‚เชชเชจเซ€เชจเซ€ เช†เช‚เชคเชฐเชฟเช• เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เช•เชพเชฐเชฃเซ‡ เช›เซ‡. เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒเชจเชพ เช…เชจเซเชฏ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชชเชฐ เช‰เช•เซ‡เชฒเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจเชฅเซ€.

#!/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. เชคเซ‡เชจเชพ เชชเชฐ เชœเชพเช“.

เชกเซ‹เช•เชฐเชซเชพเช‡เชฒ

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹