- ๋ชฉ์ฐจ
- ๋ค์ด๊ฐ๋ฉฐ
- DB Replication ๊ฐ๋
- MySQL DB Replication ๋์ ์๋ฆฌ
- DB Replication ๊ตฌํ (MySQL)
- ์ฐธ๊ณ
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๋ฅผ ์์ง์ ์ธ ๊ตฌ์กฐ(Master - Slave)๋ก ๊ตฌ์ถํ์ฌ, Master DB์์ ์ฐ๊ธฐ ์์
๋ง์ ์ํํ๊ณ , Slave DB๋ค์์ ์ฝ๊ธฐ ์์
๋ง์ ์ํํ๋ ๋ฐฉ์
- ๋ง์คํฐ (๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์๋ฒ)์ ์ฌ๋ ์ด๋ธ (์กฐํ๋ง ํ ์ ์๋ ์๋ฒ)๋ก ๋๋๋ค.
๐ค DB Replication ์ฌ์ฉ ์ด์
- ๋ฐ์ดํฐ ๋ฐฑ์
- DBMS ์กฐํ ๋ถํ๋ถ์ฐ
- ๋ฐ์ดํฐ ๋ถ์
- ๋ฐ์ดํฐ์ ์ง๋ฆฌ์ ๋ถ์ฐ
๐ค DB Replication ์ฅ๋จ์
- ์ฅ์
- DB ์์ฒญ์ ๋๋ถ๋ถ์ด ์ฝ๊ธฐ ์์ ์ด๊ธฐ ๋๋ฌธ์ Replication์ผ๋ก ์ถฉ๋ถํ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ค.
- ๋น๋๊ธฐ ๋ฐฉ์ (MySQL์ ๊ฒฝ์ฐ)์ผ๋ก ์ด์๋๋ฏ๋ก ์ง์ฐ ์๊ฐ์ด ๊ฑฐ์ ์๋ค.
- ๋จ์
- ์ฌ๋ฌ ๋ ธ๋๋ค ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๊ฐ ์๋ฒฝํ ๋ณด์ฅ๋ ์ ์๊ธฐ์ ์ผ๊ด์ฑ์๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ง ๋ชปํ ์๋ ์๋ค.
- Master ๋ ธ๋์ ์์กด์ฑ์ด ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๋๋ฉด ๋ณต๊ตฌ ๋ฐ ๋์ฒ๊ฐ ํ๋ค๋ค.
์ด๋ฒ์ ์ฐ์ ๋ํ์ ์ธ RDBMS์ค ํ๋์ธ MySQL๋ ์ด๋ป๊ฒ Replication์ ๋ค๋ฃจ๋์ง์ ๋ํด์ ๋ค๋ฃฌ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ์ Replication ๋ฐฉ์์ ๋ํด์ ๋ค๋ฃฌ๋ค.
- ๋ง์คํฐ๊ฐ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ๋ชจ๋ ์ฟผ๋ฆฌ ๋ฌธ์ฅ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ์ ์ฅํ๋ค.
- ์ฌ๋ ์ด๋ธ ์๋ฒ์์ I/O ์ค๋ ๋๋ฅผ ํตํด ๋ณ๊ฒฝ ๋ด์ญ์ ์์ฒญํ๋ฉด ๋ง์คํฐ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ฝ์ด ์ฌ๋ ์ด๋ธ์๊ฒ ๋๊ธด๋ค.
- ์ฌ๋ ์ด๋ธ๋ ๋ฐ์์จ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ๋ฆด๋ ์ด ๋ก๊ทธ์ ๊ธฐ๋กํ๋ค.
- ์ฌ๋ ์ด๋ธ๋ ๋ฆด๋ ์ด ๋ก๊ทธ์ ๊ธฐ๋ก๋ ๋ณ๊ฒฝ ๋ด์ญ์ ์ฌ์คํ(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๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ ๋ฐฉ์.
MySQL์ Replication ๊ธฐ๋ฅ์ ๋ณต์ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง ์กด์ฌํ๋ค.
- Async Replication (๋น๋๊ธฐ ๋ณต์ )
- Semi-sync Replication (์ค๋๊ธฐ ๋ณต์ )
- ๋น๋๊ธฐ ๋ณต์ ๋ฐฉ์์ด๋ฉฐ, ํธ๋์ญ์ ์ด Commit ๋๊ณ ์ฌ๋ ์ด๋ธ ์์ฒด์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
- ๋ง์คํฐ DB๋ Transacntion ์ํ ์ค ์ฌ๋ ์ด๋ธ๋ก ์ธํ ์ถ๊ฐ์ ์ธ ๋์์ ์ํํ์ง ์๋๋ค.
- ๋ณต์ ๊ณผ์ ์ด Transaction๊ณผ ๋ณ๊ฐ๋ก ์งํ๋๋ค.
- ์ด๋ ๋ง์คํฐ๊ฐ ์ฌ๋ ์ด๋ธ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๊ฐ ์ ํ ์๋ค๋ ์๋ฏธ.
- ๋ค๋ง, ๋น๋๊ธฐ์ด๊ธฐ ๋๋ฌธ์ ๋ง์คํฐ์์ Transaction์ด ์๋ฃ๋ DB ๋ณ๊ฒฝ ๋ด์ฉ์ด๋๋ผ๋ ์ฌ๋ ์ด๋ธ์ ๋ฐ๋ก ๋ฐ์๋์ง ์๋๋ค. ์ด๋ก ์ธํด ๋ง์คํฐ์ ๊ฐ์์ค๋ฐ ์ฅ์ ๋ก ์ฌ๋ ์ด๋ธ ๋ฐ์ดํฐ์ ์์ค์ด ๋ฐ์ํ ์๋ ์๋ค.
- ์ฌ๋ ์ด๋ธ์ ์ฅ์ ๋ ๋ง์คํฐ์ Transaction์ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ค.
- ์ฅ์ ๊ฐ ๋ฐ์ํ ์ฌ๋ ์ด๋ธ๋ ๋ณต๊ตฌ ๋ ํ ์ค๋จ๋์๋ ๋ฆด๋ ์ด ๋ก๊ทธ ์์น๋ถํฐ ์ด์ด์ ์งํํ๋ค.
- ๋์ ๊ณผ์
- ๋ง์คํฐ๋ ์ฌ๋ ์ด๋ธ์ ๊ด๊ณ์์ด DB์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ค.
- ๋ง์คํฐ์ Dump Thread์ ์ฌ๋ ์ด๋ธ์ I/O Thread๋ ์ปค๋ฅ์ ์ ๋งบ๊ณ ์๋ค.
- ์ฌ๋ ์ด๋ธ I/O Thread๋ ํน์ ์๊ฐ๋ง๋ค ๋ง์คํฐ์ Dump Thread๋ฅผ ํตํด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์์ฒญํ๊ณ , ์ ๋ฌ๋ฐ์ ์์ ์ ๋ฆด๋ ์ด ๋ก๊ทธ์ ๋ณต์ฌํ๋ค.
- ์ฌ๋ ์ด๋ธ SQL Thread๋ ๋ฆด๋ ์ด ๋ก๊ทธ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ ์ DB๋ฅผ ๋ณ๊ฒฝํ๋ค.
Binary Log vs. Redo Log
- Binary Log: MySQL์ ์ ๋ฐ์ ์ธ ๋์์ ๊ธฐ๋กํ๋ ๋ก๊ทธ.
- Redo Log: MySQL InnoDB์์ ๋ด๋ถ์ ์ผ๋ก Query ์ฌ์คํ, Query Rollback์ ํ์ฉํ๊ธฐ ์ํด Query๋ฅผ ๊ธฐ๋กํ๋ ๋ก๊ทธ.

์ถ์ฒ: https://ssup2.github.io/theory_analysis/MySQL_Replication/
- ์ค๋๊ธฐ ๋ณต์ ๋ฐฉ์์ด๋ฉฐ, ๋ง์คํฐ๊ฐ ์ฌ๋ ์ด๋ธ๋ก๋ถํฐ ๋ฆด๋ ์ด ๊ธฐ๋ก์ด ์๋ฃ๋์๋ค๋ ACK๋ฅผ ๋ฐ๊ณ Transaction์ ์งํํ๋ ๋ฐฉ์์ด๋ค.
- ๋ง์คํฐ DB๋ Transaction ์ํ ์ค ์ฌ๋ ์ด๋ธ๋ก ์ธํ ์ถ๊ฐ์ ์ธ ๋์์ ์ํํ๋ค.
- ์ด๋ ๋น๋๊ธฐ ๋ณต์ ๋ณด๋ค ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ ์์ธ.
- ๋ง์ฝ ๋ง์คํฐ๊ฐ ์ฌ๋ ์ด๋ธ๋ก๋ถํฐ ACK๋ฅผ ๋ฐ์ง ๋ชปํ๋ฉด Transaction์ ์ค๋จ๋๋ค. ๋จ, ๋ง์คํฐ๋ ์ฌ๋ฌ ์ฌ๋ ์ด๋ธ์ค ํ๋์ ์ฌ๋ ์ด๋ธ๋ก๋ถํฐ ACK๋ฅผ ๋ฐ์ผ๋ฉด Transaction์ ์งํํ๋ค.
- ์ฑ๋ฅ์ ์ ํ๋์ง๋ง, ์ฆ, ์ ์ด๋ ํ๋์ Slave์๋ ๋๊ธฐํ๊ฐ ๋์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ๋ค.
- ์ค๋๊ธฐ ๋ณต์ ๋ฐฉ์์ ๋ง์คํฐ๊ฐ ์ฌ๋ ์ด๋ธ์๊ฒ DB ๋ณ๊ฒฝ ๋ด์ฉ์ ์ธ์ ์ ๋ฌํ๋๋์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋๋๋ค.
- AFTER_COMMIT: MySQL 5.5 ์ด์
- Master DB์ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธํ๊ณ Slave์ Binlog๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์.
- Master DB์ ๋จผ์ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋๋ฏ๋ก, ์ด๋ Master์ ์กฐํํ๋ฉด ์กด์ฌํ๋ ๋ฐ์ดํฐ๊ฐ Slave์ ์กฐํํ๋ฉด ์กด์ฌํ์ง ์์ ์ ์๋ค.
- AFTER_SYNC: MySQL 5.7 ์ดํ (lossless replication๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค)
- AFTER_COMMIT์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ replication ๋ฐฉ์.
- ๋จผ์ Slave์ ์ ๋ฐ์ดํธ ๊ด๋ จ Binlog๋ฅผ ๋ณด๋ด๊ณ , Master์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์.
- AFTER_COMMIT: MySQL 5.5 ์ด์

AFTER_COMMIT์ ๋ฌธ์ ์
์ถ์ฒ: http://my-replication-life.blogspot.com/2013/09/loss-less-semi-synchronous-replication.html
์ด์ ์ค์ต์ผ๋ก MySQL์ ์ด์ฉํ์ฌ Replication์ ๊ตฌํํด๋ณด๊ณ ์ ํ๋ค.
์ ์ฒด์ ์ธ ๊ตฌํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ณ ์๋ฒ์ MySQL DB ์ค์น ๋ฐ ๊ธฐ๋ณธ ์ค์ (IP, Port, ๊ณ์ , ๊ถํ ๋ฑ๋ฑ)
- Master ์๋ฒ์ Slave ์๋ฒ Replication ์ฐ๊ฒฐ ์ค์
- WAS (Spring Boot + JPA) DB ์ฐ๊ฒฐ ๋ฐ Slave DB ์ ํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
์ด๋ฒ ๊ธ์์ 1, 2๋ฒ๋ง ๋ค๋ฃจ๊ณ , 3๋ฒ์ ๋ค์ ๊ธ์์ ๋ค๋ฃฌ๋ค.
๊ตฌ์ฑํ๊ณ ์ํ๋ DB๋ฅผ ๊ฐ๊ฐ์ EC2 ํน์ ๊ฐ์ ํ๊ฒฝ์ ์ค์นํ๊ณ , Master ์๋ฒ์ Slave ์๋ฒ์ Replication ์ค์ ์ ํด๋๋ฉด Master์ ๋ณ๊ฒฝ์ฌํญ์ด ์๋์ ์ผ๋ก Slave ์๋ฒ๋ค์ ์ ์ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Spring Boot + JPA์์ ์ฐ๊ธฐ ์์ ์ผ ๋ Master, ์ฝ๊ธฐ ์์ ์ผ ๋ Slave๋ก ์ปค๋ฅ์ ๋งบ๋๋ก ์ค์ ๋ง ํด์ฃผ๋ฉด๋๋ค.
๊ฐ์ฅ ๋จผ์ ํ ์์ ์ ๋น์ฐํ 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์ด๋ค.
- ๋ชจ๋ IP์ ๋ํด์ ํ์ฉํ๋ ค๋ฉด
port: MySQL์ ์ฌ๋ฆด Port (์ธ๋ถ ์ ์ Port)- 8888๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด 8888๋ก ์ค์ ํ๋ฉด ๋๋ค.
๋ ๊ฐ์ง๋ฅผ ์ค์ ํ๋ค๋ฉด, ์ ์ฅํ๊ณ ๋์์ ์๋์ ๊ฐ์ด MySQL์ ์ฌ์คํํด์ฃผ๋ฉด๋๋ค.
$ sudo service mysql restart์ด์ธ์ ์ฌ๋ฌ ์ค์ ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ .
์ด์ DB๊ฐ ์ค์น๋์์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก Replication ์ค์ ์ ํด์ค๋ค.
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_nameserver-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์ ๋๊ธฐํํ๋ ์์ ์ด ํ์ํ๋ค.
์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ํ์ธ.
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์ ์ฐ๊ธฐ ์์ ์ ์งํํ๋ฉด ์๋์ผ๋ก Slave์๋ ๋ณต์ ๋๋ค.
๋ํ, Master DB์์ SHOW processlist\G๋ฅผ ํตํด ์ด๋ ํ Slave์ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ ์ ์๋ค.

SLAVE ๋ ๊ฐ๋ฅผ ์ฐ๊ฒฐํ์ ๋์ ์ฐ๊ฒฐ ์ํฉ
๋ณดํต Replication์ ๋น DB์์๋ณด๋ค๋ ๋์๊ฐ๋ ์ํฉ์์ ๋ง์ด ์ ์ฉ๋ ๊ฒ์ผ๋ก ์์๋๋ค.
DB๊ฐ ์ค์ ๋์๊ฐ๋ ํ๊ฒฝ์์ Replication ์๋ฒ๋ฅผ ์ถ๊ฐํด์ผํ ๋ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง ์๋ค.
๋ฆฌํ๋ฆฌ์ผ์ด์ ๋๊ธฐํ์์๋ ์ต๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด์ฉ์ด ์ผ์นํ๋๊ฒ ์ข์ผ๋ฏ๋ก,
Master์์ ๋์ด์ DB์ ์ ์ถ๋ ฅ์ด ์ผ์ด๋์ง ์๋ ์ํ์์ ์์ ํ๋๊ฒ์ด ์ข๋ค.
mysql stop์ ํตํด ์์ ์ข ๋ฃ์ํค๊ฑฐ๋,FLUSH TABLES WITH READ LOCK์ ํตํด ๋ฝ์ ๊ฑธ๊ณ ์งํํ๋ฉด ๋๋ค.
- 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์ ์ฎ๊ฒจ ๋ณต์ฌํ๋ ๋ฐฉ์์ด๋ค.
- ์๊ฐ์ด ์๊ทผ ์ค๋ ๊ฑธ๋ ค ์ถ์ฒํ์ง ์๋๋ค.
- 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/...)์ ํต์งธ๋ก ์์ถํด์ ๋ณต์ฌํ๊ฑฐ๋, ์๋๋ฉด ๊ทธ๋ฅ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ.



