About
home
Tmax OpenSQL
home
๐Ÿ’Ž

12. PostgreSQL์˜ WAL 3 (Streaming Replication)

์ž‘์„ฑ์ž
JBH
SJH

Streaming Replication

๋™๊ธฐ์‹ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜(Synchronous streaming replication)์€ PostgreSQL 9.1 ๋ฒ„์ „๋ถ€ํ„ฐ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ๋งˆ์Šคํ„ฐ ๋‹ค์ค‘ ์Šฌ๋ ˆ์ด๋ธŒ(single-master-multi-slaves) ํƒ€์ž…์˜ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ ์—ฌ๊ธฐ์„œ ๋งˆ์Šคํ„ฐ(Master)๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ(Primary)๋ฅผ ๋œปํ•˜๋ฉฐ, ์Šฌ๋ ˆ์ด๋ธŒ(Slave)๋Š” ์Šคํƒ ๋ฐ”์ด(Standby)๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ์€ ๋กœ๊ทธ ์ „๋‹ฌ(Log shipping)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ๋Š” WAL ๋ฐ์ดํ„ฐ(WAL data)๋ฅผ ์ง€์†์ ์œผ๋กœ ์Šคํƒ ๋ฐ”์ด๋กœ ์ „์†กํ•˜๊ณ , ๊ฐ ์Šคํƒ ๋ฐ”์ด๋“ค์€ ๋ฐ›์€ ์ฆ‰์‹œ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค.
์ด ์žฅ์—์„œ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
โ€ข
์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•
โ€ข
ํ”„๋ผ์ด๋จธ๋ฆฌ์™€ ์Šคํƒ ๋ฐ”์ด ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „์†ก๋˜๋Š” ๋ฐฉ๋ฒ•
โ€ข
ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ๋‹ค์ˆ˜์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
โ€ข
ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์‹คํŒจ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•
PostgreSQL 9.0 ๋ฒ„์ „์—์„œ ๋น„๋™๊ธฐ์‹ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜(Asynchronous replication)์ด ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ PostgreSQL 9.1 ๋ฒ„์ „์˜ ๋™๊ธฐ์‹ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Init Streaming Replication

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด์„œ ์„ธ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. walsender๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์—์„œ WAL ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ walreceiver์™€ startup ํ”„๋กœ์„ธ์Šค๋Š” WAL ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก ๋ฐ›์•„์„œ ๋ฆฌํ”Œ๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค. walsender์™€ walreceiver๋Š” ๋‹จ์ผ TCP ์—ฐ๊ฒฐ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
์ด ์„น์…˜์—์„œ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์„ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๋งบ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘ ์ ˆ์ฐจ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
1.
ํ”„๋ผ์ด๋จธ๋ฆฌ์™€ ์Šคํƒ ๋ฐ”์ด๋ฅผ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
2.
์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ startup ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
3.
์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ walreceiver ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
4.
walreceiver๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋™์ค‘์ด์ง€ ์•Š๋‹ค๋ฉด walreceiver๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
5.
ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ์ด ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด walsender ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋™ํ•˜๊ณ  walsender์™€ walreceiver์˜ TCP ์—ฐ๊ฒฐ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
6.
walreceiver๋Š” ์Šคํƒ ๋ฐ”์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ€์žฅ ์ตœ์‹  LSN์„ walsender๋กœ ์ „์†ก. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๋‹จ๊ณ„๋ฅผ Handshaking์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
7.
์Šคํƒ ๋ฐ”์ด์˜ ๊ฐ€์žฅ ์ตœ์‹  LSN์ด ํ”„๋ผ์ด๋จธ๋ฆฌ์˜ ์ตœ์‹  LSN๋ณด๋‹ค ์ž‘๋‹ค๋ฉด(์Šคํƒ ๋ฐ”์ด LSN < ํ”„๋ผ์ด๋จธ๋ฆฌ LSN), walsender๋Š” ์Šคํƒ ๋ฐ”์ด LSN๋ถ€ํ„ฐ ํ”„๋ผ์ด๋จธ๋ฆฌ LSN๊นŒ์ง€์˜ WAL ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก. ์ด WAL ๋ฐ์ดํ„ฐ๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ์˜ pg_xlog(๋˜๋Š” pg_wal) ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์˜ WAL ์„ธ๊ทธ๋จผํŠธ(WAL segment) ํŒŒ์ผ์—์„œ ์–ป์–ด์˜ด. ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋Š” ์ „์†ก ๋ฐ›์€ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ด. ์Šคํƒ ๋ฐ”์ด๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ์žก๋Š” ์ด ๋‹จ๊ณ„๋ฅผ Catch-up์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
8.
Streaming์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ ๊ทธ๋ฆผ์€ ์œ„์˜ ๊ณผ์ •์„ ๋„์‹ํ™” ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ walsender ํ”„๋กœ์„ธ์Šค๋Š” ์—ฐ๊ฒฐ๋œ walreceiver ๋˜๋Š” ๋ชจ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ์˜ ์ ์ ˆํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒํƒœ๋ž€ walreceiver์˜ ์ƒํƒœ๋‚˜ walsender์— ์—ฐ๊ฒฐ๋œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€ข
start-up : walsender๋ฅผ ์‹œ์ž‘ํ•œ ์‹œ์ ๋ถ€ํ„ฐ Handshaking์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ์ ๊นŒ์ง€์˜ ์ƒํƒœ (5), (6)
โ€ข
catch-up : Standby๊ฐ€ Primary๋ฅผ ๋”ฐ๋ผ์žก๋Š” ๋‹จ๊ณ„ (7)
โ€ข
streaming : Streaming Replication์ด ์ˆ˜ํ–‰์ค‘์ธ ์ƒํƒœ (8)
โ€ข
backup : pg_basebackup๊ณผ ๊ฐ™์€ ๋ฐฑ์—… ํˆด๋“ค์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ํŒŒ์ผ์„ ์ „์†ก์ค‘์ธ ์ƒํƒœ
์œ„์˜ ์ƒํƒœ๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
testdb=# SELECT application_name,state FROM pg_stat_replication; application_name | state ------------------+----------- standby1 | streaming standby2 | streaming pg_basebackup | backup (3 rows)
Shell
๋ณต์‚ฌ
์œ„์—์„œ ์–ธ๊ธ‰ํ•œ๋Œ€๋กœ ๋‘ ๊ฐœ์˜ walsender๊ฐ€ WAL ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์— ์žˆ๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” pb_basebackup ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰์ค‘์— ์žˆ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ ์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ ์ •์ง€ํ•œ ํ›„์— ์žฌ๊ธฐ๋™ํ•œ๋‹ค๋ฉด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ?
PostgreSQL 9.3 ๋ฒ„์ „๊นŒ์ง€๋Š” ์Šคํƒ ๋ฐ”์ด์—์„œ ์š”์ฒญํ•œ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์ด ์ด๋ฏธ ํ”„๋ผ์ด๋จธ๋ฆฌ์—์„œ ์žฌ์‚ฌ์šฉ๋œ ๊ฒฝ์šฐ๋Š” ์Šคํƒ ๋ฐ”์ด๊ฐ€ ํ”„๋ผ์ด๋จธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ์žก์„ ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ wal_keep_segments ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ํฌ๊ฒŒ ์žก๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
PostgreSQL 9.4 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šฌ๋กฏ(Replication slot)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šฌ๋กฏ์€ WAL ๋ฐ์ดํ„ฐ ์ „์†ก์— ๋Œ€ํ•œ ์œ ์—ฐ์„ฑ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋…ผ๋ฆฌ์  ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜(Logical replication)์„ ์œ„ํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. pg_xlog(๋˜๋Š” pg_wal) ์„œ๋ธŒ ๋””๋ ‰ํ† ๋ฆฌ์— ์•„์ง ์ „์†ก๋˜์ง€ ์•Š์€ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์žฌ์‚ฌ์šฉ ์ฒ˜๋ฆฌ๋ฅผ ์ž ์‹œ ๋ฉˆ์ถค์œผ๋กœ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šฌ๋กฏ์— ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Primary - Standby Communication

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋กœ๊ทธ ์ „๋‹ฌ(Log shipping)๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™”(Database synchronization) ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— WAL ๋ฐ์ดํ„ฐ๊ฐ€ ์จ์งˆ ๋•Œ๋งˆ๋‹ค WAL ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐ๋œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ ์ „๋‹ฌ์€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜์ด ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™”๋Š” ๋™๊ธฐ์‹ ๋ณต์ œ(Synchronous replication)์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์™€ ๋™๊ธฐํ™”๋ฅผ ์ด๋ฃจ๊ธฐ ์œ„ํ•ด ํ†ต์‹ ์„ ํ•ฉ๋‹ˆ๋‹ค.
์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ ๋™๊ธฐ์‹ ๋ณต์ œ ๋ชจ๋“œ์ด๋ฉฐ hot-standby ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋น„ํ™œ์„ฑ(Disabled) ๋˜์—ˆ๊ณ , wal_level ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” archive์ธ ์ƒํƒœ๋ฅผ ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์˜ ์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
synchronous_standby_names = 'standby1' hot_standby = off wal_level = archive
Shell
๋ณต์‚ฌ
๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค(Backend process) ์ค‘ ํ•˜๋‚˜๊ฐ€ ์˜คํ† ์ปค๋ฐ‹(Autocommit) ๋ชจ๋“œ์—์„œ ๊ฐ„๋‹จํ•œ INSERT๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ , INSERT๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„ ํŠธ๋žœ์žญ์…˜์„ ์ฆ‰์‹œ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ปค๋ฐ‹ ์ž‘์—…์€ ๋‹ค์Œ ๊ณผ์ •์„ ํ†ตํ•ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
1.
๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ WAL ๋ฐ์ดํ„ฐ๋ฅผ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์— ์“ฐ๊ณ (Write), ํ”Œ๋Ÿฌ์‹œ(Flush)ํ•ฉ๋‹ˆ๋‹ค.
2.
walsender ํ”„๋กœ์„ธ์Šค๊ฐ€ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์— ์“ฐ์—ฌ์ง„ WAL ๋ฐ์ดํ„ฐ๋ฅผ walreceiver ํ”„๋กœ์„ธ์Šค์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
3.
WAL ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ ํ›„, ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ACK๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
4.
walreceiver๋Š” ์ „์†ก๋ฐ›์€ WAL ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ ๋ฐ”์ด์˜ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์— ์“ฐ๊ณ (Write), walsender์— ACK์„ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
5.
walreceiver๋Š” WAL ๋ฐ์ดํ„ฐ๋ฅผ WAL ์„ธ๊ทธ๋จผํŠธ ํŒŒ์ผ์— ํ”Œ๋Ÿฌ์‹œํ•˜๊ณ , ์ด์— ๋Œ€ํ•œ ACK์„ walsender์— ์ „์†กํ•จ. ๊ทธ๋ฆฌ๊ณ  startup ํ”„๋กœ์„ธ์Šค์—๊ฒŒ WAL ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐฑ์‹ ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
6.
startup ํ”„๋กœ์„ธ์Šค๋Š” WAL ์„ธ๊ทธ๋จผํŠธ์— ์“ฐ์—ฌ์ง„ WAL ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ดํ•ฉ๋‹ˆ๋‹ค.
7.
walsender๋Š” walreceiver๋กœ๋ถ€ํ„ฐ ACK๋ฅผ ๋ฐ›์€ ํ›„, ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค์˜ ์ปค๋ฐ‹ ๋˜๋Š” ์ทจ์†Œ(Abort)๋Š” ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
ํ•˜๋‹จ์˜ ๊ทธ๋ฆผ์€ ์ด๋ฅผ ๋ชจ์‹๋„๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ„์—์„œ๋Š” ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ์„ค๋ช…์„ ๋ฐฐ์ œํ•˜์˜€์ง€๋งŒโ€ฆ ํ•„์ž๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์œ„ ๊ณผ์ •์ด ์‹ค์ œ ์ด๋ฃจ์–ด์ง€๋Š” ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ์„ค๋ช…์ด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋‚ด์šฉ์€ ํ•˜๋‹จ์— ์•„์นด์ด๋น™ํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค.
Code Level ์„ค๋ช…
wal_level ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์„ค์ •๊ฐ’์ด โ€˜hot_standbyโ€™ ๋˜๋Š” โ€˜logicalโ€™์ธ ๊ฒฝ์šฐ, PostgreSQL์€ hot standby ๊ธฐ๋Šฅ์„ ์œ„ํ•œ WAL ๋ ˆ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹์ด๋‚˜ ์ทจ์†Œ์— ๋Œ€ํ•œ ๋กœ๊ทธ ๋’ค์— ์จ์ค๋‹ˆ๋‹ค. ์ด ์„น์…˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” wal_level์ด โ€˜archiveโ€™์ด๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐ ACK๋Š” ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„ ๋‚ด๋ถ€์˜ ์ •๋ณด๋ฅผ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ACK๊ฐ€ ํฌํ•จํ•œ ๋„ค ๊ฐ€์ง€ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€ข
๊ฐ€์žฅ ์ตœ์‹ ์— ์“ฐ์—ฌ์ง„(Write) WAL ๋ฐ์ดํ„ฐ์˜ LSN
โ€ข
๊ฐ€์žฅ ์ตœ์‹ ์— ํ”Œ๋Ÿฌ์‹œ๋œ WAL ๋ฐ์ดํ„ฐ์˜ LSN
โ€ข
๊ฐ€์žฅ ์ตœ์‹ ์— startup ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ๋ฆฌํ”Œ๋ ˆ์ด๋œ WAL ๋ฐ์ดํ„ฐ์˜ LSN
โ€ข
์‘๋‹ต์ด ์ „์†ก๋œ ํƒ€์ž„์Šคํƒฌํ”„(Timestamp)
walreceiver๋Š” WAL ๋ฐ์ดํ„ฐ์˜ ์“ฐ๊ธฐ๋‚˜ ํ”Œ๋Ÿฌ์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋”๋ผ๋„ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ํ•˜ํŠธ๋น„ํŠธ(Heartbeat)๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์œ„ํ•ด ACK๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ํ•ญ์ƒ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜์˜ ์ฟผ๋ฆฌ(Query)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์—ฐ๊ฒฐ๋œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ LSN ๊ด€๋ จ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
testdb=# SELECT application_name AS host, write_location AS write_LSN, flush_location AS flush_LSN, replay_location AS replay_LSN FROM pg_stat_replication; host | write_lsn | flush_lsn | replay_lsn ----------+-----------+-----------+------------ standby1 | 0/5000280 | 0/5000280 | 0/5000280 standby2 | 0/5000280 | 0/5000280 | 0/5000280 (2 rows)
Shell
๋ณต์‚ฌ

