ื‘ื•ื™ืขืŸ ืึท ื”ืขื›ืกื˜ ื‘ื ื™ืžืฆื PostgreSQL ืงื ื•ื™ืœ ืžื™ื˜ Patroni, ืขื˜ืง, HAProxy

ืขืก ืคึผื•ื ืงื˜ ืึทื–ื•ื™ ื’ืขื˜ืจืืคืŸ ืึทื– ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜ ื•ื•ืขืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ื’ืขื•ื•ืขืŸ ื’ืขืฉื˜ืขืœื˜, ืื™ืš ื”ืื˜ ื ื™ืฉื˜ ื”ืึธื‘ืŸ ื’ืขื ื•ื’ ื“ืขืจืคืึทืจื•ื ื’ ืฆื• ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ืื•ืŸ ืงืึทื˜ืขืจ ื“ืขื ืœื™ื™ื–ื•ื ื’ ืึทืœื™ื™ืŸ. ืื•ืŸ ื“ืขืžืึธืœื˜ ืื™ืš ืกื˜ืึทืจื˜ืขื“ ื’ื•ื’ืœื™ื ื’.

ืื™ืš ื•ื•ื™ื™ืก ื ื™ืฉื˜ ื•ื•ืืก ื“ื™ ื›ืืค ืื™ื–, ืื‘ืขืจ ืฆื•ื ืืคื˜ืŸ ืžืืœ ืฉื˜ืขืœ ืื™ืš ื–ื™ืš ืžื™ื˜ ื“ืขื ืคืืงื˜ ืื– ืืคื™ืœื• ืื•ื™ื‘ ืื™ืš ื˜ื• ืืœืขืก ืฉืจื™ื˜ ืคืืจ ืฉืจื™ื˜ ื•ื•ื™ ืื™ืŸ ื“ื™ ื˜ื•ื˜ืึธืจื™ืึทืœ, ื’ืจื™ื™ื˜ืŸ ื–ื™ืš ื“ื™ ื–ืขืœื‘ืข ืกื‘ื™ื‘ื” ื•ื•ื™ ื“ืขืจ ืžื—ื‘ืจ, ื“ืึทืŸ ืึทืจื‘ืขื˜ ืงื™ื™ื ืžืึธืœ ื’ืึธืจื ื™ืฉื˜. ืื™ืš ื”ืึธื‘ ืงื™ื™ืŸ ื’ืขื“ืึทื ืง ื•ื•ืึธืก ืื™ื– ื“ืขืจ ืขื ื™ืŸ, ืึธื‘ืขืจ ื•ื•ืขืŸ ืื™ืš ื’ืขืคึผืœืึธื ื˜ืขืจื˜ ื“ืขื ื•ื•ื™ื“ืขืจ, ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืึทื– ืื™ืš ื•ื•ืขืœ ืฉืจื™ื™ึทื‘ืŸ ืžื™ื™ืŸ ืื™ื™ื’ืขื ืข ื˜ื•ื˜ืึธืจื™ืึทืœ ื•ื•ืขืŸ ืึทืœืฅ ืึทืจื‘ืขื˜ ืื•ื™ืก. ืื™ื™ื ืขืจ ื•ื•ืึธืก ื•ื•ืขื˜ ื‘ืืฉื˜ื™ืžื˜ ืึทืจื‘ืขื˜.

ื’ื•ื™ื“ืขืก ืื•ื™ืฃ ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ

ืขืก ืื™ื– ืคึผื•ื ืงื˜ ืึทื–ื•ื™ ื›ืึทืคึผืึทื ื– ืึทื– ื“ืขืจ ืื™ื ื˜ืขืจื ืขืฅ ืœื™ื™ึทื“ืŸ ื ื™ืฉื˜ ืคื•ืŸ ืึท ืคืขืœืŸ ืคื•ืŸ ืคืึทืจืฉื™ื“ืŸ ืคื™ืจืขืจ, ื˜ื•ื˜ืึธืจื™ืึทืœื–, ืฉืจื™ื˜-ื“ื•ืจืš-ืฉืจื™ื˜ ืื•ืŸ ื“ื™ ื•ื•ื™. ืขืก ืคึผื•ื ืงื˜ ืึทื–ื•ื™ ื’ืขื˜ืจืืคืŸ ืึทื– ืื™ืš ืื™ื– ื’ืขื•ื•ืขืŸ ื˜ืึทืกืงื˜ ืžื™ื˜ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืึท ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™ ืึธืจื’ืึทื ื™ื–ื™ืจืŸ ืื•ืŸ ื‘ื•ื™ืขืŸ ืึท ืคืึทื™ืœืึธื•ื•ืขืจ PostgreSQL ืงื ื•ื™ืœ, ื“ื™ ื”ื•ื™ืคึผื˜ ืจืขืงื•ื•ื™ืจืขืžืขื ืฅ ืคึฟืึทืจ ื•ื•ืึธืก ื–ืขื ืขืŸ ืกื˜ืจื™ืžื™ื ื’ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ื”ืืจ ืกืขืจื•ื•ืขืจ ืฆื• ืึทืœืข ืจืขืคึผืœืึทืงืึทื– ืื•ืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ืคึผืจืึทื•ื•ื™ื–ืฉืึทื ื– ืคื•ืŸ ืึท ืจืขื–ืขืจื•ื• ืื™ืŸ ื“ื™ ื’ืขืฉืขืขื ื™ืฉ ืคื•ืŸ ืึท ื”ืืจ ืกืขืจื•ื•ืขืจ ื“ื•ืจื›ืคืึทืœ.

