Search
Duplicate
πŸ«“

DB 닀쀑화와 Replication(MySQL편)

생성일
2023/05/08
νƒœκ·Έ
MySQL
infra
Structure
λͺ©μ°¨

λ°°κ²½

μ΅œκ·Όμ— ν•™μŠ΅ 쀑인 β€˜κ°€μƒ λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 κΈ°μ΄ˆβ€™ λ„μ„œμ—μ„œλŠ” 맀 챕터, 맀 κ³„μΈ΅λ§ˆλ‹€ β€˜λ‹€μ€‘ν™”β€™λ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€. μ΄λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ κ΅¬μ‘°μ—μ„œ μž₯애에 κ°€μž₯ μ·¨μ•½ν•œ SPOF(Single Point of Failure)λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•¨μΈλ°μš”, ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ μž₯μ• κ°€ λ°œμƒν•  경우 λͺ¨λ“  μ„œλΉ„μŠ€μ— μž₯μ• κ°€ λ°œμƒν•˜λŠ” 것을 막기 μœ„ν•¨μž…λ‹ˆλ‹€. λ˜ν•œ ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ λͺ¨λ“  μš”μ²­μ„ μ²˜λ¦¬ν•˜κ²Œ λ˜λ―€λ‘œ νŠΈλž˜ν”½μ΄ λͺ°λ¦΄ 경우 병λͺ© ν˜„μƒμ΄ 생겨 μ„±λŠ₯을 μ œλŒ€λ‘œ λ°œνœ˜ν•  수 μ—†λ‹€λŠ” λ¬Έμ œμ λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ DB κ³„μΈ΅μ˜ λ‹€μ€‘ν™”λŠ” 항상 μ–ΈκΈ‰λ˜λŠ” λΆ€λΆ„μ΄μ—ˆκ³ , 저희 λͺ¨λ½ μ„œλΉ„μŠ€μ—μ„œλ„ 미처 λŒ€μ‘ν•˜μ§€ λͺ»ν•œ μ§€μ μ΄μ—ˆκΈ°λ•Œλ¬Έμ— λ°μ΄ν„°λ² μ΄μŠ€ 닀쀑화λ₯Ό ν•™μŠ΅ν•΄λ³΄κ³  κ·Έ μ€‘μ—μ„œλ„ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ— λŒ€ν•΄ μ μš©ν•΄ 보기둜 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

DB 닀쀑화

MySQL μ—μ„œ μ„œλ²„λ₯Ό λ‹€μ€‘ν™”ν•˜λŠ” 방법은 크게 Clustering κ³Ό Replication 이 μžˆμŠ΅λ‹ˆλ‹€.

Clustering

MySQL μ—μ„œ μ§€μ›ν•˜λŠ” ν΄λŸ¬μŠ€ν„°λ§μ€ Shared-Nothing Architecture ꡬ쑰λ₯Ό 가지며 각각의 μ„œλ²„κ°€ λͺ¨λ‘ λ…λ¦½μ μœΌλ‘œ 운영되고 μˆ˜ν‰μ μΈ 계측을 κ°€μ§‘λ‹ˆλ‹€.
이에 따라 ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ μž₯μ•  μ‹œμ— λŒ€μ‘μ΄ 쉽고 병λͺ© ν˜„μƒμ΄ λ°œμƒν•  μš°λ €κ°€ μ λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ…λ¦½μ μœΌλ‘œ κ΅¬μ„±λœ μ—¬λŸ¬ μ„œλ²„μ—μ„œ 데이터가 변경될 μ‹œ λͺ¨λ“  μ„œλ²„μ—μ„œ 데이터가 동기화가 λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 이둜 인해 μ—¬λŸ¬ λ…Έλ“œλ“€ κ°„μ˜ 데이터λ₯Ό λ™κΈ°ν™”ν•˜λŠ” μ‹œκ°„μ΄ ν•„μš”ν•˜μ—¬ μ“°κΈ° μ„±λŠ₯이 비ꡐ적 쒋지 μ•Šκ³  μž₯μ• κ°€ μ „νŒŒλœ 경우 μ²˜λ¦¬κ°€ κΉŒλ‹€λ‘œμšΈ 수 μžˆλ‹€λŠ” ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€.

Replication

