V1 Migration - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

0. ๋„์ž… ๋ฐฐ๊ฒฝ ๋ฐ ๋ชฉํ‘œ

๊ธฐ์กด V1 ํ™˜๊ฒฝ(10.0.0.0/16)์˜ EC2 ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜์ธ V2 VPC(192.168.10.0/16)์˜ RDS๋กœ ์ด์ „ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ค‘๋‹จ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ, ๋ณด์•ˆ๊ณผ ๋น„์šฉ ํšจ์œจ์„ฑ์„ ๋ชจ๋‘ ์žก๊ธฐ ์œ„ํ•ด AWS DMS(Database Migration Service) ๋ฅผ ํ™œ์šฉํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


1. ๋„คํŠธ์›Œํฌ ์„ค๊ณ„: ์™œ VPC Peering์ธ๊ฐ€?

๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ด๋™์„ ๋„˜์–ด, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด VPC Peering์„ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ (Security): ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณต์šฉ ์ธํ„ฐ๋„ท์„ ํƒ€์ง€ ์•Š๊ณ  AWS ๋‚ด๋ถ€๋ง์œผ๋กœ๋งŒ ํ๋ฆ…๋‹ˆ๋‹ค. DB ํฌํŠธ(5432)๋ฅผ ์™ธ๋ถ€๋กœ ๊ฐœ๋ฐฉํ•  ํ•„์š” ์—†์ด ์ƒ๋Œ€ VPC ๋Œ€์—ญ์—๋งŒ ํ—ˆ์šฉํ•˜๋ฉด ๋˜๋ฏ€๋กœ ํ•ดํ‚น ์œ„ํ˜‘์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์šฉ ์ ˆ๊ฐ (Cost Efficiency): ์ธํ„ฐ๋„ท ๊ฒฝ์œ  ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋†’์€ 'Data Transfer Out' ๋น„์šฉ์„ ํ”ผํ•˜๊ณ , ๋™์ผ ๋ฆฌ์ „ ๋‚ด ๋‚ด๋ถ€ ํ†ต์‹  ๋น„์šฉ๋งŒ ์ง€๋ถˆํ•˜์—ฌ ์ˆ˜๋ฐฑ GB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฝ์ œ์ ์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ (Reliability): ๊ณต์šฉ ์ธํ„ฐ๋„ท์˜ ๋ณ€๋™์„ฑ(Jitter) ์—†์ด ์ €์ง€์—ฐ(Low Latency) ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜์—ฌ, ๋Œ€์šฉ๋Ÿ‰ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ ์—ฐ๊ฒฐ ๋Š๊น€์œผ๋กœ ์ธํ•œ ์žฌ์ž‘์—… ๋ฆฌ์Šคํฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2. ์›Œํฌ๋กœ๋“œ ๋ถ„์„ ๋ฐ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ „๋žต

๋‹จ์ˆœ ๋ณต์ œ๊ฐ€ ์•„๋‹Œ, ์„œ๋น„์Šค ํŠน์„ฑ์— ๋งž๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒ€์ฆ์„ ์œ„ํ•ด 'ํ˜„์‹ค์„ฑ' ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Read vs Write ์ง‘์ค‘๋„: ์ผ๋ฐ˜ ๊ฒŒ์‹œํŒ๊ณผ ๋‹ฌ๋ฆฌ ์ฑ—๋ด‡ ์„œ๋น„์Šค๋Š” ๋Œ€ํ™” ๊ธฐ๋ก ์ €์žฅ ๋ฐ ์ƒํƒœ ์œ ์ง€๋ฅผ ์œ„ํ•œ Write ๋น„์ค‘์ด ๋งค์šฐ ๋†’์Šต๋‹ˆ๋‹ค.
  • ๋ถ€ํ•˜ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ฑ—๋ด‡์˜ ๊ธด ํŠธ๋žœ์žญ์…˜ ํŠน์„ฑ์„ ๋ฐ˜์˜ํ•˜์—ฌ DB ์ปค๋„ฅ์…˜ ํ’€(Connection Pool) ๊ณ ๊ฐˆ ๋ฐ ๋ฐ๋“œ๋ฝ(Deadlock) ์ƒํ™ฉ์„ ์˜๋„์ ์œผ๋กœ ์ฃผ์ž…, ํƒ€๊ฒŸ RDS๊ฐ€ ์šด์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ฌ์ „์— ๊ฒ€์ฆํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. (Staging์—์„œ ์ฒดํฌ ์˜ˆ์ •)

3. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ •

3.1 ์†Œ์Šค ์—”๋“œํฌ์ธํŠธ ์ ‘์† ๋ถˆ๊ฐ€ (PostgreSQL ์„ค์ •)