ืื™ืŸ ื“ืขื ื‘ื™ื ืข, ื“ื™ ืึธื ืœื™ื™ื’ืŸ ืคื•ืŸ ื˜ืขืงื ืึทืœืึทื“ื–ืฉื™ื– ื’ืขื ื™ืฆื˜ ืื™ื– ื‘ืืฉืœืืกืŸ:

  • PostgreSQL ื•ื•ื™ ืึท DBMS
  • ืคึผืึทื˜ืจืึธื ื™ ื•ื•ื™ ืึท ืงืœืึทืกื˜ืขืจื™ื ื’ ืœื™ื™ื–ื•ื ื’
  • ืขื˜ืง ื•ื•ื™ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ืกื˜ืึธืจื™ื“ื–ืฉ ืคึฟืึทืจ Patroni
  • HAproxy ืคึฟืึทืจ ืึธืจื’ืึทื ื™ื™ื–ื™ื ื’ ืึท ืื™ื™ืŸ ืคึผืึธื–ื™ืฆื™ืข ืคื•ื ื˜ ืคึฟืึทืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื ื™ืฆืŸ ื“ื™ ื“ืึทื˜ืึทื‘ื™ื™ืก

ื™ื ืกื˜ืึทืœื™ืจื•ื ื’

ืคึฟืึทืจ ื“ื™ื™ืŸ ื•ืคืžืขืจืงื–ืึทืžืงื™ื™ื˜ - ื‘ื•ื™ืขืŸ ืึท ื”ืขื›ืกื˜ ื‘ื ื™ืžืฆื PostgreSQL ืงื ื•ื™ืœ ืžื™ื˜ Patroni, ืขื˜ืง, HAProxy.

ืึทืœืข ืึทืคึผืขืจื™ื™ืฉืึทื ื– ื–ืขื ืขืŸ ื“ื•ืจื›ื’ืขืงืึธื›ื˜ ืื•ื™ืฃ ื•ื•ื™ืจื˜ื•ืึทืœ ืžืืฉื™ื ืขืŸ ืžื™ื˜ ื“ืขื‘ื™ืึทืŸ 10 ืึทืก ืื™ื ืกื˜ืึทืœื™ืจืŸ.

ืขื˜ืงื“

ืื™ืš ื˜ืึธืŸ ื ื™ืฉื˜ ืจืขืงืึธืžืขื ื“ื™ืจืŸ ื™ื ืกื˜ืึธืœื™ื ื’ ืขื˜ืง ืื•ื™ืฃ ื“ื™ ื–ืขืœื‘ืข ืžืืฉื™ื ืขืŸ ื•ื•ื• ืคึผืึทื˜ืจืึธื ื™ ืื•ืŸ ืคึผืึธืกื˜ื’ืจืขืกืงืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืœื™ื’ืŸ, ื•ื•ื™ื™ึทืœ ื“ื™ืกืง ืžืึทืกืข ืื™ื– ื–ื™ื™ืขืจ ื•ื•ื™ื›ื˜ื™ืง ืคึฟืึทืจ ืขื˜ืง. ืึธื‘ืขืจ ืคึฟืึทืจ ื‘ื™ืœื“ื•ื ื’ืงืจื™ื™ื– ืฆื•ื•ืขืงืŸ, ืžื™ืจ ื•ื•ืขืœืŸ ื˜ืึธืŸ ื“ืึธืก.
ืœืึธืžื™ืจ ื™ื ืกื˜ืึทืœื™ืจืŸ ืขื˜ืง.

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

ืœื™ื™ื’ ืื™ื ื”ืึทืœื˜ ืฆื• /etc/default/etcd ื˜ืขืงืข

[ืžื™ื˜ื’ืœื™ื“]

ETCD_NAME=ื“ืึทื˜ืึทื ืึธื“ืข1 # ื”ืึธืกื˜ื ืึทืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ื™ืŸ ืžืึทืฉื™ืŸ
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_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 ืื™ื– ื“ื™ืคึผืœื•ื™ื“.

