Skip to content

Latest commit

ย 

History

History
551 lines (375 loc) ยท 22.6 KB

File metadata and controls

551 lines (375 loc) ยท 22.6 KB

๋ชฉ์ฐจ



๋“ค์–ด๊ฐ€๋ฉฐ

DB ์š”์ฒญ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ฝ๊ธฐ ์ž‘์—…์ด ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ์‹œ DB๋ฅผ ๋ถ„์‚ฐ์ฒ˜๋ฆฌํ•˜๋ฉด ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ๋ก  ์“ฐ๊ธฐ ์š”์ฒญ์ด ๋นˆ๋ฒˆํ•  ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์•ˆ ์ข‹์•„์งˆ ์ˆ˜๋„ ์žˆ๋‹ค.

DB ์กฐํšŒ์— ๋Œ€ํ•œ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์ฒ˜๋ฆฌ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ Replication์ด๋‹ค.

์œ„ํ‚ค์—์„  DB Replication์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

Database replication can be used on many database management systems (DBMS), usually with a primary/replica relationship between the original and the copies. The master logs the updates, which then ripple through to the replicas. Each replica outputs a message stating that it has received the update successfully, thus allowing the sending of subsequent updates.

ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด, ์—ฌ๋Ÿฌ ๊ฐœ์˜ DB๋ฅผ ์ˆ˜์ง์ ์ธ ๊ตฌ์กฐ(Master - Slave)๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ, Master DB์—์„  ์“ฐ๊ธฐ ์ž‘์—…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , Slave DB๋“ค์—์„  ์ฝ๊ธฐ ์ž‘์—…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  Master DB์—์„œ์˜ ์“ฐ๊ธฐ ์ž‘์—…์€ ๋ชจ๋‘ ๋‹ค๋ฅธ ํ•˜๋‚˜ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ Slave DB๋กœ ๋ณต์ œํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.


์ด๋ฒˆ ๊ธ€์˜ ๋ชฉ์ ์€ DB Replication์˜ ๊ฐœ๋…์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜๊ณ , MySQL์—์„œ์˜ Replication ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ๊ตฌํ˜„ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๊ธ€์—์„œ Spring Boot + JPA ๊ธฐ๋ฐ˜์˜ ์กฐํšŒ์‹œ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ Slave DB์™€ ์ปค๋„ฅ์…˜ ๋งบ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค.


DB Replication ๊ฐœ๋…

๋จผ์ € DB Replication์˜ ๊ฐœ๋…๊ณผ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜์˜€๋‹ค.


๐Ÿค” DB Replication?

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ DB๋ฅผ ์ˆ˜์ง์ ์ธ ๊ตฌ์กฐ(Master - Slave)๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ, Master DB์—์„  ์“ฐ๊ธฐ ์ž‘์—…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , Slave DB๋“ค์—์„  ์ฝ๊ธฐ ์ž‘์—…๋งŒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹
    • ๋งˆ์Šคํ„ฐ (๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„)์™€ ์Šฌ๋ ˆ์ด๋ธŒ (์กฐํšŒ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„)๋กœ ๋‚˜๋‰œ๋‹ค.

๐Ÿค” DB Replication ์‚ฌ์šฉ ์ด์œ 

  • ๋ฐ์ดํ„ฐ ๋ฐฑ์—…
  • DBMS ์กฐํšŒ ๋ถ€ํ•˜๋ถ„์‚ฐ
  • ๋ฐ์ดํ„ฐ ๋ถ„์„
  • ๋ฐ์ดํ„ฐ์˜ ์ง€๋ฆฌ์  ๋ถ„์‚ฐ

๐Ÿค” DB Replication ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • DB ์š”์ฒญ์˜ ๋Œ€๋ถ€๋ถ„์ด ์ฝ๊ธฐ ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์— Replication์œผ๋กœ ์ถฉ๋ถ„ํžˆ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋น„๋™๊ธฐ ๋ฐฉ์‹ (MySQL์˜ ๊ฒฝ์šฐ)์œผ๋กœ ์šด์˜๋˜๋ฏ€๋กœ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ์—†๋‹ค.
  • ๋‹จ์ 
    • ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋“ค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๊ฐ€ ์™„๋ฒฝํžˆ ๋ณด์žฅ๋  ์ˆœ ์—†๊ธฐ์— ์ผ๊ด€์„ฑ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • Master ๋…ธ๋“œ์— ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์šด๋˜๋ฉด ๋ณต๊ตฌ ๋ฐ ๋Œ€์ฒ˜๊ฐ€ ํž˜๋“ค๋‹ค.

MySQL DB Replication ๋™์ž‘ ์›๋ฆฌ

์ด๋ฒˆ์—” ์šฐ์„  ๋Œ€ํ‘œ์ ์ธ RDBMS์ค‘ ํ•˜๋‚˜์ธ MySQL๋Š” ์–ด๋–ป๊ฒŒ Replication์„ ๋‹ค๋ฃจ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ์™€ Replication ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฌ๋‹ค.


๋™์ž‘์›๋ฆฌ


์ถœ์ฒ˜: RealMySQL

  1. ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ๋‚˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฌธ์žฅ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ์ €์žฅํ•œ๋‹ค.
  2. ์Šฌ๋ ˆ์ด๋ธŒ ์„œ๋ฒ„์—์„œ I/O ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์š”์ฒญํ•˜๋ฉด ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ฝ์–ด ์Šฌ๋ ˆ์ด๋ธŒ์—๊ฒŒ ๋„˜๊ธด๋‹ค.
  3. ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ๋ฐ›์•„์˜จ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ๋‹ค.
  4. ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์— ๊ธฐ๋ก๋œ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์žฌ์‹คํ–‰(Reply)ํ•จ์œผ๋กœ์จ ๋™๊ธฐํ™”ํ•œ๋‹ค.

๐Ÿ’โ€โ™‚๏ธ ๋งˆ์Šคํ„ฐ

  • Replication์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋จผ์ € ๋งˆ์Šคํ„ฐ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๋ณต์ œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค.
    • ์ด ์ž‘์—…์€ ์“ฐ๊ธฐ๊ฐ€ ๋ฒ„ํผ๋ง๋˜๋ฉฐ, ์ˆœ์ฐจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ ํฐ ์ €ํ•˜๋Š” ์—†๋‹ค.
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์—๋Š” ๋‚˜์ค‘์— ์Šฌ๋ ˆ์ด๋ธŒ๊ฐ€ ์ฝ์„ ๋ฐ์ดํ„ฐ(์ด๋ฒคํŠธ)๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ๋งˆ์Šคํ„ฐ๋Š” ์Šฌ๋ ˆ์ด๋ธŒ ํ•˜๋‚˜๋‹น ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜์„ ๋งบ๊ณ  ์žˆ๋‹ค. (Binlog dump Thread)
    • ์ƒˆ๋กœ์šด ์Šฌ๋ ˆ์ด๋ธŒ ์ปค๋„ฅ์…˜์ด ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปค๋„ฅ์…˜์„ ๋งบ๋Š”๋‹ค.
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋คํ”„ ์Šค๋ ˆ๋“œ๋Š” ์Šฌ๋ ˆ์ด๋ธŒ๋‹น ํ•˜๋‚˜.
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋คํ”„ ์Šค๋ ˆ๋“œ์˜ ์—ญํ• 
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ์ด๋ฒคํŠธ๋ฅผ ์Šฌ๋ ˆ์ด๋ธŒ์— ์•Œ๋ฆฐ๋‹ค.
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์˜ ์ด๋ฒคํŠธ๋ฅผ ์Šฌ๋ ˆ์ด๋ธŒ์— ์ „๋‹ฌํ•œ๋‹ค.
  • ์ตœ์‹  ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋Š” ๋งˆ์Šคํ„ฐ์˜ OS ์บ์‹œ์— ์ €์žฅ๋˜๋ฏ€๋กœ, ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ์˜ค๋ž˜๋˜์ง€ ์•Š์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ(์‹ค์‹œ๊ฐ„)์˜ ๊ฒฝ์šฐ, ๋ชจ๋‘ ๋งˆ์Šคํ„ฐ์˜ ์บ์‹œ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฝ์–ด๊ฐ„๋‹ค.
    • ๋””์Šคํฌ I/O๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ฌผ๋ก  ์˜ค๋ž˜๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์ฝ๋Š”๋‹ค๋ฉด ๋””์Šคํฌ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ๋‹ค.

๐Ÿ’โ€โ™‚๏ธ ์Šฌ๋ ˆ์ด๋ธŒ

  • Replication ๊ธฐ๋Šฅ์„ ์ ์šฉ์‹œํ‚ค๋ฉด ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ. IO ์Šค๋ ˆ๋“œ
    • ๋งˆ์Šคํ„ฐ์™€ ์ปค๋„ฅ์…˜์„ ๋งบ๊ณ  ์žˆ๋Š”๋‹ค.
    • ๋งˆ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์ฝ๊ณ  ๋ฆด๋ ˆ์ด ๋กœ๊ทธ(๋กœ์ปฌ ๋กœ๊ทธ ํŒŒ์ผ)์— ๋ณต์‚ฌํ•œ๋‹ค.
    • ์ƒํƒœ ์ฒดํฌ๋Š” SHOW slave STATUS\G๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Master_Log_File - ๋งˆ์Šคํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ณต์‚ฌํ•œ ๋งˆ์ง€๋ง‰ ํŒŒ์ผ (๋ณดํ†ต ๋งˆ์Šคํ„ฐ ๋กœ๊ทธ ํŒŒ์ผ๋กœ ๊ณ„์† ๋™์ผ)
      • Read_Master_Log_Pos - ๋ฐ›์•„์˜จ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋Š” ์ด ์œ„์น˜๊นŒ์ง€ ์Šฌ๋ ˆ์ด๋ธŒ์˜ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์— ๋ณต์‚ฌ๋œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์Šค๋ ˆ๋“œ. SQL ์Šค๋ ˆ๋“œ
    • ์Šฌ๋ ˆ์ด๋ธŒ ๋กœ์ปฌ์— ์ €์žฅ๋œ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฝ์€ ๋‹ค์Œ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ ์šฉ์‹œํ‚จ๋‹ค.
    • ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ผ๋Š” ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค
    • ์ƒํƒœ ์ฒดํฌ๋Š” SHOW slave STATUS\G๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      • Relay_Master_Log_File - SQL Thread๊ฐ€ ์ž‘์—…์ค‘์ธ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํŒŒ์ผ.
      • Exec_Master_Log_Pos - SQL Thread์— ์˜ํ•ด ์‹คํ–‰๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ์œ„์น˜.

์ด๋ฒคํŠธ


๐Ÿค” ์ด๋ฒคํŠธ

  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ ํ˜น์€ DB ๊ตฌ์กฐ, ๊ณ„์ •, ๊ถŒํ•œ ๋ณ€๊ฒฝ ์ •๋ณด๋“ค์„ ์ด๋ฒคํŠธ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋ก๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๋‹จ์œ„.

๐Ÿค” ์ด๋ฒคํŠธ์˜ ์ข…๋ฅ˜

  • Statement Based
    • ์‹คํ–‰๋œ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ๊ทธ๋Œ€๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹.
  • Row Based
    • ์ƒ์„ฑ/๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ์˜ Before/After row image๊ฐ€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹.

Replication ๋ฐฉ์‹

MySQL์˜ Replication ๊ธฐ๋Šฅ์˜ ๋ณต์ œ ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค.

  • Async Replication (๋น„๋™๊ธฐ ๋ณต์ œ)
  • Semi-sync Replication (์ค€๋™๊ธฐ ๋ณต์ œ)

Async Replication

  • ๋น„๋™๊ธฐ ๋ณต์ œ ๋ฐฉ์‹์ด๋ฉฐ, ํŠธ๋žœ์žญ์…˜์ด Commit ๋˜๊ณ  ์Šฌ๋ ˆ์ด๋ธŒ ์ž์ฒด์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  • ๋งˆ์Šคํ„ฐ DB๋Š” Transacntion ์ˆ˜ํ–‰ ์ค‘ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ์ธํ•œ ์ถ”๊ฐ€์ ์ธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ณต์ œ ๊ณผ์ •์ด Transaction๊ณผ ๋ณ„๊ฐœ๋กœ ์ง„ํ–‰๋œ๋‹ค.
    • ์ด๋Š” ๋งˆ์Šคํ„ฐ๊ฐ€ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์ „ํ˜€ ์—†๋‹ค๋Š” ์˜๋ฏธ.
    • ๋‹ค๋งŒ, ๋น„๋™๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Šคํ„ฐ์—์„œ Transaction์ด ์™„๋ฃŒ๋œ DB ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด๋”๋ผ๋„ ์Šฌ๋ ˆ์ด๋ธŒ์— ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์ง„ ์•Š๋Š”๋‹ค. ์ด๋กœ ์ธํ•ด ๋งˆ์Šคํ„ฐ์˜ ๊ฐ‘์ž‘์Šค๋Ÿฐ ์žฅ์• ๋กœ ์Šฌ๋ ˆ์ด๋ธŒ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์Šฌ๋ ˆ์ด๋ธŒ์˜ ์žฅ์• ๋Š” ๋งˆ์Šคํ„ฐ์˜ Transaction์—” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
    • ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ๋ณต๊ตฌ ๋œ ํ›„ ์ค‘๋‹จ๋˜์—ˆ๋˜ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ ์œ„์น˜๋ถ€ํ„ฐ ์ด์–ด์„œ ์ง„ํ–‰ํ•œ๋‹ค.
  • ๋™์ž‘ ๊ณผ์ •
    1. ๋งˆ์Šคํ„ฐ๋Š” ์Šฌ๋ ˆ์ด๋ธŒ์— ๊ด€๊ณ„์—†์ด DB์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•œ๋‹ค.
    2. ๋งˆ์Šคํ„ฐ์˜ Dump Thread์™€ ์Šฌ๋ ˆ์ด๋ธŒ์˜ I/O Thread๋Š” ์ปค๋„ฅ์…˜์„ ๋งบ๊ณ  ์žˆ๋‹ค.
    3. ์Šฌ๋ ˆ์ด๋ธŒ I/O Thread๋Š” ํŠน์ • ์‹œ๊ฐ„๋งˆ๋‹ค ๋งˆ์Šคํ„ฐ์˜ Dump Thread๋ฅผ ํ†ตํ•ด ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์ „๋‹ฌ๋ฐ›์•„ ์ž์‹ ์˜ ๋ฆด๋ ˆ์ด ๋กœ๊ทธ์— ๋ณต์‚ฌํ•œ๋‹ค.
    4. ์Šฌ๋ ˆ์ด๋ธŒ SQL Thread๋Š” ๋ฆด๋ ˆ์ด ๋กœ๊ทธ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž์‹ ์˜ DB๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

Binary Log vs. Redo Log

  • Binary Log: MySQL์˜ ์ „๋ฐ˜์ ์ธ ๋™์ž‘์„ ๊ธฐ๋กํ•˜๋Š” ๋กœ๊ทธ.
  • Redo Log: MySQL InnoDB์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ Query ์žฌ์‹คํ–‰, Query Rollback์‹œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Query๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋กœ๊ทธ.

Semi-sync Replication


์ถœ์ฒ˜: https://ssup2.github.io/theory_analysis/MySQL_Replication/

  • ์ค€๋™๊ธฐ ๋ณต์ œ ๋ฐฉ์‹์ด๋ฉฐ, ๋งˆ์Šคํ„ฐ๊ฐ€ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ๋ถ€ํ„ฐ ๋ฆด๋ ˆ์ด ๊ธฐ๋ก์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ACK๋ฅผ ๋ฐ›๊ณ  Transaction์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ๋งˆ์Šคํ„ฐ DB๋Š” Transaction ์ˆ˜ํ–‰ ์ค‘ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ ์ธํ•œ ์ถ”๊ฐ€์ ์ธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • ์ด๋Š” ๋น„๋™๊ธฐ ๋ณต์ œ๋ณด๋‹ค ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์›์ธ.
    • ๋งŒ์•ฝ ๋งˆ์Šคํ„ฐ๊ฐ€ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ๋ถ€ํ„ฐ ACK๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋ฉด Transaction์€ ์ค‘๋‹จ๋œ๋‹ค. ๋‹จ, ๋งˆ์Šคํ„ฐ๋Š” ์—ฌ๋Ÿฌ ์Šฌ๋ ˆ์ด๋ธŒ์ค‘ ํ•˜๋‚˜์˜ ์Šฌ๋ ˆ์ด๋ธŒ๋กœ๋ถ€ํ„ฐ ACK๋ฅผ ๋ฐ›์œผ๋ฉด Transaction์„ ์ง„ํ–‰ํ•œ๋‹ค.
    • ์„ฑ๋Šฅ์€ ์ €ํ•˜๋˜์ง€๋งŒ, ์ฆ‰, ์ ์–ด๋„ ํ•˜๋‚˜์˜ Slave์—๋Š” ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.
  • ์ค€๋™๊ธฐ ๋ณต์ œ ๋ฐฉ์‹์€ ๋งˆ์Šคํ„ฐ๊ฐ€ ์Šฌ๋ ˆ์ด๋ธŒ์—๊ฒŒ DB ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์–ธ์ œ ์ „๋‹ฌํ•˜๋А๋ƒ์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
    1. AFTER_COMMIT: MySQL 5.5 ์ด์ „
      • Master DB์˜ ํ…Œ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  Slave์— Binlog๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹.
      • Master DB์— ๋จผ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฏ€๋กœ, ์ด๋•Œ Master์— ์กฐํšŒํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Slave์— ์กฐํšŒํ•˜๋ฉด ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
    2. AFTER_SYNC: MySQL 5.7 ์ดํ›„ (lossless replication๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค)
      • AFTER_COMMIT์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ replication ๋ฐฉ์‹.
      • ๋จผ์ € Slave์— ์—…๋ฐ์ดํŠธ ๊ด€๋ จ Binlog๋ฅผ ๋ณด๋‚ด๊ณ , Master์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹.


AFTER_COMMIT์˜ ๋ฌธ์ œ์ 
์ถœ์ฒ˜: http://my-replication-life.blogspot.com/2013/09/loss-less-semi-synchronous-replication.html


DB Replication ๊ตฌํ˜„ (MySQL)

์ด์ œ ์‹ค์Šต์œผ๋กœ MySQL์„ ์ด์šฉํ•˜์—ฌ Replication์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์ „์ฒด์ ์ธ ๊ตฌํ˜„ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๊ฐœ๋ณ„ ์„œ๋ฒ„์— MySQL DB ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • (IP, Port, ๊ณ„์ •, ๊ถŒํ•œ ๋“ฑ๋“ฑ)
  2. Master ์„œ๋ฒ„์™€ Slave ์„œ๋ฒ„ Replication ์—ฐ๊ฒฐ ์„ค์ •
  3. WAS (Spring Boot + JPA) DB ์—ฐ๊ฒฐ ๋ฐ Slave DB ์„ ํƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„

์ด๋ฒˆ ๊ธ€์—์„  1, 2๋ฒˆ๋งŒ ๋‹ค๋ฃจ๊ณ , 3๋ฒˆ์€ ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ฃฌ๋‹ค.

๊ตฌ์„ฑํ•˜๊ณ ์žํ•˜๋Š” DB๋ฅผ ๊ฐ๊ฐ์˜ EC2 ํ˜น์€ ๊ฐ€์ƒ ํ™˜๊ฒฝ์— ์„ค์น˜ํ•˜๊ณ , Master ์„œ๋ฒ„์™€ Slave ์„œ๋ฒ„์— Replication ์„ค์ •์„ ํ•ด๋‘๋ฉด Master์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ž๋™์ ์œผ๋กœ Slave ์„œ๋ฒ„๋“ค์— ์ ์šฉ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Spring Boot + JPA์—์„  ์“ฐ๊ธฐ ์ž‘์—…์ผ ๋• Master, ์ฝ๊ธฐ ์ž‘์—…์ผ ๋• Slave๋กœ ์ปค๋„ฅ์…˜ ๋งบ๋„๋ก ์„ค์ •๋งŒ ํ•ด์ฃผ๋ฉด๋œ๋‹ค.


1 - DB ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ •

๊ฐ€์žฅ ๋จผ์ € ํ•  ์ž‘์—…์€ ๋‹น์—ฐํžˆ Master DB์™€ Slave DB๋“ค์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•„์ž๋Š” Master DB ํ•œ๋Œ€, Slave DB ํ•œ๋Œ€๋ฅผ ๊ฐ๊ฐ ๋‹ค๋ฅธ EC2์— ์„ค์น˜ํ–ˆ๋‹ค.

ํ™˜๊ฒฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Ubuntu 18.04 LTS
  • MySQL 5.7.36

์•„๋ž˜ ๋ถ€ํ„ฐ ๋‚˜์˜ค๋Š” ์„ค์น˜ ๋ฐ ์„ค์ •์€ Master์™€ Slave ๋ชจ๋‘ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.


apt(ํŒจํ‚ค์ง€) ๋ฐฉ์‹ ์„ค์น˜

$ sudo apt update
$ sudo apt-cache search mysql-server
$ sudo apt-get install mysql-server-5.7

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ์ž๋™์œผ๋กœ Service๋กœ ์‹คํ–‰์ด ๋˜๊ณ  ์žˆ๋‹ค.


MySQL 5.7 ํ™˜๊ฒฝ ์„ค์ •

MySQL 5.7์„ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๋ฉด ์•„๋ž˜ ์œ„์น˜์— ์„ค์ •ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค.

/etc/mysql/mysql.conf.d/mysqld.cnf

๊ทธ๋ฆฌ๊ณ  ์šฐ์„ ์€ ์œ„ ํŒŒ์ผ ์„ค์ •์—์„œ ๋‘ ๊ฐ€์ง€๋งŒ ์ˆ˜์ •ํ•ด์ค€๋‹ค.

  • bind-address: ์™ธ๋ถ€์—์„œ ์ ‘์†์„ ํ—ˆ์šฉํ•  IP
    • ๋ชจ๋“  IP์— ๋Œ€ํ•ด์„œ ํ—ˆ์šฉํ•˜๋ ค๋ฉด 0.0.0.0์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
    • ๋””ํดํŠธ๋Š” 127.0.0.1์ด๋‹ค.
  • port: MySQL์„ ์˜ฌ๋ฆด Port (์™ธ๋ถ€ ์ ‘์† Port)
    • 8888๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 8888๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

๋‘ ๊ฐ€์ง€๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, ์ €์žฅํ•˜๊ณ  ๋‚˜์™€์„œ ์•„๋ž˜์™€ ๊ฐ™์ด MySQL์„ ์žฌ์‹คํ–‰ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

$ sudo service mysql restart

์ด์™ธ์˜ ์—ฌ๋Ÿฌ ์„ค์ •์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ .


2 - Master์™€ Slave ์„œ๋ฒ„ Replication ์—ฐ๊ฒฐ ์„ค์ •

์ด์ œ DB๊ฐ€ ์„ค์น˜๋˜์—ˆ์œผ๋‹ˆ ๋ณธ๊ฒฉ์ ์œผ๋กœ Replication ์„ค์ •์„ ํ•ด์ค€๋‹ค.


Master DB ์„œ๋ฒ„ ์„ค์ •

Master์™€ Slave์ค‘ Master DB๋ฅผ ๋จผ์ € ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.


๊ณ„์ • ์ƒ์„ฑ ๋ฐ ์„ค์ •

Replication์— ์‚ฌ์šฉ๋  ๊ณ„์ •์„ ์ƒ์„ฑํ›„ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์šฐ์„  ๊ณ„์ •์„ ์ƒ์„ฑํ•œ๋‹ค.

$ mysql -u root -p

mysql> USE mysql;

mysql> CREATE user '{๊ณ„์ • ์ด๋ฆ„}'@'{% ํ˜น์€ Slave IP}' identified by '{๋น„๋ฐ€๋ฒˆํ˜ธ}';

# ์˜ˆ์‹œ
mysql> CREATE user 'replication_master'@'%' IDENTIFIED BY 'password';

๊ณ„์ •์ด ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€ (Query OK, 0 rows affected (0.00 sec))๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด ๊ถŒํ•œ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

'%'๋Š” ๋ชจ๋“  IP์— ๋Œ€ํ•ด์„œ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๊ถŒํ•œ ์„ค์ •์ด๋ž€ ํŠน์ • ๊ณ„์ •์ด ํŠน์ • ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

mysql> GRANT REPLICATION SLAVE ON {* ํ˜น์€ ์Šคํ‚ค๋งˆ ์ด๋ฆ„}.{* ํ˜น์€ ํ…Œ์ด๋ธ” ์ด๋ฆ„} TO '{์œ ์ € ์ด๋ฆ„}'@'{ % ํ˜น์€ Slave IP }';

# ์˜ˆ์‹œ
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_master'@'%';

*์€ ๋ชจ๋“  ํ…Œ์ด๋ธ” ํ˜น์€ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•ด์„œ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๊ถŒํ•œ ์„ค์ •์ด ์ž˜ ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๋œฌ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ๋ฐ˜์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

mysql> FLUSH PRIVILEGES;

Replication์— ์‚ฌ์šฉ๋  ๊ณ„์ •์ด ํŠน์ • DB์˜ DDL ๊ถŒํ•œ์„ ์–ป์„๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

GRANT ALL PRIVILEGES ON '{DB(์Šคํ‚ค๋งˆ)๋ช…}'.* TO '{๊ณ„์ • ์ด๋ฆ„}'@'%';


Master DB ํ™˜๊ฒฝ ์„ค์ •

์ด์ œ Master DB์— ๋Œ€ํ•œ ํ™˜๊ฒฝ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
server-id              = 1
log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days       = 10
max_binlog_size        = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name
  • server-id: MySQL ์„œ๋ฒ„๋“ค์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ id
    • ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ์— ์ด๋ฒคํŠธ๋ณ„๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋ฐœ์ƒํ•œ DB๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
    • Master์™€ Slave DB๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฏ€๋กœ, ๊ฐ๊ฐ์˜ DB๋Š” ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • log_bin: ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํŒŒ์ผ ์ €์žฅ ์œ„์น˜ ๋ฐ ํ˜•์‹
  • binlog_do_db: Replication ์„ค์ •ํ•  DB(์Šคํ‚ค๋งˆ) ๋ช…
    • ์ƒ๋žต์‹œ ์ „์ฒด DB๋ฅผ Replicationํ•œ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ DB๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ์‹ถ์œผ๋ฉด, ์ค‘๋ณตํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • binlog_ignore_db: Replication ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ DB(์Šคํ‚ค๋งˆ) ๋ช… ์„ค์ •
    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ DB๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ์‹ถ์œผ๋ฉด, ์ค‘๋ณตํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋‘ ์„ค์ •์— ๋‹ฌ๋ฆฐ ์ฃผ์„์„ ํ’€์–ด์ฃผ๊ณ  ์ ์ ˆํžˆ ์„ค์ •ํ•œ ํ›„ MySQL์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