Standby Server Management

ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๊ด€๋ฆฌํ•˜๋Š” ๋ชจ๋“  ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ๋Œ€ํ•ด sync_priority์™€ sync_state ๊ฐ’์„ ์œ ์ง€ํ•˜๋ฉฐ ํ•ด๋‹น ๊ฐ’์— ๋”ฐ๋ผ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

sync_priority

sync_priority๋Š” ๋™๊ธฐ์‹ ๋ชจ๋“œ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋“ค์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋งค๊ธด ๊ฐ’์œผ๋กœ ๊ณ ์ •๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ’์ด ์ž‘์„์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉฐ 0์€ ํŠน๋ณ„ํ•œ ๊ฐ’์œผ๋กœ ๋น„๋™๊ธฐ์‹ ๋ชจ๋“œ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์šฐ์„ ์ˆœ์œ„๋Š” synchronous_standby_names ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‚˜์—ด๋œ ์ˆœ์„ ๋Œ€๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์„ค์ •์— ๋”ฐ๋ฅด๋ฉด standby1๊ณผ standby2์˜ ์šฐ์„ ์ˆœ์œ„๋Š” ๊ฐ๊ฐ 1, 2์ž…๋‹ˆ๋‹ค. synchronous_standby_names์— ์ž…๋ ฅ๋˜์ง€ ์•Š์€ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋Š” ๋น„๋™๊ธฐ์‹ ๋ชจ๋“œ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ์šฐ์„ ์ˆœ์œ„ ๊ฐ’์€ 0์ด ๋ฉ๋‹ˆ๋‹ค.