λ³΅μ œλŠ” ν•œ μ„œλ²„μ˜ 데이터λ₯Ό λ³΅μ œν•˜μ—¬ λ‹€λ₯Έ μ„œλ²„λ‘œ λ™κΈ°ν™”ν•˜λŠ” 것을 μ˜λ―Έν•˜λŠ”λ°μš”, ν΄λŸ¬μŠ€ν„°λ§κ³Ό λ‹€λ₯Έ 점은 수직적인 계측을 κ°€μ§‘λ‹ˆλ‹€.
원본 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ” μ„œλ²„λ₯ΌΒ source μ„œλ²„, 볡제된 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ” μ„œλ²„λ₯ΌΒ replica μ„œλ²„λΌκ³  ν•©λ‹ˆλ‹€. 이에 따라 λ³΅μ œλ˜λŠ” λ°©ν–₯도 source μ„œλ²„μ—μ„œ replica μ„œλ²„λ‘œ 단방ν–₯으둜 흐λ₯΄κ²Œ λ˜μ–΄ 동기화가 ν΄λŸ¬μŠ€ν„°λ§λ³΄λ‹€ λΉ λ₯΄κ³ , μ •ν•©μ„± 관리도 μƒλŒ€μ μœΌλ‘œ νŽΈν•˜λ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
κ³Όκ±°μ—λŠ” Master-Slave 둜 λΆˆλ Έμ§€λ§Œ μ‚¬νšŒμ  톡념상 slave λΌλŠ” 단어 μ‚¬μš©μ„ μ–΅μ œν•˜κΈ° μœ„ν•΄ Source-Replica λ˜λŠ” Primary-Secondary λ₯Ό μ‚¬μš©ν•˜λŠ” μΆ”μ„Έμž…λ‹ˆλ‹€. 이에 따라 ν•΄λ‹Ή 포슀트 및 λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ—μ„œλŠ” Source-Replica λΌλŠ” 단어λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

Replication λͺ©μ 

β€’
κ°€μš©μ„±(availability)
β—¦
replica μ„œλ²„ 쀑 ν•˜λ‚˜μ— μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ 가동쀑인 replica μ„œλ²„μ—μ„œ 데이터λ₯Ό 가져와 λŒ€μ‘μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ 계속 μ„œλΉ„μŠ€λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β—¦
λ§Œμ•½ source μ„œλ²„κ°€ λ‹€μš΄λ˜μ—ˆμ„ λ•Œμ—λŠ” replica μ„œλ²„ 쀑 ν•˜λ‚˜κ°€ μƒˆλ‘œμš΄ source μ„œλ²„κ°€ λ˜μ–΄ μ“°κΈ° 연산을 μ²˜λ¦¬ν•©λ‹ˆλ‹€. 이 λ•Œ 승격된 μ„œλ²„μ— λ³΄κ΄€λœ 데이터가 μ΅œμ‹  μƒνƒœκ°€ 아닐 μ‹œλ₯Ό λŒ€λΉ„ν•˜μ—¬ 사전에 볡ꡬ 슀크립트λ₯Ό μ§€μ†μ μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜κ³ , μž₯μ•  λ°œμƒ μ‹œ 슀크립트λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ΅œλŒ€ν•œ 데이터 손싀이 μ—†κ²Œλ” λŒ€λΉ„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β€’
μ•ˆμ •μ„±(reliability)
β—¦
λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„ κ°€μš΄λ° 일뢀가 νŒŒκ΄΄λ˜μ–΄λ„ λ‹€λ₯Έ μ„œλ²„μ— λ™κΈ°ν™”λœ 데이터가 λ³΄μ‘΄λ˜μ–΄ μžˆμœΌλ―€λ‘œ 데이터λ₯Ό 보쑴할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ 개발자의 μ‹€μˆ˜λ‘œ source μ„œλ²„μ˜ λͺ¨λ“  데이터λ₯Ό μ‚­μ œν•˜λŠ” 연산이 λ°œμƒν•  경우, λͺ¨λ“  μ„œλ²„μ—μ„œ μ‚­μ œ μƒνƒœλ‘œ 동기화가 진행될 수 μžˆκΈ°λ•Œλ¬Έμ— 독립적인 μ„œλ²„μ— 데이터λ₯Ό 주기적으둜 λ°±μ—…ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β€’
더 λ‚˜μ€ μ„±λŠ₯
β—¦
μ“°κΈ° 연산은 source μ„œλ²„λ‘œλ§Œ μ „λ‹¬λ˜κ³ , 읽기 연산은 replica μ„œλ²„λ“€λ‘œ λΆ„μ‚°λ˜κΈ°λ•Œλ¬Έμ—, λ³‘λ ¬λ‘œ 처리될 수 μžˆλŠ” 쿼리의 μˆ˜κ°€ λŠ˜μ–΄λ‚©λ‹ˆλ‹€. 그리고 비ꡐ적 였래 κ±Έλ¦¬λŠ” μ“°κΈ° μ—°μ‚°μœΌλ‘œ 인해 νŠΈλž˜ν”½μ΄ 집쀑될 λ•Œ λ°œμƒν•  수 μžˆλŠ” 병λͺ© ν˜„μƒμ„ μ™„ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ μ„œλΉ„μŠ€ νŠΉμ„±μƒ μ“°κΈ° 연산이 자주 λ°œμƒν•˜λŠ” 상황이라면 동기화 μž‘μ—…μœΌλ‘œ 인해 였히렀 μ„±λŠ₯이 μ €ν•˜λ  수 μžˆμœΌλ―€λ‘œ μ„œλΉ„μŠ€ νŠΉμ„±μ— λ§žμΆ”μ–΄ 섀계λ₯Ό ν•΄μ•Όν•©λ‹ˆλ‹€.