MySQL๋ฅผ ๋‹ค์‹œ ์ ‘์†ํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ œ๋Œ€๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ง€ ํ™•์ธํ•ด์ค€๋‹ค.

mysql> SHOW master STATUS\G;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
  • File: MySQL ๋กœ๊ทธ ํŒŒ์ผ
  • Position: ๋กœ๊ทธ ํŒŒ์ผ ๋‚ด ์ฝ์„ ์œ„์น˜
  • Binlog_Do_DB: Replication ์„ค์ •ํ•œ DB ๋ช… (์—†์œผ๋ฉด ์ „์ฒด)
  • Binlog_Ignore_DB: Replication ์ œ์™ธ ์ •๋ณด

์œ„ ๋ช…๋ น์–ด์˜ ๊ถŒํ•œ์€ SUPER ํ˜น์€ REPLICATION CLIENT์ด๋‹ค.

ํ•„์ž๋Š” ์œ„์—์„œ ๊ณ„์ • ์„ค์ •์‹œ REPLICATION SLAVE์œผ๋กœ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, root ๊ณ„์ •์œผ๋กœ ๋“ค์–ด๊ฐ€ ํ™•์ธํ–ˆ๋‹ค.


โ—๏ธ Master DB ๋ฐฑ์—…

์šด์˜์ค‘์ธ DB์— Replication์„ ์ ์šฉํ•˜๋ ค๋ฉด Master DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ Slave DB์™€ ๋™๊ธฐํ™”ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ํ™•์ธ.


Slave DB ์„œ๋ฒ„ ์„ค์ •

Master๋ฅผ ๋ชจ๋‘ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค๋ฉด, ์ด์ œ Slave DB ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„๋“ค์„ ์„ค์ •ํ•ด์ค€๋‹ค.

Master DB ์„ค์ •๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.


๊ณ„์ • ์ƒ์„ฑ ๋ฐ ์„ค์ •

์™ธ๋ถ€์—์„œ ํŽธํ•˜๊ฒŒ Slave DB์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•ด์ค€๋‹ค.

ํ•„์ž๋Š” Slave์— ๋ณต์ œ๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ DB ์ ‘๊ทผ์šฉ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด๋‘์—ˆ๋‹ค.


Slave DB ํ™˜๊ฒฝ ์„ค์ •

Slave DB ํ™˜๊ฒฝ ์„ค์ •์„ ํ•ด์ค€๋‹ค.

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

server-id              = 2
  • ์—ฌ๋Ÿฌ ๋Œ€์˜ Slave DB๋ฅผ ์„ค์ •ํ•œ๋‹ค๋ฉด server-id๋ฅผ ๋ชจ๋‘ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ณต์ œํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ DB(์Šคํ‚ค๋งˆ)๋ช…์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
    • replicate-do-db: Replication ๋ฐ›์„ DB(์Šคํ‚ค๋งˆ)๋ช…๋ น. (์ƒ๋žต์‹œ ์ „์ฒด DB๋ฅผ ๋ณต์ œํ•œ๋‹ค)

์—ญ์‹œ ์„ค์ •์„ ์™„๋ฃŒํ•˜๋ฉด MySQL์„ ์žฌ์‹œ์ž‘ํ•ด์ค€๋‹ค.


Master DB ์ •๋ณด ์ž…๋ ฅ

์ด์ œ Slave DB์—์„œ Master DB์˜ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

$ mysql -u root -p

mysql> USE mysql;
mysql> CHANGE MASTER TO MASTER_HOST='{Master DB IP}', MASTER_PORT={MasterDB Port}, MASTER_USER='{Master์— Replication์„ ์œ„ํ•ด ๋งŒ๋“  ๊ณ„์ •}', MASTER_PASSWORD='{๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ}', MASTER_LOG_FILE='{๋กœ๊ทธ ํŒŒ์ผ ๋ช…}', MASTER_LOG_POS={POS ๊ฐ’};

์ด์ „์— Master DB์—์„œ SHOW master STATUS๋ฅผ ํ†ตํ•ด ์–ป์€ ์ •๋ณด์™€ ์ƒ์„ฑํ•œ Master ๊ณ„์ • ์ •๋ณด๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด START SLAVE ๋ช…๋ น์„ ํ•ด์ค€๋‹ค.

  • STOP SLAVE: SLAVE Replication ์ •์ง€ (Master์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์ด์ƒ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.)
  • RESET SLAVE ALL: slave์„ค์ •์„ ์ดˆ๊ธฐํ™”

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด SLAVE์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.


mysql> SHOW slave STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.3.32
                  Master_User: replication_master
                  Master_Port: 8888
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: ip-192-168-3-47-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:

๋ณด๋„ˆ์Šค - ์—ฐ๊ฒฐ ํ™•์ธ ๋ฐ ์ดˆ๊ธฐ ๋™๊ธฐํ™”

์—ฌ๊ธฐ๊นŒ์ง€ ์˜จ๊ฑฐ๋ผ๋ฉด Master DB์™€ Slave DB ์„ค์ •์„ ๋ชจ๋‘ ํ•ด์ฃผ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ ์žฅ์—์„  ๋‘˜์ด ์ œ๋Œ€๋กœ ์„ค์ •๋˜์—ˆ๋‚˜ ํ™•์ธํ•˜๊ณ , Master์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋คํ•‘ํ•ด์„œ Slave์— ๋ณต์ œํ•˜๋Š” ๊ฒƒ์„ ์•Œ์•„๋ณธ๋‹ค.


Master DB์™€ Slave DB ์—ฐ๊ฒฐ ํ™•์ธ

์ œ๋Œ€๋กœ ๋ณต์ œ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด Master์— ์“ฐ๊ธฐ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋ฉด ์ž๋™์œผ๋กœ Slave์—๋„ ๋ณต์ œ๋œ๋‹ค.

๋˜ํ•œ, Master DB์—์„œ SHOW processlist\G๋ฅผ ํ†ตํ•ด ์–ด๋– ํ•œ Slave์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


SLAVE ๋‘ ๊ฐœ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ์˜ ์—ฐ๊ฒฐ ์ƒํ™ฉ


์ดˆ๊ธฐ ๋™๊ธฐํ™”

๋ณดํ†ต Replication์€ ๋นˆ DB์—์„œ๋ณด๋‹ค๋Š” ๋Œ์•„๊ฐ€๋Š” ์ƒํ™ฉ์—์„œ ๋งŽ์ด ์ ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

DB๊ฐ€ ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ํ™˜๊ฒฝ์—์„œ Replication ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๋•Œ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ์žˆ๋‹ค.

๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋™๊ธฐํ™”์‹œ์—๋Š” ์ตœ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‚ด์šฉ์ด ์ผ์น˜ํ•˜๋Š”๊ฒŒ ์ข‹์œผ๋ฏ€๋กœ,

Master์—์„œ ๋”์ด์ƒ DB์˜ ์ž…์ถœ๋ ฅ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ƒํƒœ์—์„œ ์ž‘์—…ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

mysql stop์„ ํ†ตํ•ด ์•„์˜ˆ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜, FLUSH TABLES WITH READ LOCK์„ ํ†ตํ•ด ๋ฝ์„ ๊ฑธ๊ณ  ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.


  1. Dump๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
# Master DB ์„œ๋ฒ„

$ mysqldump -u root -p '{๋น„๋ฐ€๋ฒˆํ˜ธ}' -p {๋คํ”„ ํ•  DB(์Šคํ‚ค๋งˆ)๋ช…} > {๋คํ”„๋ช…}.sql

# SCP๋ฅผ ํ†ตํ•ด Slave ์„œ๋ฒ„๋กœ dump_file.sql์„ ์˜ฎ๊ฒจ์ค€๋‹ค.

# Slave DB ์„œ๋ฒ„
$ mysql -u root -p {DB(์Šคํ‚ค๋งˆ)๋ช…} < {๋คํ”„ ํŒŒ์ผ๋ช…}.sql
  • Master DB๋ฅผ ๋คํ”„๋œฌ ํ›„, Slave์— ์˜ฎ๊ฒจ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์‹œ๊ฐ„์ด ์€๊ทผ ์˜ค๋ž˜ ๊ฑธ๋ ค ์ถ”์ฒœํ•˜์ง€ ์•Š๋Š”๋‹ค.

  1. MySQL ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•
# Master DB ์„œ๋ฒ„
mysql> FLUSH TABLES WITH READ LOCK; 

$ tar -cvf {๋ฐ์ดํ„ฐ ํŒŒ์ผ}.tar .

# SCP ํ˜น์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ SLAVE ์„œ๋ฒ„๋กœ ์ „์†ก

# SLAVE DB ์„œ๋ฒ„
$ tar -xvf {๋ฐ์ดํ„ฐ ํŒŒ์ผ}.tar 

# Master DB ์„œ๋ฒ„์˜ ๋ฝ์„ ํ’€์–ด์ค€๋‹ค.
$ mysql> UNLOCK TABLES;
  • ๊ถŒ์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋ฉฐ, DB ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•œ ๊ณณ (/var/lib/mysql ํ˜น์€ /var/db/...)์„ ํ†ต์งธ๋กœ ์••์ถ•ํ•ด์„œ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•.

์ฐธ๊ณ