sync_state

sync_state๋Š” ๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ๋ชจ๋“  ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์‹คํ–‰ ์ƒํƒœ์™€ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ์— ๋Œ€ํ•œ ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•˜๋‹จ์˜ ์ƒํƒœ๋Š” Streaming Replication์˜ ์ค‘์š”ํ•œ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜์ธ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ Fail Over๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ํ•„์ˆ˜์ ์œผ๋กœ ์ˆ™์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
โ€ข
sync : ๋™์ž‘ํ•˜๋Š” ๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„ ์ค‘ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์ƒํƒœ
โ€ข
potential : sync ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ๋‚˜๋จธ์ง€ ๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์ธ ์ƒํƒœ. ๋งŒ์•ฝ sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ potential ์ƒํƒœ ์ค‘ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ sync ์ƒํƒœ๋กœ ๊ต์ฒด๋จ
โ€ข
async : ๋น„๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด์˜ ์ƒํƒœ๋กœ ๋™์ ์œผ๋กœ ๋‹ค๋ฅธ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์—†์Œ. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” async ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด๋ฅผ potential ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด์™€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ async ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด๋Š” sync๋‚˜ potential ์ƒํƒœ๋กœ ์ „ํ™˜๋  ์ˆ˜๋Š” ์—†์Œ
์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋“ค์˜ ์šฐ์„ ์ˆœ์œ„์™€ ์ƒํƒœ๋Š” ์•„๋ž˜ ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
testdb=# SELECT application_name AS host, sync_priority, sync_state FROM pg_stat_replication; host | sync_priority | sync_state ----------+---------------+------------ standby1 | 1 | sync standby2 | 2 | potential (2 rows)
Shell
๋ณต์‚ฌ
๋ช‡๋ช‡ ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹ค์ˆ˜์˜ sync ์ƒํƒœ์˜ ๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ACK๋งŒ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์“ฐ๊ธฐ ๋ฐ ํ”Œ๋Ÿฌ์‹œ๋งŒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์€ sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋งŒ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์™€์˜ ๋™๊ธฐํ™”์™€ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆผ 11.3์€ potential ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๊ฐ€ sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๋ณด๋‹ค ๋จผ์ € ํ”„๋ผ์ด๋จธ๋ฆฌ์— ๋„์ฐฉํ•œ ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” potential ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๊ฐ€ ๋„์ฐฉํ•˜๋”๋ผ๋„ ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์„ ์™„๋ฃŒํ•˜์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ ACK๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ํ”„๋ผ์ด๋จธ๋ฆฌ์˜ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค๋Š” ๋ž˜์น˜๋ฅผ ํ•ด์ง€ํ•˜๊ณ  ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
(๊ทธ๋ฆผ)
๋ฐ˜๋Œ€๋กœ sync ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๊ฐ€ ๋จผ์ € ๋„์ฐฉํ•˜๋ฉด potential ์ƒํƒœ์ธ ์Šคํƒ ๋ฐ”์ด์˜ ACK๊ฐ€ ๋„์ฐฉํ•˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋ฐ”๋กœ ๋ž˜์น˜๋ฅผ ํ•ด์ง€ํ•˜๊ณ  ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ํŠธ๋žœ์žญ์…˜์˜ ์ปค๋ฐ‹์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

