DB Master/Slave Replication μ„€μ •

Replication은 μ™œ ν•„μš”ν• κΉŒ?

ν”„λ‘œμ νŠΈλ₯Ό ν•˜λ©΄μ„œ DB에 μ €μž₯도 잘 되고 잘 κ°€μ Έμ˜€λŠ”λ° ꡳ이 DB μ„œλ²„λ₯Ό 증섀할 ν•„μš”κ°€ μžˆμ„κΉŒ.

λ„ˆλ¬΄ λ‹Ήμ—°ν•œ λ§μ΄μ§€λ§Œ, λͺ¨λ“  μ„œλΉ„μŠ€κ°€ νŠΈλž˜ν”½μ΄ λŠ˜μ–΄λ‚¨μ— 따라 DB에 λ§Žμ€ λΆ€ν•˜κ°€ 였게되고 병λͺ© ν˜„μƒλ„ μ‹¬ν•΄μ§ˆ 것이닀.

λ”°λΌμ„œ 볡제 μ„œλ²„μ—μ„œ μ“°κΈ°/읽기만 λΆ„μ‚°ν•΄μ€˜λ„ νŠΈλž˜ν”½μ„ μ™„ν•˜ν•˜λŠ”λ° λ„μ›€μ΄λ˜κ³  κ°€μš©μ„±λ„ 확보할 수 μžˆμ„κ²ƒμ΄λ‹€.

  • κ°€μš©μ„± ν™•λ³΄λŠ” I/O μž‘μ—…μ„ 잘 μˆ˜ν–‰ν•˜κ²Œ ν•΄μ€€λ‹€λŠ” 의미둜 μ μ—ˆλ‹€.

또,Master DB에 μž₯μ• κ°€ λ°œμƒν•΄μ„œ λ‹€μš΄λœλ‹€λ©΄ Slave DBλ₯Ό Master둜 μŠΉκ²©μ‹œμΌœμ„œ λŒ€μ‘ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ MySQL Replication은 비동기 방식이기 λ•Œλ¬Έμ— λ°”λ‘œ Slave둜 볡사가 λ˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ μ™„λ²½ν•˜κ²Œ λ³΅μ‚¬λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€κ³  ν•œλ‹€.

이것말고도 λ‹€λ₯Έ 방법이 λ§Žκ² μ§€λ§Œ, 아직 λΆ€μ‘±ν•˜κΈ°μ— ν•  수 μžˆλŠ” λ²”μœ„μ—μ„œ κ³ λ―Όν•˜κ³ μž ν•œλ‹€.

  • 샀딩, MSA(?), CQRS ..λ“±λ“±

읽기/μ“°κΈ° μž‘μ—…μ„ μ–΄λ–€ DB에 ν• λ‹Ήν• κΉŒ

λŒ€λΆ€λΆ„ DBλŠ” Master/Slave ꡬ쑰둜 운영되며, Slaveλ₯Ό μ—¬λŸ¬κ°œ λ‘λŠ” κ²½μš°κ°€ μžˆλ‹€κ³  ν•œλ‹€.

Replication 방법은 μ—¬λŸ¬κ°€μ§€ μžˆκ³˜μ§€λ§Œ, Master DBμ—μ„œ μ‹€ν–‰λ˜λŠ” Queryλ₯Ό Slaveμ—μ„œ λ™μΌν•˜κ²Œ μˆ˜ν–‰ν•˜μ—¬ 데이터λ₯Ό 동기화할 수 μžˆλ‹€. 즉, Master에 변경사항이 생기면 이λ₯Ό Binary Log에 μ €μž₯ν•˜κ³  λΉ„λ™κΈ°μ μœΌλ‘œ Slaveμ—κ²Œ μ „μ†‘ν•œλ‹€.

SlaveλŠ” 이λ₯Ό λ°›μ•„μ„œ Relay log에 μ €μž₯ν•˜κ³  λ³€κ²½λœ 사항을 μŠ€ν† λ¦¬μ§€ 엔진에 λ°˜μ˜ν•œλ‹€.

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ Commit 을 λˆ„λ₯΄λ©΄ λ¨Όμ € Master μ„œλ²„μ— μ‘΄μž¬ν•˜λŠ” Binary log 에 변경사항을 λͺ¨λ‘ κΈ°λ‘ν•©λ‹ˆλ‹€.

  2. Master Thread λŠ” 비동기적 으둜(λ³΅μ‚¬λ˜λŠ” μ‹œκ°„μ„ κΈ°λ‹€λ €μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.) Binary logλ₯Ό 읽어 Slave μ„œλ²„λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.

  3. Slave 의 I/O Thread λŠ” Master둜 λΆ€ν„° 받은 λ³€κ²½ 데이터듀을 Relay log 에 기둝을 ν•©λ‹ˆλ‹€.

  4. Slave의 SQL Thread λŠ” Replay log의 기둝듀을 읽어 μžμ‹ μ˜ μŠ€ν† λ¦¬μ§€ 엔진에 μ΅œμ’… μ μš©ν•©λ‹ˆλ‹€.

