Patroni, etcd, HAProxy เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจ‰เจชเจฒเจฌเจง PostgreSQL เจ•เจฒเฉฑเจธเจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ

เจ‡เจน เจธเจฟเจฐเจซ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉ‹เจ‡เจ† เจ•เจฟ เจœเจฟเจธ เจธเจฎเฉ‡เจ‚ เจธเจฎเฉฑเจธเจฟเจ† เจ–เฉœเฉเจนเฉ€ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€, เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจฒ เจ‡เจ•เฉฑเจฒเฉ‡ เจ‡เจธ เจนเฉฑเจฒ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจฒเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ•เจพเจซเจผเฉ€ เจคเจœเจฐเจฌเจพ เจจเจนเฉ€เจ‚ เจธเฉ€เฅค เจ…เจคเฉ‡ เจซเจฟเจฐ เจฎเฉˆเจ‚ เจ—เฉ‚เจ—เจฒเจฟเฉฐเจ— เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเฉ€เฅค

เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจ•เจฟ เจ•เฉˆเจš เจ•เฉ€ เจนเฉˆ, เจชเจฐ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เจธ เจคเฉฑเจฅ เจฆเจพ เจธเจพเจฎเฉเจนเจฃเจพ เจ•เจฐเจจเจพ เจชเฉˆ เจฐเจฟเจนเจพ เจนเฉˆ เจ•เจฟ เจญเจพเจตเฉ‡เจ‚ เจฎเฉˆเจ‚ เจŸเจฟเจŠเจŸเฉ‹เจฐเจฟเจ…เจฒ เจตเจพเจ‚เจ— เจ•เจฆเจฎ-เจฆเจฐ-เจ•เจฆเจฎ เจธเจญ เจ•เฉเจ เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจฒเฉ‡เจ–เจ• เจตเจพเจ‚เจ— เจตเจพเจคเจพเจตเจฐเจฃ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเจพเจ‚, เจซเจฟเจฐ เจ•เฉเจ เจตเฉ€ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจ•เจฟ เจฎเจพเจฎเจฒเจพ เจ•เฉ€ เจนเฉˆ, เจชเจฐ เจœเจฆเฉ‹เจ‚ เจฎเฉˆเจ‚ เจ‡เจธ เจฆเจพ เจฆเฉเจฌเจพเจฐเจพ เจธเจพเจนเจฎเจฃเจพ เจ•เฉ€เจคเจพ, เจฎเฉˆเจ‚ เจซเฉˆเจธเจฒเจพ เจ•เฉ€เจคเจพ เจ•เจฟ เจœเจฆเฉ‹เจ‚ เจธเจญ เจ•เฉเจ เจ เฉ€เจ• เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ เจคเจพเจ‚ เจฎเฉˆเจ‚ เจ†เจชเจฃเจพ เจŸเจฟเจŠเจŸเฉ‹เจฐเจฟเจ…เจฒ เจฒเจฟเจ–เจพเจ‚เจ—เจพเฅค เจ‡เฉฑเจ• เจœเฉ‹ เจฏเจ•เฉ€เจจเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเฉ‡เจ—เจพ.

เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ 'เจคเฉ‡ เจ—เจพเจˆเจก

เจ…เจœเจฟเจนเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจตเฉฑเจ–-เจตเฉฑเจ– เจ—เจพเจˆเจกเจพเจ‚, เจŸเจฟเจŠเจŸเฉ‹เจฐเจฟเจ…เจฒเจธ, เจ•เจฆเจฎ-เจฆเจฐ-เจ•เจฆเจฎ เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€ เจ•เจฎเฉ€ เจคเฉ‹เจ‚ เจชเฉ€เฉœเจค เจจเจนเฉ€เจ‚ เจนเฉˆ. เจ…เจœเจฟเจนเจพ เจนเฉ€ เจนเฉ‹เจ‡เจ† เจนเฉˆ เจ•เจฟ เจฎเฉˆเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉ‡เจฒเจ“เจตเจฐ PostgreSQL เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจขเฉฐเจ— เจจเจพเจฒ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจนเฉฑเจฒ เจตเจฟเจ•เจธเจฟเจค เจ•เจฐเจจ เจฆเจพ เจ•เฉฐเจฎ เจธเฉŒเจ‚เจชเจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจœเจฟเจธ เจฒเจˆ เจฎเฉเฉฑเจ– เจฒเฉ‹เฉœเจพเจ‚ เจฎเจพเจธเจŸเจฐ เจธเจฐเจตเจฐ เจคเฉ‹เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€เจ†เจ‚ เจฒเจˆ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจคเฉ€ เจจเฉ‚เฉฐ เจธเจŸเฉเจฐเฉ€เจฎ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจฎเจพเจธเจŸเจฐ เจธเจฐเจตเจฐ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฐเจฟเจœเจผเจฐเจต เจฆเฉ€ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจตเจฟเจตเจธเจฅเจพ เจ•เจฐเจจเจพ เจธเฉ€เฅค เจ…เจธเจซเจฒเจคเจพ

เจ‡เจธ เจชเฉœเจพเจ… 'เจคเฉ‡, เจตเจฐเจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€เจ†เจ‚ เจฆเจพ เจธเจŸเฉˆเจ• เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€:

  • PostgreSQL เจ‡เฉฑเจ• DBMS เจตเจœเฉ‹เจ‚
  • เจธเจฐเจชเฉเจฐเจธเจค เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐเจฟเฉฐเจ— เจนเฉฑเจฒ เจตเจœเฉ‹เจ‚
  • Patroni เจฒเจˆ เจตเฉฐเจกเฉ‡ เจธเจŸเฉ‹เจฐเฉ‡เจœเจผ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ etcd
  • เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจตเจพเจฒเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ เจเจ‚เจŸเจฐเฉ€ เจชเฉเจ†เจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจธเฉฐเจ—เจ เจฟเจค เจ•เจฐเจจ เจฒเจˆ HAproxy

เจธเฉˆเจŸเจฟเฉฐเจ—

เจคเฉเจนเจพเจกเฉ‡ เจงเจฟเจ†เจจ เจฒเจˆ - Patroni, etcd, HAProxy เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจ‰เจชเจฒเจฌเจง PostgreSQL เจ•เจฒเฉฑเจธเจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพเฅค

เจธเจพเจฐเฉ‡ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจกเฉ‡เจฌเฉ€เจ…เจจ 10 OS เจจเจพเจฒ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ 'เจคเฉ‡ เจ•เฉ€เจคเฉ‡ เจ—เจ เจธเจจเฅค

เจ†เจฆเจฟ

เจฎเฉˆเจ‚ เจ‰เจนเฉ€ เจฎเจธเจผเฉ€เจจเจพเจ‚ 'เจคเฉ‡ 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 เจชเจคเฉ‡ เจตเฉˆเจง เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจเฅค เจฒเจฟเจธเจŸเจฐ เจชเฉ€เจ…เจฐ, เจ•เจฒเจพเจ‡เฉฐเจŸ เจ†เจฆเจฟ เจจเฉ‚เฉฐ เจฎเฉ‡เจœเจผเจฌเจพเจจ เจฆเฉ‡ 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-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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