Failure Handling

์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ์žฅ์• ๋ฅผ ํƒ์ง€ํ•˜๊ณ  ๋Œ€์ฒ˜ํ•˜๋Š”์ง€์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Failure Detection

ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋“ค์˜ ์žฅ์• ๋ฅผ ํƒ์ง€ํ•˜์—ฌ ์ ์ ˆํ•œ ๋Œ€์‘์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ฌธ๋‹จ์—์„œ๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณผ์ •์—์„œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋“ค์˜ ์žฅ์• ๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์žฅ์•  ๊ฐ์ง€ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ณผ์ •์€ ๋ณ„๋„์˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
1.
์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค์˜ ์žฅ์•  ๊ฐ์ง€
โ€ข
walsender์™€ walreceiver ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์ด ๋Š๊ธธ ๊ฒฝ์šฐ, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์ฆ‰์‹œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋‚˜ walreceiver์— ์žฅ์• ๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. walreceiver์˜ ์†Œ์ผ“ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์ฝ๊ธฐ๋‚˜ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ €์ˆ˜์ค€(Low level) ๋„คํŠธ์›Œํฌ ํ•จ์ˆ˜๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์ฆ‰์‹œ ์žฅ์• ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
2.
ํ•˜๋“œ์›จ์–ด๋‚˜ ๋„คํŠธ์›Œํฌ์˜ ์žฅ์•  ๊ฐ์ง€
โ€ข
wal_sender_timeout(๊ธฐ๋ณธ๊ฐ’์€ 60์ดˆ) ํŒŒ๋ผ๋ฏธํ„ฐ์— ์„ค์ •๋œ ์‹œ๊ฐ„๋™์•ˆ walreceiver๊ฐ€ ์‘๋‹ต์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ์žฅ์•  ๊ฐ์ง€์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ ๋” ์ด์ƒ ์‘๋‹ต์„ ๋ณด๋‚ผ ์ˆ˜ ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ wal_sender_timeout ๊ฐ’๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.
์žฅ์• ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์ฆ‰์‹œ ๊ฐ์ง€๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ ๋ถ€ํ„ฐ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์—์•ผ ๊ฐ์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์œ„์—์„œ ์„ค๋ช…ํ•œ ํ›„์ž์˜ ๊ฒฝ์šฐ, sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ๋‹ค๋ฅธ potential ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋“ค์ด ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ๋”๋ผ๋„ ํŠธ๋žœ์žญ์…˜์€ ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ์ค‘์ง€๋  ์ˆ˜๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.

