Replication Architecture

MySQL μ„œλ²„μ—μ„œ λ°œμƒν•˜λŠ” λͺ¨λ“  λ³€κ²½ 사항은 λ°”μ΄λ„ˆλ¦¬ 둜그(Binary Log)에 μˆœμ„œλŒ€λ‘œ κΈ°λ‘λœλ‹€.

λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έμ—λŠ” λ°μ΄ν„°μ˜ λ³€κ²½ λ‚΄μ—­λΏλ§Œ μ•„λ‹ˆλΌ DBλ‚˜ ν…Œμ΄λΈ” ꡬ쑰 λ³€κ²½κ³Ό 계정, κΆŒν•œμ˜ λ³€κ²½ μ •λ³΄κΉŒμ§€ λͺ¨λ‘ μ €μž₯λœλ‹€.

λ³΅μ œλŠ” 이 둜그λ₯Ό 기반으둜 κ΅¬ν˜„λλŠ”λ°, μ†ŒμŠ€ μ„œλ²„μ—μ„œ μƒμ„±λœ λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έκ°€ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„λ‘œ μ „μ†‘λ˜κ³  λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œλŠ” ν•΄λ‹Ή λ‚΄μš©μ„ 둜컬 λ””μŠ€ν¬μ— μ €μž₯ν•œ λ’€ μžμ‹ μ΄ κ°€μ§„ DB에 λ°˜μ˜ν•˜μ—¬ μ†ŒμŠ€ μ„œλ²„μ™€ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„ κ°„ 데이터 동기화가 이뀄진닀.

λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œ μ†ŒμŠ€ μ„œλ²„μ˜ λ°”μ΄λ„ˆλ¦¬ 둜그λ₯Ό μ½μ–΄μ„œ 둜컬 λ””μŠ€ν¬μ— μ €μž₯ν•œ νŒŒμΌμ„ 릴레이 둜그(Relay Log)라고 ν•œλ‹€.

MySQL λ³΅μ œλŠ” 3개의 μŠ€λ ˆλ“œμ— μ˜ν•΄ λ™μž‘ν•˜λŠ”λ°, 이 쀑 ν•˜λ‚˜λŠ” μ†ŒμŠ€ μ„œλ²„μ—, λ‚˜λ¨Έμ§€ 두 κ°œλŠ” λ ˆν”Œλ¦¬μΉ΄μ— μ‘΄μž¬ν•œλ‹€.

  1. Binary Log Dump Thread:

λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„λŠ” 데이터 동기화λ₯Ό μœ„ν•΄ μ†ŒμŠ€ μ„œλ²„μ— μ ‘μ†ν•΄μ„œ λ°”μ΄λ„ˆλ¦¬ 둜그 정보λ₯Ό μš”μ²­ν•œλ‹€.

μ†ŒμŠ€ μ„œλ²„μ—μ„œ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„κ°€ 연결될 λ•Œ λ‚΄λΆ€μ μœΌλ‘œ λ°”μ΄λ„ˆλ¦¬ 둜그 덀프 μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•΄μ„œ λ°”μ΄λ„ˆλ¦¬ 둜그의 λ‚΄μš©μ„ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„λ‘œ μ „μ†‘ν•œλ‹€.

λ°”μ΄λ„ˆλ¦¬ 둜그 덀프 μŠ€λ ˆλ“œλŠ” λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ— 보낼 이벀트λ₯Ό 읽을 λ•Œ μΌμ‹œμ μœΌλ‘œ λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έμ— μž κΈˆμ„ μˆ˜ν–‰ν•˜λ©°, 읽고 λ‚œ ν›„ λ°”λ‘œ μž κΈˆμ„ ν•΄μ œν•œλ‹€. (μ†ŒμŠ€ μ„œλ²„μ—μ„œ SHOW PROCESSLIST λͺ…λ ΉμœΌλ‘œ 확인)

  1. Replication I/O Thread:

λ³΅μ œκ°€ μ‹œμž‘(start slave)되면 λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„λŠ” I/O μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜κ³  λ³΅μ œκ°€ λ©ˆμΆ”λ©΄(stop slave) I/O μŠ€λ ˆλ“œλŠ” μ’…λ£Œλœλ‹€. I/O μŠ€λ ˆλ“œλŠ” μ†ŒμŠ€ μ„œλ²„μ˜ λ°”μ΄λ„ˆλ¦¬ 둜그 덀프 μŠ€λ ˆλ“œλ‘œλΆ€ν„° λ°”μ΄λ„ˆλ¦¬ 둜그 이벀트λ₯Ό 가져와 릴레이 둜그(둜컬 μ„œλ²„ 파일)둜 μ €μž₯ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•œλ‹€.

μ†ŒμŠ€ μ„œλ²„μ˜ λ°”μ΄λ„ˆλ¦¬ 둜그λ₯Ό 읽어 파일둜 μ“°λŠ” μ—­ν• λ§Œ ν•˜κΈ° 떄문에 β€œI/O” μŠ€λ ˆλ“œλΌκ³  λͺ…λͺ…λœ 것이닀.

  1. Replication SQL Thread:

SQL μŠ€λ ˆλ“œλŠ” I/O μŠ€λ ˆλ“œμ— μ˜ν•΄ μž‘μ„±λœ Relay Log 파일의 이벀트λ₯Ό 읽고 μ‹€ν–‰ν•œλ‹€.

μ‰½κ²Œ μ–˜κΈ°ν•˜λ©΄, λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œλŠ” 전솑받은 둜그λ₯Ό Relay Log에 κΈ°λ‘ν•˜κ³  SQL μŠ€λ ˆλ“œκ°€ 이λ₯Ό μ½μ–΄μ„œ μ μš©ν•œλ‹€. 이 κ³Όμ •μ—μ„œ 릴레이 λ‘œκ·Έμ— λŒ€ν•œ 잠금이 λ°œμƒν•œλ‹€. (릴레이 λ‘œκ·Έμ— μ €μž₯된 νŠΈλžœμž­μ…˜ μ΄λ²€νŠΈλ“€μ„ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ— 적용)

λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œ Replicaiton I/O μŠ€λ ˆλ“œμ™€ SQL μŠ€λ ˆλ“œλŠ” λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•œλ‹€. κ·ΈλŸ¬λ―€λ‘œ SQL μŠ€λ ˆλ“œμ—μ„œ 이벀트λ₯Ό μ μš©ν•˜λŠ” 게 λŠλ €λ„ I/O μŠ€λ ˆλ“œλŠ” μ •μƒμ μœΌλ‘œ λΉ λ₯΄κ²Œ μ†ŒμŠ€ μ„œλ²„λ‘œλΆ€ν„° 이벀트λ₯Ό μ½μ–΄μ˜¬ 수 μžˆλ‹€.

λ˜ν•œ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œ μ†ŒμŠ€ μ„œλ²„μ˜ λ³€κ²½ 사항듀이 μ μš©λ˜λŠ” 것은 μ†ŒμŠ€ μ„œλ²„μ™€ λ…λ¦½μ μœΌλ‘œ λ™μžκ°›κΈ° λ•Œλ¬Έμ— λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ— λ¬Έμ œκ°€ 생겨도 μ†ŒμŠ€ μ„œλ²„μ—λŠ” 영ν–₯을 λ°›μ§€ μ•ŠλŠ”λ‹€.

ν•˜μ§€λ§Œ μ†ŒμŠ€ μ„œλ²„μ— λ¬Έμ œκ°€ μƒκ²¨μ„œ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ˜ I/O μŠ€λ ˆλ“œκ°€ 정상 λ™μž‘ ν•˜μ§€ μ•ŠμœΌλ©΄, λ³΅μ œλŠ” μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€κ³  μ€‘λ‹¨λœλ‹€. μ΄λŠ” λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ˜ 볡제 κΈ°λŠ₯만 μ€‘λ‹¨λœ 것이기 λ•Œλ¬Έμ— λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ—μ„œ 쿼리λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ•„λ¬΄λŸ° λ¬Έμ œκ°€ μ—†λ‹€. λ‹€λ§Œ 데이터 동기화가 λ˜μ§€ μ•Šμ„ 뿐이닀.

λ³΅μ œκ°€ μ‹œμž‘λ˜λ©΄ λ‹€μŒκ³Ό 같이 총 3κ°€μ§€ μœ ν˜•μ˜ 볡제 κ΄€λ ¨ 데이터λ₯Ό μƒμ„±ν•œλ‹€.

  1. Relay Log:

릴레이 λ‘œκ·ΈλŠ” Replication I/O Thread에 μ˜ν•΄ μž‘μ„±λ˜λŠ” 파일둜, μ†ŒμŠ€ μ„œλ²„μ˜ λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έμ—μ„œ μ½μ–΄μ˜¨ 이벀트(νŠΈλžœμž­μ…˜) 정보가 μ €μž₯λœλ‹€.

λ°”μ΄λ„ˆλ¦¬ λ‘œκ·Έμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν˜„μž¬ μ‘΄μž¬ν•˜λŠ” Relay Log νŒŒμΌλ“€μ˜ λͺ©λ‘μ΄ λ‹΄κΈ΄ Index 파일과 μ‹€μ œ 이벀트 정보가 μ €μž₯돼 μžˆλŠ” 둜그 νŒŒμΌλ“€λ‘œ κ΅¬μ„±λœλ‹€.

  1. Connection Metadata:

Replication I/O Threadμ—μ„œ μ†ŒμŠ€ μ„œλ²„μ— μ—°κ²°ν•  λ•Œ μ‚¬μš©ν•˜λŠ” DB 계정 정보 및 ν˜„μž¬ 읽고 μžˆλŠ” μ†ŒμŠ€ μ„œλ²„μ˜ λ°”μ΄λ„ˆλ¦¬ 파일λͺ…κ³Ό 파일 λ‚΄ μœ„μΉ˜ κ°’ 등이 담겨 있으며 μ΄λŸ¬ν•œ μ •λ³΄λŠ” 기본적으둜 mysql.master_info ν…Œμ΄λΈ”μ— μ €μž₯λœλ‹€.

  1. Applier Metadata:

Relay Log에 μ €μž₯된 μ†ŒμŠ€ μ„œλ²„μ˜ μ΄λ²€νŠΈλ“€μ„ λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ— μ μš©ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μ–΄ν”ŒλΌμ΄μ–΄(Applier)라고 ν•œλ‹€.

μ–΄ν”ŒλΌμ΄μ–΄ λ©”νƒ€λ°μ΄ν„°λŠ” 졜근 적용된 μ΄λ²€νŠΈμ— λŒ€ν•΄ ν•΄λ‹Ή μ΄λ²€νŠΈκ°€ μ €μž₯돼 μžˆλŠ” 릴레이 둜그 파일λͺ…κ³Ό 파일 λ‚΄ μœ„μΉ˜ 정보 등을 λ‹΄κ³  있으며, Replication I/O ThreadλŠ” 이 정보듀을 κ°€μ§€κ³  λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„μ— λ‚˜λ¨Έμ§€ μ΄λ²€νŠΈλ“€μ„ μ μš©ν•œλ‹€. mysql.slave_relay_log_info ν…Œμ΄λΈ”μ— μ €μž₯λœλ‹€.

컀λ„₯μ…˜ 및 μ–΄ν”ŒλΌμ΄μ–΄ λ©”νƒ€λ°μ΄ν„°λŠ” FILE ν˜Ήμ€ TABLE ν˜•νƒœλ‘œ 데이터λ₯Ό 관리할 수 μžˆλ‹€.

MySQL 8.0.2 버전뢀터 λ””ν΄νŠΈκ°€ TABLE둜 λ³€κ²½λ„γ…’γ…†μœΌλ©°, FILE은 제거 될 μ˜ˆμ •μ΄λ‹€.

FILE이 κΈ°λ³Έκ°’ μ΄μ—ˆλ˜ λ•ŒλŠ” Replication I/O Thread와 SQL Threadκ°€ λ™μž‘ν•  λ•Œ 두 파일의 λ‚΄μš©μ΄ λ™κΈ°ν™”λ˜μ§€ μ•ŠλŠ” κ²½μš°κ°€ λΉˆλ²ˆν•˜κ²Œ λ°œμƒν–ˆλ‹€.

  • ex) λ ˆν”Œλ¦¬μΉ΄ μ„œλ²„κ°€ 비정상 μ’…λ£Œλ˜λŠ” 경우 μ‹€μ œ 적용된 λ°”μ΄λ„ˆλ¦¬ 둜그 μœ„μΉ˜μ™€ νŒŒμΌμ— μ €μž₯된 μœ„μΉ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•Šκ±°λ‚˜ 파일 μžμ²΄κ°€ μ†μƒλ˜μ–΄ λ³΅μ œκ°€ μž¬μ‹œμž‘λ˜μ§€ λͺ»ν•˜λŠ” 경우 λ°œμƒ

TABLE둜 μ„€μ •ν•˜λ©΄ 두 정보 λͺ¨λ‘ InnoDB μŠ€ν† λ¦¬μ§€ μ—”μ§„ 기반의 ν…Œμ΄λΈ”λ‘œ κ΄€λ¦¬λ˜κ³ , 특히 Replication SQL Theadκ°€ νŠΈλžœμž­μ…˜μ„ ν—ˆμš©ν•  λ•Œ, slave_relay_log ν…Œμ΄λΈ”μ˜ 데이터도 같은 μ‹œμ μ— μ•„ν† λ―Ή(Atomic)ν•˜κ²Œ μ—…λ°μ΄νŠΈλ˜λ―€λ‘œ μ˜ˆμƒν•˜μ§€ λͺ»ν•˜κ²Œ MySQL이 κ°‘μžκΈ° μ’…λ£Œλ˜μ–΄λ„ λ‹€μ‹œ κ΅¬λ™ν–ˆμ„ λ•Œ λ¬Έμ œμ—†μ΄ λ³΅μ œκ°€ 진행될 수 μžˆλ‹€.

이λ₯Ό ν¬λž˜μ‹œ 세이프 볡제(Crash-Safe Replication)이라고 ν•œλ‹€.

Last updated