MySQL μ—μ„œ 두 λ°©μ‹μ˜ 차이

InnoDB μŠ€ν† λ¦¬μ§€λŠ” λ‹€μ€‘ν™”μ˜ κΈ°λ³Έκ°’μœΌλ‘œ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ§€μ›ν•˜κ³  있고, μ•žμ„œ μ–ΈκΈ‰ν•œ ν΄λŸ¬μŠ€ν„°λ§ ꡬ쑰λ₯Ό μ μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” InnoDB λŒ€μ‹  NDB Cluster μŠ€ν† λ¦¬μ§€ 엔진을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. NDB Cluster μŠ€ν† λ¦¬μ§€ 엔진도 λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ§€μ›ν•˜μ§€λ§Œ νŠΈλžœμž­μ…˜ 격리 μˆ˜μ€€ λ“± 기본적인 μŠ€ν† λ¦¬μ§€ μ—”μ§„μœΌλ‘œμ¨μ˜ 차이가 μ‘΄μž¬ν•©λ‹ˆλ‹€(ndb cluster vs innodb engines). 볡제 방식 λ˜ν•œ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ“°κΈ° 연산이 λλ‚˜κ³  데이터λ₯Ό λ³΅μ œν•˜λŠ” μ‹œμ μ—μ„œ 비동기 λ°©μ‹μœΌλ‘œ 메인 μ“°λ ˆλ“œμ˜ 응닡 지연속도λ₯Ό 쀄일 수 μžˆμ§€λ§Œ ν΄λŸ¬μŠ€ν„°λ§ 방식은 λͺ¨λ“  데이터 μ„œλ²„μ— 동기화λ₯Ό μ§„ν–‰ν•œ λ’€ λΉ„λ‘œμ†Œ 연산이 λλ‚˜κΈ°λ•Œλ¬Έμ— 응닡 μ§€μ—°μ†λ„μ—μ„œλ„ 차이가 μžˆμŠ΅λ‹ˆλ‹€. 이에 따라 λΉ λ₯Έ 응닡 속도와 MySQL 8 κΈ°λ³Έ μŠ€ν† λ¦¬μ§€ 엔진인 InnoDB λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” Replication 을 μ‚¬μš©ν•˜κΈ°λ‘œ κ²°μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ™μž‘ 원리

Replication 을 ν•™μŠ΅ν•˜λ©΄μ„œ μ–΄λ–»κ²Œ 볡제λ₯Ό ν•˜λŠ”μ§€κ°€ κ°€μž₯ κΆκΈˆν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄, source μ„œλ²„μ™€ replica μ„œλ²„κ°€ 컀λ„₯μ…˜μ„ 맺은 μƒνƒœμ—μ„œ 이벀트 λ°©μ‹μ²˜λŸΌ λ™μž‘ν•˜μ—¬ νŠΉμ • μ‹œμ  μ΄ν›„μ˜ 데이터 변경점을 λ°”μ΄λ„ˆλ¦¬ 둜그둜 읽어와 변경점을 μ μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 각 μŠ€ν…μ„ 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
1.
source μ„œλ²„μ—μ„œ insert, update, delete 와 같은 λͺ¨λ“  μ“°κΈ° 연산을 λ°”μ΄λ„ˆλ¦¬ 둜그둜 κΈ°λ‘ν•©λ‹ˆλ‹€. μ΄λŠ” λ”°λ‘œ 섀정을 해주지 μ•Šμ•„λ„ 기본적으둜 MySQL μ—μ„œ μ§€μ›ν•©λ‹ˆλ‹€.
2.
replica μ„œλ²„λ₯Ό source μ„œλ²„μ— 볡제 λͺ©μ μœΌλ‘œ 연결을 λ§ΊμŠ΅λ‹ˆλ‹€. 이 λ•Œ, λ³΄μ•ˆμ„ μœ„ν•΄ source μ„œλ²„μ—μ„œλŠ” 볡제용 user λ₯Ό λ§Œλ“€μ–΄ ν•΄λ‹Ή user name κ³Ό λΉ„λ°€λ²ˆν˜Έλ‘œ 연결이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 연결은 TCP/IP 기반의 MySQL 볡제 ν”„λ‘œν† μ½œμ„ μ΄μš©ν•˜μ—¬ 연결을 λ§ΊμŠ΅λ‹ˆλ‹€.
3.
연결이 λ§Ίμ–΄μ‘Œλ‹€λ©΄ source μ„œλ²„μ™€ replica μ„œλ²„μ˜ μŠ€ν‚€λ§ˆ 및 데이터 동기화가 ν•„μš”ν•©λ‹ˆλ‹€. λ‚˜μ€‘μ— μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μ§€λ§Œ, μ“°κΈ° μ—°μ‚°μ˜ νŠΉμ • μ‹œμ μ„ pos(Position) κ°’μœΌλ‘œ ν™•μΈν•˜λŠ”λ°, μŠ€ν‚€λ§ˆκ°€ λ§žμ§€ μ•Šλ‹€λ©΄ pos 값이 μΌμΉ˜ν•΄λ„ λ³΅μ œκ°€ λ˜μ§€ μ•Šκ³  μ—λŸ¬λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 보톡 mysqldump 와 같은 νˆ΄μ„ μ‚¬μš©ν•˜κ±°λ‚˜ 데이터 νŒŒμΌμ„ λ°”λ‘œ μΉ΄ν”Όν•˜λŠ” λ°©λ²•μœΌλ‘œ 데이터 동기화λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
4.
연결을 맺은 ν›„ source μ„œλ²„μ— μ“°κΈ° 연산이 컀밋이 되면 pos 값이 λ³€ν•˜κ³  λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έκ°€ λ³€κ²½λ©λ‹ˆλ‹€.
5.
λ°”μ΄λ„ˆλ¦¬ 둜그 ν¬μ§€μ…˜μ΄ 기둝되면 볡제 ν”„λ‘œμ„ΈμŠ€κ°€ μ‹œμž‘λ˜λŠ”λ°μš”, 비동기 λ°©μ‹μœΌλ‘œ μƒˆλ‘œμš΄ μ“°λ ˆλ“œμ—μ„œ 이전 pos κ°’κ³Ό 비ꡐ해 λ³€κ²½ μ΄λ²€νŠΈμ— λŒ€ν•œ 둜그λ₯Ό μ½μŠ΅λ‹ˆλ‹€. 이벀트λ₯Ό 읽을 λ•Œ λ°”μ΄λ„ˆλ¦¬ 둜그 νŒŒμΌμ— μž κΈˆμ„ κ±Έκ³ , 읽기 μž‘μ—…μ΄ λλ‚˜λ©΄ μž κΈˆμ„ ν•΄μ œν•˜λŠ” λ‘œμ§μž…λ‹ˆλ‹€.
6.
replica μ„œλ²„μ˜ I/O μ“°λ ˆλ“œμ—μ„œ 변경점에 λŒ€ν•œ 둜그λ₯Ό μˆ˜μ‹ ν•˜κ³  이λ₯Ό 릴레이 둜그 νŒŒμΌμ— μ €μž₯ν•©λ‹ˆλ‹€.
7.
μ €μž₯이 μ™„λ£Œλ˜λ©΄ replica μ„œλ²„μ˜ μƒˆλ‘œμš΄ μ“°λ ˆλ“œμ—μ„œ 릴레이 λ‘œκ·Έμ— μ €μž₯λ˜μ–΄ μžˆλŠ” 변경점을 μ μš©ν•©λ‹ˆλ‹€. 이 λ•Œ 데이터 정합성을 μœ„ν•΄, source μ„œλ²„μ—μ„œ λ°œμƒν•œ 쿼리 μˆœμ„œμ™€ 같은 μˆœμ„œλ‘œ replica μ„œλ²„μ—λ„ 적용이 λ©λ‹ˆλ‹€.
λ™μž‘ μ›λ¦¬λŠ” λ‹€μ†Œ λ³΅μž‘ν•˜μ§€λ§Œ, DB μ°¨μ›μ—μ„œ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ κ΄€λ ¨ λŒ€λΆ€λΆ„μ˜ μž‘μ—…λ“€μ„ μ§€μ›ν•˜κ³  μžˆκΈ°λ•Œλ¬Έμ— 호슀트 μ„œλ²„, user λ“±λ§Œ μ»€μŠ€ν…€ν•˜λ©΄ κ°„λ‹¨ν•˜κ²Œ 적용이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ‹€λ§Œ 섀계 κ΄€μ μ—μ„œ source 와 replica μ„œλ²„λ₯Ό μ–΄λ–»κ²Œ ꡬ성할 것인지에 λŒ€ν•΄ κ³ λ―Όν•΄ λ³΄μ•˜κ³ , μ„œλΉ„μŠ€ νŠΉμ„±μƒ μ“°κΈ° 연산이 λͺ°λ¦¬μ§€ μ•ŠλŠ” 점과 μΆ”ν›„ ν™•μž₯을 κ³ λ €ν•˜μ—¬ ν•œ λŒ€μ˜ source μ„œλ²„μ™€ 두 λŒ€μ˜ replica μ„œλ²„λ‘œ κ΅¬μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ„€μ •

