Patroni, etcd, HAProxy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•

๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐ๋œ ๋‹น์‹œ์—๋Š” ์ด ์†”๋ฃจ์…˜์„ ํ˜ผ์ž์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์ถœ์‹œํ•  ๋งŒํผ ์ถฉ๋ถ„ํ•œ ๊ฒฝํ—˜์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌ๊ธ€๋ง์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ํŠœํ† ๋ฆฌ์–ผ์ฒ˜๋Ÿผ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ชจ๋“  ๊ฒƒ์„ ์ง„ํ–‰ํ•˜๊ณ , ์ž‘์„ฑ์ž์™€ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•˜๋”๋ผ๋„ ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ ‘ํ–ˆ์„ ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๋ฉด ๋‚˜๋งŒ์˜ ํŠœํ† ๋ฆฌ์–ผ์„ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํšจ๊ณผ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐ๋„ท ๊ฐ€์ด๋“œ

์ธํ„ฐ๋„ท์—๋Š” ๋‹ค์–‘ํ•œ ๊ฐ€์ด๋“œ, ํŠœํ† ๋ฆฌ์–ผ, ๋‹จ๊ณ„๋ณ„ ๋“ฑ์ด ๋ถ€์กฑํ•˜์—ฌ ์–ด๋ ค์›€์„ ๊ฒช์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ์—ฐํžˆ ์žฅ์•  ์กฐ์น˜ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ž„๋ฌด๋ฅผ ๋งก๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ฃผ์š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ณต์ œ๋ณธ์œผ๋กœ ๋ณต์ œ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์˜ˆ์•ฝ์„ ์ž๋™์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹คํŒจ.

์ด ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ  ์Šคํƒ์ด ๊ฒฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • DBMS๋กœ์„œ์˜ PostgreSQL
  • ํŒจํŠธ๋กœ๋‹ˆ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์†”๋ฃจ์…˜์œผ๋กœ
  • Patroni์šฉ ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€์ธ etcd
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹จ์ผ ์ง„์ž…์ ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ HAproxy

์„ค์น˜

์ฃผ์˜ ์‚ฌํ•ญ - Patroni, etcd, HAProxy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ PostgreSQL ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•.

ะ’ัะต ะพะฟะตั€ะฐั†ะธะธ ะฒั‹ะฟะพะปะฝัะปะธััŒ ะฝะฐ ะฒะธั€ั‚ัƒะฐะปัŒะฝั‹ั… ะผะฐัˆะธะฝะฐั… ั ัƒัั‚ะฐะฝะพะฒะปะตะฝะฝะพะน ะžะก Debian 10.

๋“ฑ

etcd์—์„œ๋Š” ๋””์Šคํฌ ๋กœ๋“œ๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋ฏ€๋กœ Patori์™€ 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 ํ”ผ์–ด, ํด๋ผ์ด์–ธํŠธ ๋“ฑ์€ ํ˜ธ์ŠคํŠธ์˜ 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 ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด 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์ดˆ ์ •๋„ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‚˜๋จธ์ง€ ๋จธ์‹ ์—์„œ ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

HAํ”„๋ก์‹œ

์šฐ๋ฆฌ๋Š” ๋‹จ์ผ ์ง„์ž…์ ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ‹์ง„ HAproxy๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ์„œ๋ฒ„๋Š” HAproxy๊ฐ€ ๋ฐฐํฌ๋œ ๋จธ์‹ ์˜ ์ฃผ์†Œ์—์„œ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

HAproxy๊ฐ€ ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๋‹จ์ผ ์‹คํŒจ ์ง€์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹œ์ž‘ํ•  ๊ฒƒ์ด๋ฉฐ, ํ–ฅํ›„์—๋Š” 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์„ ์ง€์ •ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์Šคํ„ฐ์ธ ์„œ๋ฒ„๋Š” UP ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ๋ ˆํ”Œ๋ฆฌ์นด๋Š” DOWN ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์ƒ์ด๋ฉฐ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ HAproxy์˜ ์š”์ฒญ์— ๋Œ€ํ•ด 503์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ธ ์„œ๋ฒ„ ์ค‘ ์–ด๋А ์„œ๋ฒ„๊ฐ€ ํ˜„์žฌ ๋งˆ์Šคํ„ฐ์ธ์ง€ ํ•ญ์ƒ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋„ˆ๋Š” ์•„์ฃผ ๋ฉ‹์ ธ! ๋‹จ 30๋ถ„ ๋งŒ์— ์ŠคํŠธ๋ฆฌ๋ฐ ๋ณต์ œ ๋ฐ ์ž๋™ ๋Œ€์ฒด ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ํƒ์›”ํ•œ ๋‚ด๊ฒฐํ•จ์„ฑ ๋ฐ ๊ณ ์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ผ๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”. ๊ณต์‹ Patroni ๋ฌธ์„œ ํฌํ•จ, ํŠนํžˆ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ํŽธ๋ฆฌํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” Patronictl ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ถ•ํ•˜ํ•ด!

์ถœ์ฒ˜ : habr.com

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster