PostgreSQL์€ ์šฐ์„  Active- Active๋กœ HA ๊ตฌ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, Active- Active ์šด์˜ ๋‚œ์ด๋„๊ฐ€ ๋งค์šฐ ๋†’์•„์„œ ๋ณดํ†ต Active-Stanby๋กœ HA๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
 
pgpool + watchdog๋Š” PostgreSQL์„ ๊ณ ๊ฐ€์šฉ์„ฑ(HA)์œผ๋กœ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ์ด๋‹ค.

  • pgpool: PostgreSQL ์•ž๋‹จ์— ๋†“์ด๋Š” ๋ฏธ๋“ค์›จ์–ด๋กœ, DB ์—ฐ๊ฒฐ ๊ด€๋ฆฌยท๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑยท์‹ค์‹œ๊ฐ„ ๋ณต์ œ ๊ฐ์ง€๋ฅผ ๋‹ด๋‹น.
  • watchdog: pgpool ๋…ธ๋“œ๋ผ๋ฆฌ ์„œ๋กœ ์ƒ์กด ์—ฌ๋ถ€๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ž๋™ Failover์™€ VIP ์ „ํ™˜์„ ์ˆ˜ํ–‰.

Streaming Replication

Primary(DB ๋ฉ”์ธ)๊ฐ€ ์ƒ์„ฑํ•œ WAL ๋กœ๊ทธ๋ฅผ Standby(DB ๋Œ€๊ธฐ)๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›์•„ ์ ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ณต์ œ ๋ฐฉ์‹
 

Failover

Primary ์„œ๋ฒ„๊ฐ€ ์žฅ์• ๋กœ ์ฃฝ์—ˆ์„ ๋•Œ, Standby๋ฅผ ์ž๋™์œผ๋กœ Primary๋กœ ์Šน๊ฒฉํ•ด์„œ ์„œ๋น„์Šค๊ฐ€ ๊ณ„์†๋˜๋„๋ก ํ•˜๋Š” ๋™์ž‘
Failover๋Š” pgpool + watchdog์ด ์ˆ˜ํ–‰
 

  • watchdog โ†’ pgpool ๋…ธ๋“œ๋“ค๋ผ๋ฆฌ ์žฅ์•  ๊ฐ์ง€ + ๋ฆฌ๋” ์„ ์ถœ
  • pgpool โ†’ Standby๋ฅผ Primary๋กœ ์Šน๊ฒฉ + VIP ์ด๋™

 
 

Online Recovery

์ฃฝ์—ˆ๋˜ DB ๋…ธ๋“œ๋ฅผ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋กœ ์žฌ๋™๊ธฐํ™”ํ•ด Standby๋กœ ๋ณต๊ท€์‹œํ‚ค๋Š” ์ž‘์—…
 

  • pgpool์ด recovery ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰
  • watchdog์€ โ€œ๋…ธ๋“œ ์‚ด์•„๋‚จ ๊ฐ์ง€โ€๊นŒ์ง€๋งŒ ๋‹ด๋‹น

 
 
โญ HA ์šฉ์–ด ์ •์˜

์šฉ์–ด์—ญํ• ๋ชฉ์ 
Streaming Replication๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ๋ณต์ œStandby๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€
FailoverStandby โ†’ Primary ์Šน๊ฒฉ์žฅ์•  ์‹œ ์„œ๋น„์Šค ์ง€์†
Online Recovery๋ณต๊ตฌ๋œ ๋…ธ๋“œ ์žฌ๋™๊ธฐํ™”ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ ๋ณต์›

 
โญ ๊ธฐ๋Šฅ๋ณ„ ์ˆ˜ํ–‰ ์ฃผ์ฒด

๊ธฐ๋Šฅ์‹ค์ œ ์ˆ˜ํ–‰ ์ฃผ์ฒด
Streaming ReplicationPostgreSQL
Failoverpgpool + watchdog
Online Recoverypgpool (์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰)
๋…ธ๋“œ ์ƒ์กด ๊ฐ์‹œ / ํˆฌํ‘œwatchdog

๋ฐฑ์—… ์„œ๋ฒ„์—์„œ DB ์„œ๋ฒ„์— ์›๊ฒฉ ์ ‘์†ํ•˜์—ฌ pg_dump๋กœ ๋ฐฑ์—… ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, pg_dump ํด๋ผ์ด์–ธํŠธ ๋ฒ„์ „์€ ๋Œ€์ƒ PostgreSQL ์„œ๋ฒ„ ๋ฒ„์ „๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜ ์—†๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, PostgreSQL 16 ๋ฒ„์ „ DB ์„œ๋ฒ„๋ฅผ ๋ฐฑ์—… ์„œ๋ฒ„์— ์„ค์น˜๋œ pg_dump 14 ๋ฒ„์ „ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฐฑ์—…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๊ฒฝ์šฐ ๋ฐฑ์—… ์„œ๋ฒ„์— PostgreSQL 16 ๋ฒ„์ „ ํด๋ผ์ด์–ธํŠธ(pg_dump) ๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ํ•œ ๋’ค, ํ•ด๋‹น ๋ฒ„์ „์˜ pg_dump๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—… ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

DB ๋ฐฑ์—… ํŒŒ์ผ์€ ์ „์ฒด ๋ฐฑ์—…๊ณผ ํŠน์ • DB์˜ ๋ฐฑ์—…์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

์‹ค๋ฌด์—์„œ๋Š” ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—  pg_dumpall์œผ๋กœ ๋ฐ์ดํ„ฐ, ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด ๋ชจ๋‘ ๋ฐฑ์—…ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

Postgresql์€ pg_dump์™€ pg_dumpall์„ ํ†ตํ•ด์„œ ๋ฐฑ์—… ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ฆ๋ถ„๋ฐฑ์—…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋ฐฑ์—… ์ƒ์„ฑ ๋ฐฉ๋ฒ•

์šฐ์„  ๋ฐฑ์—…์€ postgres ๊ณ„์ •์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

 

1. pg_dumpall์„ ์‚ฌ์šฉํ•˜์—ฌ cluster ์ „์ฒด์˜ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด(์‚ฌ์šฉ์ž, ๊ถŒํ•œ, tablespace)๋ฅผ ๋จผ์ € ๋ฐฑ์—…ํ•˜๋Š” globals-only ๋ฐฑ์—… ํ•„์š”ํ•˜๋‹ค.

pg_dumpall -U postgres -v --roles-only -f "/backup/role.sql"

 

2. ํŠน์ • DB์„ ๋ฐฑ์—…ํ•˜๋Š” ๊ฒฝ์šฐ pg_dump ์‚ฌ์šฉ

๋ฐฑ์—…ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ํฌ๋ฉด ํŒŒ์ผ ์••์ถ•์„ ํ•ด์„œ gz ํŒŒ์ผ๋กœ ๋ฐฑ์—…์„ ํ•œ๋‹ค.

pg_dump {DB๋ช…} | gzip > /backup/backup-ex.gz

 

๋ฐฑ์—… ๋ณต์› ๋ฐฉ๋ฒ•

์šฐ์„  ๋ฐฑ์—…์€ postgres ๊ณ„์ •์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค.

 

1. Role ๋ณต๊ตฌ

psql -f /data/backup/pgsql_backup/dev/platform_bizchat_role_root.sql postgres

# ๊ณ„์ • ๋ชฉ๋ก ํ™•์ธ(psql์—์„œ ํ™•์ธ)
SELECT rolname, rolsuper, rolcreaterole, rolcreatedb, rolcanlogin FROM pg_roles;

 

2. DB ๋ณต๊ตฌ

๋Œ€์ƒDB๋งŒ ์—†๋‹ค๋ฉด ๋Œ€์ƒDB๋ฅผ ์ƒ์„ฑํ•œ ๋’ค DB ๋ณต๊ตฌํ•œ๋‹ค.

15GB ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ์‹œ 20๋ถ„ ์ •๋„ ์†Œ์š”๋˜๋ฉฐ, 14๋ฒ„์ „์˜ ์Šคํ‚ค๋งˆ์™€ ๋ฐ์ดํ„ฐ๋ฅผ 16๋ฒ„์ „์œผ๋กœ ๋ณต๊ตฌํ–ˆ์„๋•Œ ํŠน์ด์‚ฌํ•ญ์€ ์—†์—ˆ๋‹ค.

# DB ์ƒ์„ฑ(psql๋กœ ์ง„ํ–‰)
CREATE DATABASE {DB๋ช…} OWNER {DB๊ณ„์ •} LC_COLLATE 'C.UTF-8' LC_CTYPE
'C.UTF-8' TEMPLATE template0;

# DB ์กฐํšŒ
select * from PG_DATABASE; 

# ๋ฐฑ์—… ๋ณต๊ตฌ
gunzip < backup-ex.gz | psql -d {DB๋ช…}

 

3. ๋ณต๊ตฌ ์™„๋ฃŒ ํ›„ ํ†ต๊ณ„์ •๋ณด ๊ฐฑ์‹ 

ANALYZE; 

 

 

Troubleshooting

ROLE ๋ณต๊ตฌ ์‹œ ์ฃผ์˜ํ•  ์ 

1)

์˜ค๋ฅ˜์ฝ”๋“œ: ERROR: role "existing_role" already exists

-> ๋ฐฑ์—… ํŒŒ์ผ ๋ณต๊ตฌ ์‹œ ๊ธฐ์กด role์ด ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๊ณ  ๋ณต๊ตฌํ•  ๋•Œ role ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. (๊ธฐ์กด role์˜ ๊ถŒํ•œ/์†์„ฑ ์ž์ฒด๋Š” ์•ˆ ๋ฐ”๋€œ)

but, ์•„๋ž˜ ALTER๋ฌธ์œผ๋กœ role์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ฐ”๋€”์ˆ˜์žˆ๋‹ค.

ALTER ROLE ex WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'XXXXXXXXXXX';

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•:  --no-role-passwords๋กœ globals ๋‹ค์‹œ ๋œจ๊ฑฐ๋‚˜ OR ์ˆ˜๋™์œผ๋กœ ๊ธฐ์กด Role์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ALTER ๋ฌธ์„ ์—†์•ค๋‹ค.

 

2)

์˜ค๋ฅ˜ ์ฝ”๋“œ: ERROR: require a VALID UNTIL option

์›์ธ: credcheck extension ์„ค์ •์œผ๋กœ ์ธํ•ด CREATE ROLE ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

# ํ•ด๋‹น ์„ธ์…˜์—์„œ๋งŒ credcheck ๋น„ํ™œ์„ฑํ™”
SET credcheck.password_valid_until = 0;
SET credcheck.password_valid_max = 0;
SELECT pg_reload_conf(); // ์žฌ์‹œ์ž‘ ์—†์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ

# credcheck ํ™•์ธ
SHOW credcheck.password_valid_max;
SHOW credcheck.encrypted_password_allowed;

# ์‹œ์Šคํ…œ์ƒ ์˜๊ตฌ ์ ์šฉ์ด๊ธฐ์— ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
ALTER SYSTEM SET credcheck.password_valid_until = 0;
ALTER SYSTEM SET credcheck.password_valid_max = 0;
SELECT pg_reload_conf();

# credcheck๋ฅผ ์ œ์™ธ ๊ณ„์ • ์ถ”๊ฐ€
# ๋ณดํ†ต ์‹œ์Šคํ…œ ๊ณ„์ •์ด ํ•ด๋‹น
ALTER SYSTEM SET credcheck.whitelist = '{๊ณ„์ •๋ช…}';
SELECT pg_reload_conf();

 

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

PostgreSQL pgpool + watchdog๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB ์ด์ค‘ํ™”  (0) 2026.01.18

+ Recent posts