ν…ŒμŠ€νŠΈ ν™˜κ²½

λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ 적용 ν…ŒμŠ€νŠΈλŠ” 도컀λ₯Ό μ΄μš©ν•˜μ—¬ 포트둜 μ„œλ²„λ₯Ό λ‚˜λˆ„μ—ˆμŠ΅λ‹ˆλ‹€. μ„œλ²„ μž₯μ• λ₯Ό κ³ λ €ν•˜μ—¬ μ„Έ λŒ€μ˜ μ„œλ²„κ°€ λͺ¨λ‘ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ— μžˆλŠ”κ²Œ κ°€μž₯ μ΄μƒμ μ΄μ§€λ§Œ, ν…ŒμŠ€νŠΈμΈ 점과 κ°€μš© μžμ›μ„ κ³ λ €ν•˜μ—¬ λ„μ»€λ‘œ μ§„ν–‰ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
β€’
곡톡
β—¦
MySQL 8
β—¦
ν˜ΈμŠ€νŠΈλŠ” private IP 인 192.168.45.23
β—¦
λ™μΌν•œ μ„œλΈŒλ„· λ„€νŠΈμ›Œν¬ λŒ€μ—­
β—¦
OSλŠ” Oracle Linux Server 8.6 (μ €μž₯된 λͺ…λ Ήμ–΄κ°€ 거의 μ—†μŠ΅λ‹ˆλ‹€.)
β€’
source μ„œλ²„
β—¦
μ™ΈλΆ€ ν¬νŠΈλŠ” 13306, λ‚΄λΆ€ ν¬νŠΈλŠ” 3306
β€’
replica μ„œλ²„
β—¦
두 λŒ€μ˜ μ„œλ²„κ°€ 각각 μ™ΈλΆ€ 포트 13307, 13308

Source μ„œλ²„ μ„€μ •

