[HA] PostgreSQL HA ๊ตฌ์„ฑ

2026. 4. 20. 00:20ยทArchitecture

2026.02.04 - [OS&Server/WEB | WAS] - [WEB/WAS] Apache ↔ Tomcat ์—ฐ๋™(Reverse Proxy)

 

[WEB/WAS] Apache ↔ Tomcat ์—ฐ๋™(Reverse Proxy)

์ผ๊ฒฝํ—˜ ์ธํ„ดํ˜•์„ ํ–ˆ์ง€๋งŒ ๋”ฐ๋กœ ์—…๋ฌด๋ฅผ ๋ฐ›์ง€๋Š” ์•Š์•„์„œ ๊ต์œก๋‹ค๋‹ˆ๋ฉด์„œ ๋“  ์ƒ๊ฐ์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•ด๋ณด๊ณ  ์‹ถ์€ ๊ฑธ ๊ธฐํšํ•ด์„œ ๊ฐ„๋‹จํ•œ ์žฅ์•  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Apache, Tom

lucy-devblog.tistory.com

์˜ค๋Š˜์€ ์ €๋ฒˆ์— WEBโžก๏ธWASโžก๏ธDB 3-Tier๋กœ ๊ตฌ์„ฑํ–ˆ๋˜ ์„œ๋ฒ„์—์„œ DB ์„œ๋ฒ„๋ฅผ ์ด์ค‘ํ™”ํ•ด Failover ๋ฐœ์ƒ ์‹œ ์ž๋™ ๋ณต๊ตฌ๊ฐ€ ๋˜๋„๋ก ๊ตฌ์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ์‚ฌ์šฉํ•˜๋Š” OS๋Š” Rocky Linux 9.7์ด๋‹ค.


1๏ธโƒฃ Primary DB ์„œ๋ฒ„ ๊ตฌ์„ฑ ํ™•์ธ

์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋จผ์ € DB ๋ฒ„์ „์„ ํ™•์ธํ•œ๋‹ค. ๋ฒ„์ „์„ ๋ณด๋ฉด 16์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2๏ธโƒฃ์™ธ๋ถ€ ์ ‘์† ๋ฐ ๋ณต์ œ ์„ค์ •

postgresql.conf ์„ค์ •

listen_addresses = '*'               # ๋ชจ๋“  IP์—์„œ ์ ‘์† ํ—ˆ์šฉ
wal_level = replica                  # ๋ณต์ œ ๋กœ๊ทธ ํ™œ์„ฑํ™”
archive_mode = on                    # WAL ์•„์นด์ด๋ธŒ ํ™œ์„ฑํ™”
archive_command = 'cp %p /var/lib/pgsql/16/archive/%f'  # WAL ํŒŒ์ผ ๋ณต์‚ฌ ๋ช…๋ น
max_wal_senders = 10                 # WAL ์†ก์‹  ํ”„๋กœ์„ธ์Šค ์ˆ˜
wal_keep_size = 128MB                # WAL ๋ณด์กด ํฌ๊ธฐ
hot_standby = on                     # ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์—์„œ ์ฝ๊ธฐ ํ—ˆ์šฉ

pg_hba.conf ์„ค์ •

๋งˆ์ง€๋ง‰ ์ค„์— replicator ๋งŒ ์ถ”๊ฐ€ํ–ˆ๊ณ  ์ด๊ฑธ ์ €์žฅํ•œ ํ›„์— postgresql์„ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

---2026.04.25 ์ถ”๊ฐ€---

์ผ๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ scram-sha-256์œผ๋กœ ๋œ ๊ฒƒ์„ ๋ชจ๋‘ md5๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

3๏ธโƒฃ๋ณต์ œ์šฉ ์‚ฌ์šฉ์ž ์ƒ์„ฑ

sudo -u postgres psql
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD '๋น„๋ฐ€๋ฒˆํ˜ธ';

pg_hba.conf์— ์ž‘์„ฑํ•œ ๋ณต์ œ์šฉ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

4๏ธโƒฃStandby ์„œ๋ฒ„ ๊ตฌ์„ฑ

๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ ์ดˆ๊ธฐํ™”

# Standby ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ ์ดˆ๊ธฐํ™”
sudo systemctl stop postgresql-16
sudo rm -rf /var/lib/pgsql/16/data/

# Base Backup ์ˆ˜ํ–‰
sudo systemctl start postgresql-16
sudo -u postgres psql

# PostgreSQL ์ ‘์† ์ดํ›„
SELECT pg_is_in_recovery();            # -- true๋ฉด Standby ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
SELECT * FROM pg_stat_wal_receiver;    # -- WAL ์ˆ˜์‹  ์ƒํƒœ ํ™•์ธ