DMS ๋ณต์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ ์†Œ์Šค DB์— ์ ‘์†ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์ œ1๊ด€๋ฌธ (postgresql.conf): listen_addresses๊ฐ€ localhost๋กœ ์ œํ•œ๋˜์–ด ์žˆ์–ด ์™ธ๋ถ€ ์‹ ํ˜ธ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”„๋ผ์ด๋น— IP๋กœ ์ˆ˜์ •ํ•˜์—ฌ ๊ท€๋ฅผ ์—ด์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ œ2๊ด€๋ฌธ (pg_hba.conf): ์‹ ๋ถ„์ฆ ๊ฒ€์‚ฌ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. DMS ๋ณต์ œ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋ผ์ด๋น— IP์— ๋Œ€ํ•ด scram-sha-256 ๋ฐฉ์‹์˜ ์ ‘์† ๊ถŒํ•œ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

3.2 ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”(CDC)๋ฅผ ์œ„ํ•œ wal_level ๋ณ€๊ฒฝ

DMS์˜ ํ•ต์‹ฌ์ธ CDC(Change Data Capture) ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๋กœ๊ทธ ์ˆ˜์ค€์„ replica์—์„œ logical๋กœ ๊ฒฉ์ƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ: wal_level ๋ณ€๊ฒฝ์€ ๋‹จ์ˆœ 'Reload'๊ฐ€ ์•„๋‹Œ DB ํ”„๋กœ์„ธ์Šค ์žฌ์‹œ์ž‘์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • ๋Œ€์‘ ์ „๋žต: * ๊ฐœ๋ฐœ ํ™˜๊ฒฝ: ์ƒˆ๋ฒฝ ์‹œ๊ฐ„๋Œ€ ์ ๊ฒ€ ์ฐฝ(Maintenance Window)์„ ํ™œ์šฉํ•œ ์ฆ‰์‹œ ์žฌ์‹œ์ž‘.
  • ์šด์˜ ํ™˜๊ฒฝ (Blue-Green): ์šด์˜ DB์˜ EBS ์Šค๋ƒ…์ƒท์œผ๋กœ Green ์„œ๋ฒ„๋ฅผ ๋ณต์ œ ํ›„, Green ์„œ๋ฒ„์—์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์šดํƒ€์ž„์„ ์ตœ์†Œํ™”ํ•˜๋Š” ์ „๋žต์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

3.3 ํƒ€๊ฒŸ RDS PK ์ œ์•ฝ ์กฐ๊ฑด ์œ„๋ฐ˜ (ID Null ์—๋Ÿฌ)

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘ null value in column "id" violates not-null constraint ์—๋Ÿฌ์™€ ํ•จ๊ป˜ 500 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์›์ธ: DMS์˜ ์ž๋™ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์˜ต์…˜(Drop tables on target) ์‚ฌ์šฉ ์‹œ, ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ณต์‚ฌ๋˜์ง€๋งŒ Serial/Identity/Sequence ๊ฐ™์€ ์ž๋™ ์ฆ๊ฐ€(Auto-increment) ์†์„ฑ์ด ๋ˆ„๋ฝ๋˜๋Š” ํ˜„์ƒ์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ:
  1. pg_dump๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํ‚ค๋งˆ(๊ตฌ์กฐ)๋งŒ ๋จผ์ € ํƒ€๊ฒŸ RDS์— ์ƒ์„ฑํ•˜์—ฌ Sequence๋ฅผ ์œ ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. DMS ์„ค์ •์„ TargetTablePrepMode = TRUNCATE๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ, ์ด๋ฏธ ์ •์˜๋œ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋งŒ ์ฑ„์šฐ๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

4. ๋ฐฐ์šด ์  ๋ฐ ๊ฒฐ๋ก 

  1. ๋„๊ตฌ์˜ ํ•œ๊ณ„ ์ดํ•ด: DMS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ฃผ์ง€๋งŒ, ์ธ๋ฑ์Šค๋‚˜ ์ž๋™ ์ฆ๊ฐ€ ๊ฐ’(Sequence) ๊ฐ™์€ ์ƒ์„ธํ•œ DB ์˜ค๋ธŒ์ ํŠธ๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์žฌํ˜„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. "์Šคํ‚ค๋งˆ๋Š” ์ˆ˜๋™, ๋ฐ์ดํ„ฐ๋Š” DMS" ๋ผ๋Š” ๊ณต์‹์˜ ์ค‘์š”์„ฑ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
  2. ๋„คํŠธ์›Œํฌ๊ฐ€ ์šฐ์„ : ์•ˆ์ •์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๊ธฐ๋ฐ˜์€ ํƒ„ํƒ„ํ•œ VPC ์„ค๊ณ„(Peering)์—์„œ ์‹œ์ž‘๋จ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ์„ฑ๊ฒฉ์— ๋”ฐ๋ฅธ ๋ถ„๋ฆฌ: ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธธ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. Redis์˜ ratelimit ๊ฐ™์€ ํœ˜๋ฐœ์„ฑ ๋ฐ์ดํ„ฐ๋Š” ๊ณผ๊ฐํžˆ ์ œ์™ธํ•˜์—ฌ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ํšจ์œจ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.