CREATE DATABASE morak;
SQL
볡사
λ¨Όμ € μ‚¬μš©ν•  DB λ₯Ό λ§Œλ“€κ³ , replica μ—μ„œ λ³΅μ œν•  λ•Œ ν•„μš”ν•œ μ‚¬μš©μžλ₯Ό λ§Œλ“€κ² μŠ΅λ‹ˆλ‹€.
CREATE USER 'morak-replication'@'%' IDENTIFIED WITH mysql_native_password BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'morak-replication'@'%';
SQL
볡사
볡제용 μ‚¬μš©μžλ₯Ό λ§Œλ“€κ³ , replica μ—μ„œμ˜ 볡제 κΆŒν•œμ„ λΆ€μ—¬ν–ˆμŠ΅λ‹ˆλ‹€.
일반적으둜 μ‚¬μš©ν•˜λ˜ μ‚¬μš©μž 생성 λͺ…λ Ήμ–΄μ™€λŠ” λ‹€λ₯΄κ²Œ WITH mysql_native_password κ°€ μΆ”κ°€λ˜μ—ˆλŠ”λ°μš”, μ„œλ²„ 톡신간 λ³΄μ•ˆ 연결을 μœ„ν•΄ MySQL 5.8 λΆ€ν„° ν•΄λ‹Ή ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λŠ” 인증 λ°©μ‹μœΌλ‘œ λ³€κ²½λ˜μ—ˆλ‹€κ³  ν•©λ‹ˆλ‹€. 섀정을 해주지 μ•ŠμœΌλ©΄ Last_IO_Error: error connecting to master 'morak-replication@192.168.45.23:13306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.
μ‚¬νšŒμ  톡념상 Master-Slave λΌλŠ” 단어 μ‚¬μš©μ„ μ–΅μ œν•˜κ³ , MySQL μ—μ„œλ„ λ³€ν™”λ₯Ό μœ„ν•΄ slave λΌλŠ” λͺ…λ Ήμ–΄κ°€ deprecated 된 것도 μžˆλŠ”λ°μš”, 아직 κΆŒν•œ λΆ€μ—¬ νŒŒνŠΈμ—μ„œλŠ” ν•΄λ‹Ή 뢀뢄을 λ³€κ²½ν•˜μ§€ λͺ»ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€.
이제 /etc/my.cnf μ„€μ • νŒŒμΌμ— λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ κ΄€λ ¨ 섀정을 μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€.
도컀 라이브러리의 MySQL 8 이미지λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 os λŠ” β€œOracle Linux Server 8.6” 이고, ν•΄λ‹Ή os λŠ” vim λͺ…λ Ήμ–΄κ°€ μ—†μŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ„€μ • νŒŒμΌμ„ μˆ˜μ •ν•˜λ €κ³  ν•  λ•Œ bash: vi: command not found μ—λŸ¬κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이에 따라 microdnf install vim 으둜 λͺ…λ Ήμ–΄λ₯Ό λ‹€μš΄λ‘œλ“œν•œ ν›„ vim λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
[mysqld] server-id = 1 log-bin = morak-bin binlog_format = ROW sync_binlog = 1 binlog_expire_logs_seconds = 259200 binlog_do_db = morak
Plain Text
볡사
β€’
server-id
β—¦
같은 ν† ν΄λ‘œμ§€(λ„€νŠΈμ›Œν¬ 망)λ‚΄μ—μ„œ μœ μΌν•œ 값이어야 ν•©λ‹ˆλ‹€.
β€’
log-bin
β—¦
λ°”μ΄λ„ˆλ¦¬ 둜그 파일λͺ…을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. λ§Œμ•½ μ§€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 호슀트 μž₯λΉ„λͺ…-bin ν˜•νƒœλ‘œ μ €μž₯λ©λ‹ˆλ‹€.
β€’
binlog_format
β—¦
λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έμ— μ €μž₯λ˜λŠ” 포맷을 지정할 수 있고 STATEMENT, ROW, MIXED λ“± μ„Έ 개의 값을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
β—¦
STATEMENT λŠ” 쓰여진 SQL 문을 μ €μž₯ν•˜λŠ” 방식이고, 둜그의 크기가 μƒλŒ€μ μœΌλ‘œ μž‘λ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.
β—¦
ROW λŠ” λ³€κ²½λ˜λŠ” row 데이터λ₯Ό μ €μž₯ν•˜λŠ” 방식이고 데이터 정합성에 μžˆμ–΄μ„œ μœ λ¦¬ν•©λ‹ˆλ‹€. InnoDB 의 κΈ°λ³Έκ°’μž…λ‹ˆλ‹€.
β—¦
Mixed λŠ” STATEMENT 와 ROW 의 μž₯점을 합쳐 데이터 정합성이 μš”κ΅¬λ˜λŠ” λ°μ΄ν„°μ—λŠ” ROW 방식을, μ΄μ™Έμ—λŠ” STATEMENT λ°©μ‹μœΌλ‘œ μ €μž₯ν•©λ‹ˆλ‹€. μž₯점이 λ§Žμ§€λ§Œ, STATEMENT 방식과 ROW 방식이 ν˜Όμž¬λ˜μ–΄ μžˆμ–΄ ν˜Έν™˜μ„±μ— λ¬Έμ œκ°€ μžˆμ„ 수 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€. (곡식 λ¬Έμ„œ-Mixed Binary Logging Format)
β€’
sync_binlog
β—¦
기본값인 0 λ˜λŠ” 1둜 섀정될 경우, 맀 λ°”μ΄λ„ˆλ¦¬ 둜그 μ»€λ°‹μ‹œμ— λ™κΈ°ν™”ν•©λ‹ˆλ‹€.
β€’
binlog_expire_logs_seconds
β—¦
deprecate 된 expire_logs_days 을 λŒ€μ‹ ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ 둜그 파일 만료 κΈ°ν•œμ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
β€’
binlog_do_db
β—¦
λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ„ 진행할 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
도컀λ₯Ό μž¬μ‹œμž‘ν•œ λ’€, source μ„œλ²„μ˜ bash 둜 mysql 에 μ ‘μ†ν•˜μ—¬ μƒνƒœλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
SHOW MASTER STATUS;
SQL
볡사
λ³€κ²½ 이벀트λ₯Ό μ μš©ν•  λ°”μ΄λ„ˆλ¦¬ 파일인 File κ³Ό λ³€κ²½ 지점인 Position 이 잘 적용된 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 이제 replica μ„œλ²„μ—μ„œ λ‚˜λ¨Έμ§€ 섀정을 해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

Replica μ„œλ²„ μ„€μ •

