เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบก PostgreSQL เบ—เบตเปˆเบกเบตเบขเบนเปˆเบชเบนเบ‡เป‚เบ”เบเปƒเบŠเป‰ Patroni, etcd, HAProxy

เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบšเบฑเบ™เบซเบฒเป„เบ”เป‰เบ–เบทเบ posed, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบกเบตเบ›เบฐเบชเบปเบšเบเบฒเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เบขเปˆเบฒเบ‡เบ”เบฝเบง. เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบเปเปˆเป€เบฅเบตเปˆเบก Google.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฑเบšเป„เบ”เป‰, เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเป€เบงเบฅเบฒ umpteenth เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ›เบฐเป€เบŠเบตเบ™เบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป€เบฎเบฑเบ”เบ—เบธเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบ™ tutorial, เบเบฐเบเบฝเบกเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบœเบนเป‰เบ‚เบฝเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบ„เบดเบ”โ€‹เบงเปˆเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เปเบ™เบงโ€‹เปƒเบ”โ€‹, เปเบ•เปˆโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™โ€‹เบ™เบตเป‰โ€‹เบญเบตเบโ€‹เป€เบ—เบทเปˆเบญโ€‹เบซเบ™เบถเปˆเบ‡โ€‹, เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เป„เบ”เป‰โ€‹เบ•เบฑเบ”โ€‹เบชเบดเบ™โ€‹เปƒเบˆโ€‹เบงเปˆเบฒโ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบˆเบฐโ€‹เบ‚เบฝเบ™ tutorial เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹เป€เบญเบ‡โ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบซเบกเบปเบ”โ€‹. เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เปˆเบ™เบญเบ™.

เบ„เบนเปˆเบกเบทเบเปˆเบฝเบงเบเบฑเบšเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”

เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบšเปเปˆเป„เบ”เป‰เบ—เบปเบ™เบ—เบธเบเบˆเบฒเบเบเบฒเบ™เบ‚เบฒเบ”เบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบ•เปˆเบฒเบ‡เป†, tutorials, เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป‚เบ”เบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเป„เบ”เป‰เบ–เบทเบเบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เปเบฅเบฐเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบเบธเปˆเบก PostgreSQL เบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบง, เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ•เบปเป‰เบ™เบ•เปเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปเบกเปˆเบšเบปเบ”เป„เบ›เบซเบฒ replicas เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบญเบ‡เบชเบฐเบซเบ‡เบงเบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš. เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง.

เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ™เบตเป‰, stack เบ‚เบญเบ‡เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเปƒเบŠเป‰เป„เบ”เป‰เบ–เบทเบเบเปเบฒเบ™เบปเบ”:

  • PostgreSQL เป€เบ›เบฑเบ™ DBMS
  • Patroni เป€เบ›เบฑเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบเบธเปˆเบก
  • etcd เป€เบ›เบฑเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ—เบตเปˆเปเบˆเบเบขเบฒเบเบชเปเบฒเบฅเบฑเบš Patroni
  • HAproxy เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบˆเบธเบ”เป€เบ‚เบปเป‰เบฒเบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเปƒเบŠเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™

เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ

เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™ - เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบธเปˆเบก PostgreSQL เบ—เบตเปˆเบกเบตเบขเบนเปˆเบชเบนเบ‡เป‚เบ”เบเปƒเบŠเป‰ Patroni, etcd, HAProxy.

เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡ virtual เบ—เบตเปˆเบกเบต Debian 10 OS เบ•เบดเบ”เบ•เบฑเป‰เบ‡.

เปเบฅเบฐเบญเบทเปˆเบ™

เบ‚เป‰เบญเบเบšเปเปˆเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡ etcd เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ”เบฝเบงเบเบฑเบ™เบ—เบตเปˆ patroni เปเบฅเบฐ postgresql เบˆเบฐเบ•เบฑเป‰เบ‡เบขเบนเปˆ, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เป‚เบซเบผเบ”เปเบœเปˆเบ™เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบš 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 เบ—เบฑเบ‡เปเบปเบ”เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ•เป‰เบญเบ‡. LISTER PEER, Client เปเบฅเบฐเบญเบทเปˆเบ™เป†เบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ•เบฑเป‰เบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบขเบนเปˆ 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 + patroni

เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เปเบกเปˆเบ™เบ•เบฑเป‰เบ‡เบชเบฒเบกเป€เบ„เบทเปˆเบญเบ‡ virtual เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบŠเบญเบšเปเบงเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบชเปˆเบžเบงเบเบกเบฑเบ™. เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ script เบ‡เปˆเบฒเบเป†เบ™เบตเป‰เบ—เบตเปˆเบˆเบฐ (เป€เบเบทเบญเบš) เป€เบฎเบฑเบ”เบ—เบธเบเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™. เปเบฅเปˆเบ™เป€เบ›เบฑเบ™เบฎเบฒเบ.

เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบชเบฐเบ„เบดเบšเปƒเบŠเป‰ 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 เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ›เบซเบฒเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบ—เปˆเบฒเบ™เปƒเบŠเป‰.
เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบ„เปเบฒเป€เบซเบฑเบ™เปƒเบ™ 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 เบงเบดเบ™เบฒเบ—เบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบขเบนเปˆเปƒเบ™ cluster.

HAproxy

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ HAproxy เบ—เบตเปˆเบ”เบตเป€เบฅเบตเบ”เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบญเบ‡เบˆเบธเบ”เบ”เบฝเบงเบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒ. เป€เบŠเบตเบšเป€เบงเบตเปเบกเปˆเปเบšเบšเบˆเบฐเบกเบตเบขเบนเปˆเบชเบฐเป€เปเบตเบขเบนเปˆเบ—เบตเปˆเบ—เบตเปˆเบขเบนเปˆเบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆ HAproxy เบ–เบทเบเบ™เบณเปƒเบŠเป‰.

เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเบกเบต HAproxy เป€เบ›เบฑเบ™เบˆเบธเบ”เบ”เบฝเบงเบ‚เบญเบ‡เบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบผเบง, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบกเบฑเบ™เบขเบนเปˆเปƒเบ™ Docker container; เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ cluster เบ‚เบญเบ‡ K8 เปเบฅเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบเบธเปˆเบก failover เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเบซเบผเบฒเบเบ‚เบถเป‰เบ™.

เบชเป‰เบฒเบ‡เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเบญเบ‡เป„เบŸเบฅเปŒ - 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 เบˆเบฐเบ•เบดเบ”เบ•เปเปˆเบเบฑเบš 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 เปƒเบ™ browser เปเบฅเบฐเบฅเบฐเบšเบธ port 7000, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบชเบฐเบ–เบดเบ•เบดเปƒเบ™ cluster เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆเป€เบ›เบฑเบ™เปเบกเปˆเปเบšเบšเบˆเบฐเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐ UP, เปเบฅเบฐเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบˆเบฐเบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐ DOWN. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบ›เบปเบเบเบฐเบ•เบด, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เบžเบงเบเป€เบ‚เบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบ, เปเบ•เปˆเบžเบงเบเบกเบฑเบ™เบ›เบฒเบเบปเบ”เปเบšเบšเบ™เบตเป‰เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบชเบปเปˆเบ‡เบ„เบทเบ™ 503 เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบ HAproxy. เบญเบฑเบ™เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบชเบฐเป€เปเบตเบงเปˆเบฒเบญเบฑเบ™เปƒเบ”เปƒเบ™เบชเบฒเบกเป€เบŠเบตเบšเป€เบงเบตเปเบกเปˆเบ™เปเบกเปˆเบšเบปเบ”เบ›เบฐเบˆเบธเบšเบฑเบ™.

เบชเบฐเบซเบฅเบธเบš

เป€เบˆเบปเป‰เบฒเบ‡เบฒเบก! เปƒเบ™เป€เบงเบฅเบฒเบžเบฝเบ‡ 30 เบ™เบฒเบ—เบต, เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ™เบณเปƒเบŠเป‰เบเบธเปˆเบกเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” เปเบฅเบฐ เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เบ—เบตเปˆเบ”เบตเบžเป‰เบญเบกเบ”เป‰เบงเบเบเบฒเบ™เบˆเบณเบฅเบญเบ‡เปเบšเบšเบชเบฐเบ•เบฃเบตเบกเบกเบดเบ‡ เปเบฅเบฐ เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบเปเบฒเบฅเบฑเบ‡เบงเบฒเบ‡เปเบœเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰, เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡ เบเบฑเบšเป€เบญเบเบฐเบชเบฒเบ™ Patroni เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™, เปเบฅเบฐเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบžเบฒเบเบชเปˆเบงเบ™เบ‚เบญเบ‡เบ•เบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” patronictl, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบชเบฐเบ”เบงเบเปƒเบ™เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบเบธเปˆเบกเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบŠเบปเบกเป€เบŠเบตเบ!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™