ื›ึผื“ื™ ื ื™ืฉื˜ ืฆื• ืžืึทื›ืŸ ื“ื™ ืžืึทืฉื™ืŸ ืžื™ื˜ HAproxy ืึท ืื™ื™ืŸ ืคื•ื ื˜ ืคื•ืŸ ื“ื•ืจื›ืคืึทืœ, ืžื™ืจ ื•ื•ืขืœืŸ ืงืึทื˜ืขืจ ืขืก ืื™ืŸ ืึท ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจ; ืื™ืŸ ื“ืขืจ ืฆื•ืงื•ื ืคึฟื˜ ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœืึธื ื˜ืฉื˜ ืื™ืŸ ื“ื™ ืง8 ืก ืงื ื•ื™ืœ ืื•ืŸ ืžืึทื›ืŸ ืื•ื ื“ื–ืขืจ ืคืึทื™ืœืึธื•ื•ืขืจ ืงื ื•ื™ืœ ืืคื™ืœื• ืžืขืจ ืคืึทืจืœืึธื–ืœืขืš.

ืฉืึทืคึฟืŸ ืึท ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ื•ื•ื• ืื™ืจ ืงืขื ืขืŸ ืงืจืึธื ืฆื•ื•ื™ื™ ื˜ืขืงืขืก - 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, ืื™ืŸ ื“ื™ ื”ื˜ื˜ืคึผ ื›ืขื“ืขืจื– ื“ืขืจ ื‘ืขืœ ืกืขืจื•ื•ืขืจ ื•ื•ืขื˜ ืฉื˜ืขื ื“ื™ืง ืฆื•ืจื™ืงืงื•ืžืขืŸ 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, ืื™ืจ ื•ื•ืขื˜ ื–ืขืŸ ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืื•ื™ืฃ ื“ื™ื™ืŸ ืงื ื•ื™ืœ.

ื“ืขืจ ืกืขืจื•ื•ื™ืจืขืจ ื•ื•ืึธืก ืื™ื– ื“ืขืจ ื‘ืขืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ืŸ ื“ื™ UP ืฉื˜ืึทื˜, ืื•ืŸ ื“ื™ ืจืขืคึผืœืึทืงืึทื– ื•ื•ืขื˜ ื–ื™ื™ืŸ ืื™ืŸ ื“ื™ ืึทืจืึธืคึผ ืฉื˜ืึทื˜. ื“ืึธืก ืื™ื– ื ืึธืจืžืึทืœ, ืื™ืŸ ืคืึทืงื˜ ื–ื™ื™ ืึทืจื‘ืขื˜ืŸ, ืึธื‘ืขืจ ื–ื™ื™ ื“ืขืจืฉื™ื™ึทื ืขืŸ ืึทื–ื•ื™ ื•ื•ื™ื™ึทืœ ื–ื™ื™ ืฆื•ืจื™ืงืงื•ืžืขืŸ 503 ืคึฟืึทืจ ืจื™ืงื•ื•ืขืก ืคื•ืŸ HAproxy. ื“ืึธืก ืึทืœืึทื•ื– ืื•ื ื“ื– ืฆื• ืฉื˜ืขื ื“ื™ืง ื•ื•ื™ืกืŸ ืคึผื•ื ืงื˜ ื•ื•ืึธืก ืคื•ืŸ ื“ื™ ื“ืจื™ื™ ืกืขืจื•ื•ืขืจืก ืื™ื– ื“ื™ ืงืจืึทื ื˜ ื‘ืขืœ.

ืกืึธืฃ

ื“ื• ื‘ื™ืกื˜ ื”ืขืจืœื™ืš! ืื™ืŸ ื‘ืœื•ื™ื– 30 ืžื™ื ื•ื˜ ืื™ืจ ื”ืึธื‘ืŸ ื“ื™ืคึผืœื•ื™ื“ ืึท ื•ื™ืกื’ืขืฆื™ื™ื›ื ื˜ ืฉื•ืœื“-ื˜ืึธืœืขืจืึทื ื˜ ืื•ืŸ ื”ื•ื™ืš-ืคืึธืจืฉื˜ืขืœื•ื ื’ ื“ืึทื˜ืึทื‘ื™ื™ืก ืงื ื•ื™ืœ ืžื™ื˜ ืกื˜ืจื™ืžื™ื ื’ ืจืขืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื•ืŸ ืึธื˜ืึทืžืึทื˜ื™ืง ืคืึทืœื‘ืึทืง. ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืคึผืœืึทื ื™ืจื•ื ื’ ืฆื• ื ื•ืฆืŸ ื“ืขื ืœื™ื™ื–ื•ื ื’, ื˜ืฉืขืง ืื•ื™ืก ืžื™ื˜ ื‘ืึทืึทืžื˜ืขืจ ืคึผืึทื˜ืจืึธื ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ, ืื•ืŸ ืกืคึผืขืฆื™ืขืœ ืžื™ื˜ ื–ื™ื™ืŸ ื˜ื™ื™ืœ ื•ื•ืขื’ืŸ ื“ื™ ืคึผืึทื˜ืจืึธื ื™ืงื˜ืœ ื ื•ืฆืŸ, ื•ื•ืึธืก ื’ื™ื˜ ื‘ืึทืงื•ื•ืขื ืึทืงืกืขืก ืฆื• ืึธื ืคื™ืจื•ื ื’ ื“ื™ื™ืŸ ืงื ื•ื™ืœ.

ืžืึทื–ืœ - ื˜ืึธื•ื•!

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’