[mysqld] server-id = 2
Plain Text
볡사
replica μ„œλ²„μ˜ μ„€μ • νŒŒμΌμ—λŠ” 크게 μ μš©ν•  뢀뢄은 μ—†κ³  server-id 만 μœ μΌν•˜κ²Œ λ§Œλ“€μ–΄ μ£Όμ—ˆμŠ΅λ‹ˆλ‹€. 이제 mysql μ„œλ²„μ— μ ‘μ†ν•˜μ—¬ source μ„œλ²„μ™€μ˜ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ μ—°κ²° 섀정을 μ§„ν–‰ν•˜κ² μŠ΅λ‹ˆλ‹€.
RESET REPLICA; CHANGE MASTER TO MASTER_HOST='192.168.45.23', MASTER_PORT=13306, MASTER_USER='morak-replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='morak-bin.000003', MASTER_LOG_POS=157;
SQL
볡사
비둝 master 넀이밍은 λ‚¨μ•„μžˆμ§€λ§Œ μ—°κ²° λͺ…λ Ήμ–΄ λΆ€λΆ„μ—μ„œλŠ” slave λŒ€μ‹  replica λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. reset replica 둜 섀정을 μ΄ˆκΈ°ν™”ν•œ λ’€ 연결에 ν•„μš”ν•œ 섀정을 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
β€’
MASTER_HOST, MASTER_PORT
β—¦
source μ„œλ²„μ˜ ip 와 mysql ν¬νŠΈμž…λ‹ˆλ‹€.
β€’
MASTER_USER, MASTER_PASSWORD
β—¦
source μ„œλ²„μ—μ„œ μƒμ„±ν•œ 볡제용 μ‚¬μš©μž μ •λ³΄μž…λ‹ˆλ‹€.
β€’
MASTER_LOG_FILE, MASTER_LOG_POS
β—¦
source μ„œλ²„μ—μ„œ master μƒνƒœλ‘œ ν™•μΈν•œ κ°’μž…λ‹ˆλ‹€.
START REPLICA; SHOW REPLICA STATUS\G;
SQL
볡사
START REPLICA; λͺ…λ Ήμ–΄λ‘œ 연결을 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ‘œ replica μ„œλ²„μ˜ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μƒνƒœλ₯Ό 확인해보면!
μ—λŸ¬μ—†μ΄ 잘 μ—°κ²°λœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
이 λ•Œ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ 연결을 끊고 μ‹Άλ‹€λ©΄, STOP REPLICA; λͺ…λ Ήμ–΄λ‘œ λŠμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œμ„ ν•΄λ³Ό 점

λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ μš©ν•˜μ—¬ μ„œλ²„ μž₯μ• μ‹œ κ°€μš©μ„±μ„ 높이고, 지속적인 λ™κΈ°ν™”λ‘œ 데이터 손싀을 μ΅œλŒ€ν•œ 방지해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. λ˜ν•œ μ“°κΈ° μ„œλ²„μ™€ 읽기 μ„œλ²„λ₯Ό λ‚˜λˆ„μ–΄ μ„±λŠ₯ 츑면도 κ°œμ„ ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν˜„μž¬ μƒνƒœμ—μ„œ κ°œμ„ ν•  점도 λΆ„λͺ…ν•©λ‹ˆλ‹€.

Replication Lag

source μ„œλ²„μ— λ³€κ²½λœ μ‹œμ κ³Ό replica μ„œλ²„μ— 적용된 μ‹œμ  사이에, 볡제 λ ‰μœΌλ‘œ μ•Œλ €μ ΈμžˆλŠ” 데이터 동기화 지연이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ§€μ—°μ˜ μ›μΈμœΌλ‘œλŠ” λ„€νŠΈμ›Œν¬ 지연, μ„œλ²„ λΆ€ν•˜, 볡제 μ‚¬μ΄μ¦ˆμ™€ 같은 μš”μΈμ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 볡제 μ‹œ μˆ˜ν–‰λ˜λŠ” replica μ„œλ²„μ˜ SQL μ“°λ ˆλ“œλŠ” μ‹±κΈ€ μ“°λ ˆλ“œμž…λ‹ˆλ‹€. 이둜 인해 μ“°κΈ° μš”μ²­μ΄ ν•œλ²ˆμ— 많이 λ“€μ–΄μ˜¬ 경우 쑰회 μ²˜λ¦¬κΉŒμ§€ ν•΄μ•Ό ν•˜λŠ” replica μ„œλ²„μ— λΆ€ν•˜κ°€ 올 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλ“€λ‘œ 인해 지연이 심할 경우 λ™κΈ°ν™”λŠ” 비동기 λ°©μ‹μœΌλ‘œ μ²˜λ¦¬λ˜κΈ°λ•Œλ¬Έμ— source μ„œλ²„μ—μ„œλŠ” 응닡이 λ‚˜κ°„ μƒνƒœμ΄κ³ , 아직 λ™κΈ°ν™”λ˜μ§€ μ•Šμ€ 데이터에 λŒ€ν•΄ 쑰회 μš”μ²­μ΄ λ“€μ–΄μ˜¨λ‹€λ©΄ μ •ν•©μ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이에 따라 μ„œλ²„ κ°€μš©λ₯ μ„ ν™•μΈν•˜κ³ , 볡제 μ‚¬μ΄μ¦ˆλ₯Ό μ μ ˆν•˜κ²Œ 선택해야 ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