Replication λ™μž‘ 원리 (MySQL κΈ°μ€€)

  1. νŠΈλžœμž­μ…˜μ΄ Commit 되면 즉, Master μ„œλ²„μ—μ„œ νŠΈλžœμž­μ…˜μ΄ Commit 되면 Binary Log에 변경사항을 κΈ°λ‘ν•œλ‹€.

  2. Master ThreadλŠ” λΉ„λ™κΈ°λ‘œ Binary Logλ₯Ό μ½μ–΄μ„œ Slave μ„œλ²„λ‘œ μ „μ†‘ν•œλ‹€.

    비동기 μž₯점은 Binary Log 전솑 μž‘μ—…μ„ μ™„λ£Œν•˜κ³  μ¦‰μ‹œ λ‹€μŒ νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λ―€λ‘œ Master μ„œλ²„ μ„±λŠ₯ ν–₯상에 도움이 λœλ‹€. 또, Slaveκ°€ μ—¬λŸ¬κ°œ μžˆμ„ 경우 Master μŠ€λ ˆλ“œλŠ” 각 Slave μ„œλ²„λ‘œ λ™μ‹œμ— 전솑할 수 μžˆλ‹€.

    ν•˜μ§€λ§Œ 단점도 μ‘΄μž¬ν•œλ‹€.

    Master μ„œλ²„μ™€ Slave μ„œλ²„μ˜ 데이터 적용 μˆœμ„œκ°€ λ‹€λ₯Ό 수 있기 λ•Œλ¬Έμ— λ„€νŠΈμ›Œν¬ λ¬Έμ œμ™€ 같은 μž₯μ•  λ°œμƒ μ‹œ 데이터 일관성 λ¬Έμ œκ°€ 생길 수 μžˆλ‹€. (UDP ν”„λ‘œν† μ½œ(?)κ³Ό λΉ„μŠ·ν•œκ±° κ°™λ‹€.)

  3. Slave μ„œλ²„μ˜ I/O ThreadλŠ” Masterμ—μ„œ 받은 변경사항듀을 Relay Log에 κΈ°λ‘ν•œλ‹€.

  4. Slave ThreadλŠ” μˆ˜μ •λœ Relay Logλ₯Ό ν™•μΈν•˜κ³  μžμ‹ μ˜ μŠ€νŠΈλ‘œμ§€ μ—”μ§„(μ‹€μ œ DB)에 μ μš©ν•œλ‹€.

MySQL Replication이 νŠΈλžœμž­μ…˜ 컀밋 ν›„ μ‹œμž‘λ˜λŠ”μ§€λŠ” μ•Œλ €λ©΄ μ‚¬μš©ν•˜λŠ” Replication 방식과 섀정을 μ•Œμ•„μ•Όν•œλ‹€. μ•„λž˜μ™€ 같은 μ˜ˆμ™Έ 사항이 μžˆλ‹€κ³  ν•˜λŠ”λ° 이후에 μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€.

  1. Semi-Sync Replication : μ„œλ²„κ°€ νŠΈλžœμž­μ…˜μ„ Commit ν•˜κΈ° 전에 Slave μ„œλ²„μ— 일뢀 데이터λ₯Ό μ „μ†‘ν•˜μ—¬ 데이터 손싀 μœ„ν—˜μ„ 쀄이고 μ„±λŠ₯을 ν–₯상 μ‹œν‚¬ 수 μžˆλ‹€.

  2. GTID-Based Replication : νŠΈλžœμž­μ…˜ IDλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΈλžœμž­μ…˜ μˆœμ„œλ₯Ό 보μž₯ν•˜κ³ , Slave μ„œλ²„κ°€ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ 받도둝 ν•œλ‹€.

MySQL μ„€μ •ν•˜κΈ°

MySQL의 μ„€μ • 파일인 my.cnfκ°€ μ‘΄μž¬ν•˜κ³  λ‹€λ₯Έ μœ„μΉ˜(디렉토리)에 μ‘΄μž¬ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ μ„€μ •νŒŒμΌλ§Œ μ μš©ν•˜κ³  λ””λ ‰ν† λ¦¬λ§ˆλ‹€ μš°μ„ μˆœμœ„λ₯Ό κ°–λŠ”λ‹€.

  1. /etc/my.cnf

  2. /etc/mysql/my.cnf

  3. /usr/local/etc/my.cnf

  4. ~/my.cnf

my.cnfλ₯Ό μ•„λž˜μ™€ 같이 μ„€μ •ν•œλ‹€.

μœ„ 섀정을 마친 ν›„ μž¬μ‹œμž‘ν•œλ‹€.

그리고 λ‹€μŒ μˆœμ„œλ₯Ό μ§„ν–‰ν•œλ‹€.

자주 λ°œμƒν•˜λŠ” μ˜ˆμ™Έ

λŒ€ν‘œμ μΈ μ—λŸ¬μ— Last_IO_Errorκ°€ μžˆλŠ”λ‹€. Slave μ„œλ²„μ˜ auto.cnf νŒŒμΌμ— ν˜„μž¬ μ„œλ²„μ˜ UUIDκ°€ μ ν˜€μžˆλŠ”λ°, 이 νŒŒμΌκΉŒμ§€ Master μ„œλ²„μ—μ„œ ν•¨κ»˜ κ°€μ Έμ™€μ„œ λ°œμƒν•˜λŠ” μ—λŸ¬λΌκ³  ν•œλ‹€.

λ‹€μ‹œ Slave둜 λ„˜μ–΄μ™€μ„œ μ μš©ν•œλ‹€.

Last updated