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โ๋ฅผ ๋ฐ๋ก ์ด์ด์ ํ์ธํด๋ณด์ธ์!