μ˜ˆμ™Έ 핸듀링

ν…ŒμŠ€νŠΈλ₯Ό ν•˜λ©΄μ„œλ„ μ• λ₯Ό 많이 먹은 뢀뢄인데, μ˜ˆμ™Έμ— λŒ€ν•΄ μΈμ§€ν•˜κΈ°κ°€ λ‹€μ†Œ μ–΄λ €μ› μŠ΅λ‹ˆλ‹€. 보톡 sql λ¬Έμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ—λŸ¬ λ‘œκ·Έκ°€ λ‚˜μ˜€μ§€λ§Œ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜ μ—°κ²° μ‹œ, λ˜λŠ” 볡제 μ‹œμ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ— λŒ€ν•΄ status λͺ…λ Ήλ¬ΈμœΌλ‘œ ν™•μΈν•΄μ•Όλ§Œ μ—λŸ¬λ₯Ό 인지할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이에 따라 μ˜ˆμ™Έκ°€ λ°œμƒν•œ 것을 λͺ¨λ‹ˆν„°λ§ν•  수 μžˆλŠ” μ‘°μΉ˜κ°€ λ°˜λ“œμ‹œ ν•„μš”ν•΄ λ³΄μž…λ‹ˆλ‹€.

μ •ν•©μ„± 문제

μ•„λ¬΄λž˜λ„ κ°€μž₯ 관심을 κ°–κ³  μ§€μΌœλ΄μ•Ό ν•  λ¬Έμ œκ°€ μ•„λ‹κΉŒ μ‹ΆμŠ΅λ‹ˆλ‹€. ν˜„μž¬λŠ” 맀 μ»€λ°‹λ§ˆλ‹€ 데이터λ₯Ό λ™κΈ°ν™”ν•˜μ§€λ§Œ 이 방식은 μ„±λŠ₯상 ν•œκ³„κ°€ μžˆμŠ΅λ‹ˆλ‹€. 이에 따라 컀밋 μŠ€μΌ€μ₯΄μ„ λ³€κ²½ν•œλ‹€λ©΄ μ•žμ„œ μ–ΈκΈ‰ν•œ 볡제 λ ‰ 뿐만 μ•„λ‹ˆλΌ μ„±λŠ₯상 λ¬Έμ œκ°€ 없어도 μ •ν•©μ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ MySQL μ—μ„œλŠ” Semi-Sync Replication 을 Plug-in λ°©μ‹μœΌλ‘œ μ§€μ›ν•˜μ—¬ λΉ„λ™κΈ°μ˜ ν•œκ³„λ₯Ό λ‹€μ†Œ μ™„ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이외에도 μΊμ‹œ μ„œλ²„λ₯Ό μ΄μš©ν•˜μ—¬ μ •ν•©μ„± 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법도 생각해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. NPE λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄, μƒˆλ‘œ μƒμ„±ν•œ 데이터에 λŒ€ν•΄μ„œλŠ” source μ„œλ²„μ—μ„œ 데이터λ₯Ό μΊμ‹œ μ„œλ²„μ— ν‘Έμ‹œν•˜κ³ , ν•΄λ‹Ή 데이터에 λŒ€ν•œ 쑰회 μš”μ²­μ΄ λ°œμƒν•œλ‹€λ©΄ μΊμ‹œ μ„œλ²„λ₯Ό λ¨Όμ € ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ latency 둜 인해 λ°œμƒν•˜λŠ” μ •ν•©μ„± 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμ„ 것 κ°™μŠ΅λ‹ˆλ‹€.
μ§€κΈˆκΉŒμ§€ λ ˆν”Œλ¦¬μΌ€μ΄μ…˜μ— λŒ€ν•œ MySQL μ—μ„œμ˜ μ„€μ •λ“€κ³Ό ν•œκ³„μ μ„ μ‚΄νŽ΄ λ³΄μ•˜κ³ , λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” μ•± μ„œλ²„μ—μ„œμ˜ 섀정을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.