5๏ธโƒฃPgpool-II ์„ค์ •

๋จผ์ € Pgpool์„ primary ์„œ๋ฒ„์— ์„ค์น˜ํ•œ๋‹ค.

sudo dnf install -y pgpool-II

Pgpool -II ๊ธฐ๋ณธ ์„ค์ •

์„ค์น˜๊ฐ€ ๋๋‚˜๋ฉด /etc/pgpool-II/pgpool.conf๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ pgpool-โ…ก์˜ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์„ ํ•œ๋‹ค.

listen_addresses = '*'                # ์™ธ๋ถ€ ์ ‘์† ํ—ˆ์šฉ
port = 9999                           # Pgpool ํฌํŠธ

backend_hostname0 = 'Master-IP' # Primary
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/pgsql/16/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'Stamdby-IP' # Standby
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/16/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on                  # ์ž์ฒด ์ธ์ฆ ์‚ฌ์šฉ

sr_check_period = 10                  # ๋ณต์ œ ์ ๊ฒ€ ์ฃผ๊ธฐ
sr_check_user = 'replicator'
sr_check_password = 'replicatorpass'

health_check_period = 10              # ํ—ฌ์Šค์ฒดํฌ ์ฃผ๊ธฐ
health_check_user = 'replicator'
health_check_password = 'replicatorpass'

์ด๋ฒˆ์—๋Š” /etc/pgpool-II/pool_hba.conf๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์ง€๊ธˆ์€ ์šฐ์„  0.0.0.0/0์œผ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ ์ด ๋ถ€๋ถ„์€ ๋ณธ์ธ ํ™˜๊ฒฝ์— ๋งž์ถฐ์„œ ๋ฐ”๊พธ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์„ค์ • ํ›„ pgpool-II๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๊ณ  pool_passwd ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•œ๋‹ค. postgres, replicator์™€ ์ด์™ธ์— ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

sudo pg_md5 -m -u 'db์‚ฌ์šฉ์ž' '์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ' # ์ง€์ •ํ•œ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ pool_passwd๊ฐ€ ์ƒ์„ฑ๋จ 
chmod 600 /etc/pgpool-II/pool_passwd
chown postgres:postgres /etc/pgpool-II/pool_passwd

pool_passwd ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋‹ค๊ฐ€ initializing pool password, failed to open file:"/etc/pgpool-II/pool_passwd" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ถŒํ•œ์„ ๋จผ์ € ๋ถ€์—ฌํ•˜๊ณ  ์‹œ๋„ํ•ด๋ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  /etc/pgpool-II/pgpool.conf์—์„œ pool_passwd์˜ ์ฃผ์„์„ ํ•ด์ œํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๊ณ  pgpool-II๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

์žฌ์‹œ์ž‘ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

psql -h 127.0.0.1 -p 9999 -U 'pool_passwd์— ๋„ฃ์€ ์‚ฌ์šฉ์ž' -d 'ํ•ด๋‹น ์‚ฌ์šฉ์ž DB' -c "show pool_nodes;"

์—ฐ๊ฒฐํ™•์ธ ๊ฒฐ๊ณผ

ํ˜น์‹œ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ ํ›„ psql: ์˜ค๋ฅ˜: "127.0.0.1" ํฌํŠธ 9999 ์„œ๋ฒ„์— ์ ‘์† ํ•  ์ˆ˜ ์—†์Œ: ERROR: failed to authenticate with backend using SCRAM์ด ๋œฌ๋‹ค๋ฉด db ์ž์ฒด์—์„œ๋„ ์ธ์ฆ ๋ฐฉ์‹์„ md5๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

6๏ธโƒฃ์ž๋™ Failover ์„ค์ •

pgpool์ด ์—ฐ๊ฒฐ์ด ๋˜์–ด์žˆ์œผ๋‹ˆ ์ž๋™ failover๋ฅผ ์„ค์ •ํ•ด๋ณด๊ฒ ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด failover.sh๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค.

cp /etc/pgpool-II/sample_scripts/failover.sh.sample /etc/pgpool-II/failover.sh
chmod +x /etc/pgpool-II/failover.sh

๊ทธ๋ฆฌ๊ณ  /etc/pgpool-II/pgpool.conf์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_primary_command = '/etc/pgpool-II/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'

์ž๋™ ์ „ํ™˜์ด ๋ชฉํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š๊ณ  ์ „ํ™˜๋˜๋„๋ก ํ•˜๊ณ ์ž ssh ํ‚ค๋ฅผ ์„ค์ •ํ•œ๋‹ค.

cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@master-IP
ssh-copy-id -i id_rsa_pgpool.pub root@master-IP
ssh-copy-id -i id_rsa_pgpool.pub postgres@slave-IP
ssh-copy-id -i id_rsa_pgpool.pub root@slave-IP

๊ฐ ์„œ๋ฒ„์˜ postgres ๋ฐ root ๊ณ„์ • ๋ชจ๋‘ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

7๏ธโƒฃFailover ํ…Œ์ŠคํŠธ

systemctl stop postgresql-16 #Primary DB ์ค‘์ง€ 
psql -U postgres -p 9999 -h 127.0.0.1 -c "show pool_nodes;"

primary db์ค‘๋‹จ ํ›„

Primary DB๋ฅผ ์ค‘์ง€ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋ฉด db2๋กœ ๋„˜์–ด๊ฐ”์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Primary DB๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ ํ›„ Pgpool๋„ ์žฌ์‹œ์ž‘ ํ•˜๋ฉด ๋‹ค์‹œ Primary DB๋กœ ๋ฐ”๊ผˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

primary db ์žฌ์‹œ์ž‘ ํ›„


์ฐธ๊ณ ์ž๋ฃŒ

  • https://tech.osci.kr/postgresql-ha-%EA%B5%AC%EC%84%B1-pgpool-ii%EB%A1%9C-%EC%9E%90%EB%8F%99-failover%EA%B9%8C%EC%A7%80-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-%EC%8B%A4%EC%A0%84-%EA%B0%80%EC%9D%B4%EB%93%9C/
  • https://www.pgpool.net/docs/pgpool-II-4.4.9/en/html/example-basic.html
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'Architecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Infra] ๋ฐฐํฌ ์ „๋žต - Rolling, Blue/Green, Canary  (1) 2025.08.10
[Infra] DR(Disaster Recovery, ์žฌํ•ด๋ณต๊ตฌ)  (0) 2025.08.01
[Infra] ๋ฐฑ์—…(Backup)  (0) 2025.07.23
[Infra] ์„œ๋ฒ„(Server)  (3) 2024.12.20
[Infra] ์Šคํ† ๋ฆฌ์ง€ ์ข…๋ฅ˜  (0) 2024.12.17
'Architecture' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Infra] ๋ฐฐํฌ ์ „๋žต - Rolling, Blue/Green, Canary
  • [Infra] DR(Disaster Recovery, ์žฌํ•ด๋ณต๊ตฌ)
  • [Infra] ๋ฐฑ์—…(Backup)
  • [Infra] ์„œ๋ฒ„(Server)
The Engineer, Lucy
The Engineer, Lucy
  • The Engineer, Lucy
    Growing up for My Future๐Ÿ’•
    The Engineer, Lucy
    • Instagram
    • GitHub
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (201)
      • OS&Server (30)
        • Linux (28)
        • WEB | WAS (2)
      • Architecture (10)
      • Cloud (8)
        • AWS (4)
        • GCP (4)
      • Container (12)
        • Docker (4)
        • Kubernetes (8)
      • IaC | DevOps (11)
        • IaC (7)
        • DevOps (4)
      • Observability (6)
      • CS (17)
        • Data Structure (0)
        • Algorithms (1)
        • Operating System (3)
        • Network (11)
        • Database System (2)
      • Coding Test (99)
        • Algorithms (91)
        • SQL (7)
      • ETC (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ๋งํฌ

    • Lucy's Instagram
    • Lucy's GitHub
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋„คํŠธ์›Œํฌ ๊ธฐ์ดˆ ์ง€์‹
    Java
    programmers
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    Baekjoon
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ณต๋ถ€
    ๋„์ปค
    ์‰˜ ์Šคํฌ๋ฆฝํŠธ
    Shell Script
    AWS
    cs ๊ธฐ์ดˆ ์ง€์‹ ์ •๋ฆฌ
    ๋ฐฑ์ค€
    ์…ธ ์Šคํฌ๋ฆฝํŠธ
    ๋ฆฌ๋ˆ…์Šค๋งˆ์Šคํ„ฐ 2๊ธ‰
    terraform
    network
    bfs
    Kubernetes
    ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
    docker
    ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰
    ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    ๋„คํŠธ์›Œํฌ
    ์ž๋ฐ”
    ์˜ค๋ธ”์™„
    Linux
    K8s
    ๋ฆฌ๋ˆ…์Šค
    Shell
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
The Engineer, Lucy
[HA] PostgreSQL HA ๊ตฌ์„ฑ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”