Fail Over

Crash in non-sync standby

potential ๋˜๋Š” async ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ walsender๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋ชจ๋“  ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋Š” ์ด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์žฅ์• ๋กœ๋ถ€ํ„ฐ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Crash in sync standby

๋™๊ธฐ์‹ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋” ์ด์ƒ ACK๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๊ณ„์† ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰์ค‘์ด๋˜ ํŠธ๋žœ์žญ์…˜์€ ์ปค๋ฐ‹์„ ํ•  ์ˆ˜ ์—†๊ณ , ์ดํ›„์˜ ์ฟผ๋ฆฌ๋„ ์‹œ์ž‘๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์˜ ๋ชจ๋“  ์ž‘์—…์ด ์‚ฌ์‹ค์ƒ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. (Streaming Replication์€ ์ž๋™์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ์˜ํ•ด ๋™๊ธฐ์‹ ๋ชจ๋“œ์—์„œ ๋น„๋™๊ธฐ์‹ ๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋‹ค์ˆ˜์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋ฅผ ๋‘ฌ์„œ ์‹œ์Šคํ…œ ๊ฐ€์šฉ์„ฑ์„ ๋†’์ด๋Š” ๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ˆ˜๋™์œผ๋กœ ๋™๊ธฐ์‹(Synchronous)์—์„œ ๋น„๋™๊ธฐ์‹(Asynchronous)์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Multi-standby server
sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ๋™์ผํ•˜๊ฒŒ walsender๋ฅผ ์ข…๋ฃŒํ•˜๊ณ , potential ์ƒํƒœ ์ค‘ ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋ฅผ sync ์ƒํƒœ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
pontential์ด๋‚˜ async ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์˜ ์žฅ์• ์ผ ๋•Œ์™€๋Š” ๋‹ฌ๋ฆฌ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์—์„œ ์ง„ํ–‰ ์ค‘์ด๋˜ ์ฟผ๋ฆฌ๋Š” sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ์ƒ๊ธด ์‹œ์ ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋กœ ๊ต์ฒด๋  ๋•Œ๊นŒ์ง€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.
์–ด๋– ํ•œ ์ƒํ™ฉ์—๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๊ฐ€ ๋™๊ธฐ์‹ ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ํ•ญ์ƒ ํ•˜๋‚˜์˜ sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋งŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  sync ์ƒํƒœ์˜ ์Šคํƒ ๋ฐ”์ด ์„œ๋ฒ„๋Š” ํ•ญ์ƒ ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„์™€ ๋™๊ธฐํ™” ๋˜์–ด ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Convert sync to async manually
์ˆ˜๋™์œผ๋กœ ๋™๊ธฐ์‹์—์„œ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ ˆ์ฐจ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋„ ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ(Client)์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋จธ๋ฆฌ ์„œ๋ฒ„๋Š” ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์† ํ•˜๋ฉฐ, ๊ฐ ๋ฐฑ์—”๋“œ ํ”„๋กœ์„ธ์Šค์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ชจ๋“  ์„ธ์…˜๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
1.
postgresql.conf์˜ synchronous_standby_names ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด(Empty string)๋กœ ์ˆ˜์ •
synchronous_standby_names = ''
Shell
๋ณต์‚ฌ
2.
reload ์˜ต์…˜์„ ์ค˜์„œ pg_ctl์„ ์ˆ˜ํ–‰
postgres> pg_ctl -D $PGDATA reload
Shell
๋ณต์‚ฌ
์ง€๊ธˆ๊นŒ์ง€ PostgreSQL์˜ WAL 3 (Streaming Replication)์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค
โ€˜PostgreSQL์˜ Extension Frameworkโ€™๋ฅผ ๋ฐ”๋กœ ์ด์–ด์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”!

์ž์œ ๋กญ๊ฒŒ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”