DevLog ๐ถ
[MySQL] Replication์ ํ์ฉํ์ฌ Master-Slave DB ๋ถ๋ฆฌํ๊ธฐ (1) ๋ณธ๋ฌธ
[MySQL] Replication์ ํ์ฉํ์ฌ Master-Slave DB ๋ถ๋ฆฌํ๊ธฐ (1)
dolmeng2 2024. 5. 15. 18:29๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
ํ์ฌ ๋ค์ด๊ฐ๊ณ ๋ธ๋ก๊ทธ๊ฐ ๋๋ฌด ๋ธํด์ง ๊ฒ ๊ฐ์์, ์ด์ ์ ์ฐ๋ ค๋ค๊ฐ ๋ชป ์ด ๊ธ์ ์์ฑํ๊ณ ์ ํ๋ค ๐ฅน (๋ฌดํ์ ์์ ์ ์ฅ...)
์ฌ๋ด์์ Replication์ ํ์ฉํ๊ณ ์๋ค๋ ๊ฑด ์๊ณ ์๋๋ฐ, ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง๋ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๊ณ ์์๋ ๊ฒ ๊ฐ์์ ๊ฐ๋จํ๊ฒ MySQL์ ํ์ฉํ์ฌ Replication์ด ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง ๊ตฌ์ถํด๋ณด์๋ค.
๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ์ ๋ ๊ณต๋ถํ๋ฉด ์ข๊ฒ ์ง๋ง, ํ์ต ์ฉ๋๋ก ์์ฑํ๋ ๊ธ!
๐ฑ ๋ณต์ ๋ ๋ฌด์์ผ๊น?
๋ณต์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก master ๋ ธ๋์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ slave ๋ ธ๋์๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ ์ฉ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, MySQL์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ๋ณต์ ๋ฐฉ์์ ํ์ฉํ์ฌ ๋ ์ฌ์ด์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ง์ถ๊ณ ์๋ค.
์ฌ๊ธฐ์ ๋งํ๋ ๋น๋๊ธฐ ๋ณต์ ๋ฐฉ์์ด ๋ฌด์์ผ๊น? ๋์ ๋ฐฉ์์ ํ๋ฆ์ผ๋ก๋ง ๊ฐ๋จํ๊ฒ ์ดํดํ๊ณ ๋์ด๊ฐ๋๋ก ํ์.
0. ํด๋ผ์ด์ธํธ๊ฐ ์ปค๋ฐ์ ์งํํ๋ค. (๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ ์์ฒญ)
1. Connection Thread๋ ์คํ ๋ฆฌ์ง ์์ง์๊ฒ ํด๋น ํธ๋์ญ์
์ ๋ํ Prepare๋ฅผ ์งํํ๋ค.
- ํด๋น ๋จ๊ณ๋ Commit ์ ์ค์ ๋ก ์งํํ๋ ๋จ๊ณ๊ฐ ์๋, ‘์ค๋น’๋ฅผ ํ๋ ๋จ๊ณ์ด๋ค. (2PC, 2 Phase Commit)
- ์ด ์์ ์ (InnoDB์ ๊ฒฝ์ฐ) Redo Log๋ฅผ ๊ธฐ๋กํ๊ฒ ๋๋ค.
- ๋ง์ฝ ์ด ๋จ๊ณ์์ ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด, ๋ณต๊ตฌํ ๋ ํด๋น ํธ๋์ญ์
์ ๋กค๋ฐฑ๋๋ค.
2. Commit ์ ์งํํ๊ธฐ ์ , ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํ๋ค.
3. ์คํ ๋ฆฌ์ง ์์ง์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ปค๋ฐ์ ์๋ฃํ๋ค.
- ์ด ์์ ๊น์ง ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด, ํธ๋์ญ์
์ ์ปค๋ฐ์ด ์๋ฃ๋์ด ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ (InnoDB๋ผ๋ฉด) ๋ฆฌ๋ ๋ก๊ทธ๊น์ง ์กด์ฌํ๊ฒ ๋๋ค.
4-5. Master Thread๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ฝ์ด์, Slave๋ก ์ ์กํ๋ค.
6. Slave์ I/O ์ค๋ ๋๋ ์์ ํ ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ ๋ฆด๋ ์ด ๋ก๊ทธ์ ๊ธฐ๋กํ๋ค.
7-8. Slave์ SQL ์ค๋ ๋๋ ๋ฆด๋ ์ด ๋ก๊ทธ์ ๊ธฐ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ์คํ ๋ฆฌ์ง ์์ง์ ๊ธฐ๋กํ๋ค.
๐ฑ ์ค์ต ์ค๋น - ๋ง์คํฐ ์๋ฒ ๊ตฌ์ถํ๊ธฐ
๊ฐ๋จํ๊ฒ ์ค์ต์ ์งํํ๊ธฐ ์ํด, docker๋ฅผ ํ์ฉํ์ฌ mySQL ์๋ฒ๋ฅผ ๋์์ฃผ์๋ค.
๊ฐ์ฅ ๋จผ์ master ์๋ฒ๋ฅผ ๋์์ฃผ๊ฒ ๋ ๊ฑด๋ฐ, mySQL์ ์ค์ ํ์ผ์ ์์ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ my.cnf ๋ผ๋ ํ์ผ์ ์์ฑํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋์.
[mysqld]
log-bin=mysql-bin
server-id=1
binlog-do-db=practice
authentication_policy=mysql_native_password
- [mysqld]: MySQL ์๋ฒ์ ํ๋กํผํฐ๋ฅผ ์ง์ ํ๊ธฐ ์ํ ์์ prefix ๊ฐ
- log-bin : ๋ฐ์ด๋๋ฆฌ ๋ก๊น
์ ํ์ฑํํ๊ณ , ๋ก๊ทธ ํ์ผ์ ์ด๋ฆ์ ์ง์ ํ๋ ๊ฒ. ํ
์ด๋ธ์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ก๊ทธ ํ์ผ๋ก ๊ธฐ๋กํ๊ฒ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก mySQL ์์ replication์ ์งํํ ๋ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ์ ๋ํ ๋ด์ฉ์ ๊ธฐ์ค์ผ๋ก ๋ณต์ ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์ ๋ก๊น
์ ํ์ฑํํ๊ฒ ๋๋ค.
- server-id: MySQL ์๋ฒ์ ๋ํ ๊ณ ์ ์์ด๋ ๊ฐ์ผ๋ก, ์ถํ ๊ตฌ์ถํ slave ์ฉ ์๋ฒ์ ๊ผญ ๋ค๋ฅด๊ฒ ์ค์ ์ ํด์ค์ผ ํ๋ ๊ฐ์ด๋ค. ๋ณต์ ๋ ํ๋ก์ธ์ค๋ค ์ฌ์ด์์ ๊ฐ mySQL ์๋ฒ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ถํ๋๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ด๋ค.
- binlog-do-db: ๋ฐ์ด๋๋ฆฌ ๋ก๊น
์ ํน์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ง ์ฌ์ฉํ ์ ์๋๋ก ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์์๋ ์ถํ ๋ง๋ค ‘practice’ ๋ผ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด์๋ง ๋ก๊น
์ ํ์ฉํ๋๋ก ์ง์ ํด์ฃผ์๋ค.
- authentication_policy : MySQL 8.0๋ถํฐ๋ SHA-256 Hashing์ ๊ตฌํํ๊ธฐ ์ํ์ฌ 2๊ฐ์ง์ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๊ณ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก caching_sha2_password ๋ผ๋ ์บ์ฑ์ ํ์ฉํ ํ๋ฌ๊ทธ์ธ์ ํ์ฉํ๊ณ ์๋ค. ์ด๋ ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ SSL ๋ณด์ ์ฐ๊ฒฐ์ด๋ RSA ๋ณด์์ ์ ์ฉํด์ผ ํ๋๋ฐ, ๊ฝค๋ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ฒ์ ํ๋ฌ๊ทธ์ธ์ธ mysql_native_password์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. (์ด ๋ถ๋ถ์ ๋นผ๋จน์ผ๋ฉด ๋์ค์ ํต์ ์ด ์ ๋๋ค…)
์ด๋ฌํ ํ์ผ์ ์์ฑํด์ฃผ์๋ค๋ฉด, ์ค์ ํ์ผ์ ์ ์ฉํ Dockerfile์ ๋ง๋ค์ด ์ฃผ์.
FROM mysql:8.0
COPY ./my.cnf /etc/my.cnf
mySQL 8.0 ๋ฒ์ ์ ์ฌ์ฉํ์์ผ๋ฉฐ, ์์์ ๋ง๋ค์๋ my.cnf ํ์ผ์ ์ค์ ํ์ผ๋ก ํ์ฉํ๋๋ก ๋ง๋ค๊ธฐ ์ํด COPY๋ฅผ ํตํด ๋ด๋ถ ์ค์ ํ์ผ์ ๋ฎ์ด์์ฐ๋๋ก ๋ง๋ค์ด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ง๋ Dockerfile์ ํ์ฉํ์ฌ ๋์ปค ์ธ์คํด์ค๋ฅผ ๋์ธ ์ ์๋๋ก docker-compose๋ฅผ ์์ฑํด์ฃผ๋๋ก ํ์.
version: '3'
services:
mysql:
build: .
container_name: mysql
environment:
MYSQL_DATABASE: practice
MYSQL_ROOT_PASSWORD: test
ports:
- 3306:3306 # HOST:CONTAINER
volumes:
- ./mysql/data:/var/lib/mysql
networks:
- practice-net
networks:
practice-net:
driver: bridge
- image ๋์ ์ build๋ฅผ ํ์ฉํ์ฌ ํ์ฌ ๋๋ ํฐ๋ฆฌ (.)์ ์๋ Dockerfile์ ํ์ฉํ์ฌ ๋น๋ํ ์ ์๋๊ณ ์ค์ ํด์ฃผ์๋ค.
- ๋ํ, slave์ ๋์ผํ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ปค์คํ
ํ๊ฒ ๋คํธ์ํฌ๋ฅผ ์ ์ํด์ฃผ์๋ค. (์๊ฒ๋ ์ค์ ์ ํด์ฃผ๋ฉด ๋์ค์ ํต์ ์ด ์ ๋๋ค… ๊ผญ ์ค์ ํด๋๋๋ก ํ์.)
- ์ฐธ๊ณ ๋ก, ๋คํธ์ํฌ ์ด๋ฆ์ ํ์ฌ ์์นํ {ํจํค์ง ์ด๋ฆ_์ค์ ํ ์ด๋ฆ} ๊ณผ ๊ฐ์ด ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์, ๋์ ๊ฒฝ์ฐ ๋คํธ์ํฌ ์ด๋ฆ์ด master-practice-net์ผ๋ก ๋ง๋ค์ด์ก๋ค.
๋ค ๋ง๋ค์๋ค๋ฉด, ์ปจํ ์ด๋๋ฅผ ๋์์ฃผ์. -d๋ฅผ ํตํด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋์ธ ์ ์๋๋ก ๋ง๋ค์๋ค.
docker-compose -f docker-compose.yml up -d
์ ์์ ์ผ๋ก ๋์๋์ง ํ์ธํ๊ธฐ ์ํด, ์ปจํ ์ด๋ ๋ด๋ถ๋ก ์ ์ํ์ฌ ์ค์ ํ์ผ์ด ์ ์ ์ฉ๋์๋์ง ํ์ธํด๋ณด์.
docker exec -it {containerID} bash
mySQL ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ํ ์ง๋ง, ๋์ ๊ฒฝ์ฐ /etc ํ์์ ์ค์ ํ์ผ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์กด์ฌํ์์ผ๋ฉฐ, ํ์ผ ๋ด์ฉ์ด ์์ ๊ฐ์ด ์ ๋ณ๊ฒฝ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
์ฐธ๊ณ ๋ก, ๋์ ๊ฒฝ์ฐ ์ด๊ฒ์ ๊ฒ ์ฝ์งํ๋ฉด์ ์๊ฐ์ ๋ง์ด ๋ณด๋์๋๋ฐ ํน์๋ ์ค์ ์ ์๋ชปํ์ฌ my.cnf ํ์ผ์ ์์ ํด์ผ ํ๋ ์ผ์ด ๋ฐ์ํ๋ค๋ฉด, ๊ผญ ๋น๋ ์ no-cache ์ต์ ์ ์ค์ ํด๋๋๋ก ํ์. ์๋๋ฉด ์บ์๋ก ์ธํด์ ์ ์ฉ์ด ๋ฆ๊ฒ ๋์๋๋ฐ ์ ์ ๋์ง? ๋ผ๋ฉฐ ์๊ฐ์ ๋ณด๋ด๋ ์ผ์ด ์๊ธธ ์๋ ์๋ค...
docker-compose build --no-cache
๐ฑ ์ค์ต ์ค๋น - ์ฌ๋ ์ด๋ธ ์๋ฒ ๊ตฌ์ถํ๊ธฐ
- ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๋ ์ด๋ธ ์๋ฒ๋ ๊ตฌ์ถํ๊ณ ์ ํ๋ค. ์ค์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ๋ค.
[mysqld]
log-bin=mysql-bin
server-id=2
relay_log=/var/lib/mysql/mysql-relay-bin
log_replica_updates='ON'
read_only='ON'
authentication_policy=mysql_native_password
- ์์ ๋งํ๋ ๊ฒ์ฒ๋ผ, server-id์ ๊ฐ์ ๊ผญ ๋ง์คํฐ ์๋ฒ์ ๋ค๋ฅด๊ฒ ์ค์ ํด์ค์ผ ํ๋ค.
- relay_log: ๋ฆด๋ ์ด ๋ก๊ทธ์ ์์น๋ฅผ ์ง์ ํ๋ค.
- log_replica_updates: ๋ฆด๋ ์ด ๋ก๊ทธ๋ฅผ ํ์ฉํ์ฌ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์๋ ๊ธฐ๋กํ๋ค.
- read_only: ์ฌ๋ ์ด๋ธ ์๋ฒ๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ค. (๋ง์คํฐ ์๋ฒ์์๋ง ์ฐ๊ธฐ ์ฐ์ฐ์ด ๋ฐ์ํ๋๋ก ๋ง๋ค๊ธฐ ์ํด ์ค์ ํด์ค๋ค.)
- ์ฐธ๊ณ ๋ก, super ๊ถํ์ ๊ฐ์ง ์ฌ์ฉ์์ ๋ํด์๋ ์ ์ฉ๋์ง ์๋๋ค!
๋ค์์ผ๋ก docker-compose ๋ ๋ง๋ค์ด์ฃผ์. ํฌํธ์ ์ปจํ ์ด๋ ์ด๋ฆ์ ๋ค๋ฅด๊ฒ, ๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ ์ ๋ณด๋ ๊ผญ ๋์ผํ๊ฒ ์ค์ ํด์ฃผ์.
version: '3'
services:
mysql:
build: .
container_name: mysql-slave
environment:
MYSQL_DATABASE: practice
MYSQL_ROOT_PASSWORD: test
ports:
- 3307:3306 # HOST:CONTAINER
volumes:
- ./mysql/data:/var/lib/mysql
networks:
- practice-net
networks:
practice-net:
external: true
name: master_practice-net
๊ทธ๋ฆฌ๊ณ , ์ปจํ ์ด๋์ ์ ์ํ ๋ค์ ์ค์ ๋ก read_only ๊ฐ์ ์ต์ ์ด ์ ์ค์ ๋์๋์ง ํ์ธํด๋ณด์.
show global variables like '%read_only%';
๐ฑ ์ฐ๋ํ๊ธฐ
โ๏ธ ๋ง์คํฐ ์๋ฒ์ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ์ํ ๊ณ์ ๋ง๋ค๊ธฐ
Replication ์์๋ Slave Thread๊ฐ Master Thread ์ชฝ์ผ๋ก ์ ์์ ์์ฒญํ๊ธฐ ๋๋ฌธ์, Slave๊ฐ ์ผ์ข ์ ํด๋ผ์ด์ธํธ์ด๊ณ , Master๊ฐ ์๋ฒ๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ด๋ Master์๋ Slave๊ฐ ๋ก๊ทธ์ธ์ ํ๊ธฐ ์ํ ๊ณ์ ๊ณผ ๊ถํ (Replication Slave)๊ฐ ํ์ํ๋ค. ๋ง์คํฐ ์๋ฒ์ ์ ์ํ์ฌ ์๋์ ๊ฐ์ด ๊ณ์ ์ ์์ฑํ๊ณ ๊ถํ์ ๋ถ์ฌํด์ฃผ์.
mysql -u root -p
create user 'test-replication'@'%' identified by 'test';
grant replication slave on *.* to 'test-replication'@'%';
flush privileges;
๊ถํ์ด ์ ์์ ์ผ๋ก ์ ๋ถ์ฌ๋์๋์ง ํ ๋ฒ ํ์ธํ๊ณ ๋์ด๊ฐ์ฃผ์.
use mysql;
select user, host from user;
show grants for 'test-replication'@'%';
์์ ๊ฐ์ด slave ๊ถํ์ด ์ ๋ถ์ฌ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ณธ๊ฒฉ์ ์ธ ์ฐ๋์ ์ํ์ฌ ๋ง์คํฐ ์๋ฒ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊น ์ํ๋ฅผ ํ์ธํด๋ณด์.
show master status;
- File: ํ์ฌ ์ฌ์ฉ ์ค์ธ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ์ ์ด๋ฆ์ด๋ค.
- Position: ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ ๋ด์ ์คํ์
์ด๋ฉฐ, ๋ง์ง๋ง์ผ๋ก ๋ณต์ ๋ฅผ ์๋ฃํ ์ง์ ์ ๋ํด ๋ํ๋ธ๋ค.
- Binlog_Do_DB: ๋ฐ์ด๋๋ฆฌ ๋ก๊น
์ด ํ์ฑํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์์ ๋ง์คํฐ ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ฃผ์์ ๋ practice ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ง์ ํ๋ ๊ฒ์ด ์ฌ๊ธฐ์ ๋ฐ์๋ ๊ฒ์ด๋ค.
- Binlog_Ignore_DB: ๋ฐ์ด๋๋ฆฌ ๋ก๊น
์์ ์ ์ธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
- Executed_Gtid_set: GTID (Global Transaction Identifier), ํด๋น ์๋ฒ์์ ์คํ๋ ๋ชจ๋ ํธ๋ ์ญ์
์ GTID๋ฅผ ์๋ฏธํ๋ค. ์ปค๋ฐ๋ ํธ๋์ญ์
๋ค์ด ๊ฐ์ง๊ฒ ๋๋ ๊ณ ์ ํ ์๋ณ์์ด๋ค. (๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๋ชจ๋ ๋์ผํ๊ฒ ์ฌ์ฉ)
-> ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉด GTID๋ฅผ ํ ๋น๋ฐ์ ๋ง์คํฐ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๊ธฐ๋ก์ด ๋๋ค. ์ด๋, ์ฌ๋ ์ด๋ธ๊ฐ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ์๋ ๋ด์ฉ์ ๋ฆด๋ ์ด ๋ก๊ทธ์ ์ ์ฅํ๋ฉด, GTID ์ ๋ณด๋ฅผ ํ ๋๋ก ํด๋น ํธ๋์ญ์ ์ด ์์ง ๋ฏธ๋ฐ์๋ ์ํ๋ผ๋ฉด ๋ฐ์ํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๋ ์ด๋ธ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์๋ ๊ธฐ๋กํ๊ฒ ๋๋ค.
โ๏ธ ์ฐ๋ํ๊ธฐ - ๋ง์คํฐ ์๋ฒ์ IP ์ฃผ์ ์์๋ด๊ธฐ
์ฌ๊ธฐ๊น์ง ์งํํ๋ค๋ฉด ์ด์ ๋ ์๋ฒ์ ๋ํด ์ฐ๊ฒฐ์ ํด์ค ์ฐจ๋ก์ด๋ค. ๋จผ์ , ๋ง์คํฐ ์๋ฒ์ ์ปจํ ์ด๋ IP ์ฃผ์๋ฅผ ํ์ธํด์ผ ํ๋ค.
์ด๋, ์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ๋ง์คํฐ ์๋ฒ์ ์ ์ํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํ ๊ณผ์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์ฐ๋ฆฌ๋ ๋์ปค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋์ปค ์ปจํ ์ด๋๊ฐ ์ด๋ค ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ๋ฉ์์ง๋ฅผ ์ ๋ ฅํ์.
docker inspect {container_name} | grep Network
๋ง์ฝ ์์ ์บก์ณ ํ๋ฉด์ฒ๋ผ ๋ง์คํฐ ์๋ฒ์ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋คํธ์ํฌ ์ ๋ณด๊ฐ ๋ค๋ฅด๋ค๋ฉด, ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์์ ํด์ค ์ ์๋ค. (๋ฌผ๋ก ์ฌ์์ฑ์ ํด๋ ๊ด์ฐฎ๋ค)
// mysql-slave ์ปจํ
์ด๋์ ๋ํด slave_default ๋คํธ์ํฌ ๋์ด์ฃผ๊ธฐ
docker network disconnect slave_default mysql-slave
// ๋์ master_default ๋คํธ์ํฌ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๊ธฐ
docker network connect master_default mysql-slave
๊ทธ๋ผ ์์ ๊ฐ์ด master ์ปจํ
์ด๋์ ๋์ผํ ๋คํธ์ํฌ ์์ด๋๋ฅผ ํ ๋น๋ฐ์ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์์ ํ์ธํ ๋คํธ์ํฌ ์์ด๋๋ฅผ ๋ฐํ์ผ๋ก, ์ ์ฒด docker ๋คํธ์ํฌ ๋ชฉ๋ก์ ํ์ธํ์ฌ ์ด๋ค ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฒดํฌํ์.
docker network ls
์์ ๋ดค๋ ๋คํธ์ํฌ ์์ด๋๊ฐ 95dc~ ๋ก ์์ํ ๊ฒ์ ๋ณผ ์ ์์ผ๋, ํ์ฌ ์ฐ๊ฒฐ๋ ๋คํธ์ํฌ ์ด๋ฆ์ด ‘master_default’ ์ธ ๊ฒ์ ํ์ธํ ์ ์์๋ค. ํด๋น ๋คํธ์ํฌ์ IP ์ฃผ์๋ฅผ ์์๋ณด๊ธฐ ์ํด ์๋์ ๊ฐ์ด ๋ค์ ์ ๋ ฅํด์ฃผ์.
docker inspect {network_name} | grep IPv4Address
โ๏ธ ์ฐ๋ํ๊ธฐ - ์ฌ๋ ์ด๋ธ ์๋ฒ์์ ์ ์ํ๊ธฐ
์ด์ IP ์ฃผ์๋ ์๊ฒ ๋์์ผ๋, ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์ ์ํ์ฌ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ์.
CHANGE MASTER TO MASTER_HOST='172.29.0.2', MASTER_PORT=3306, MASTER_USER='test-replication', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=880, GET_MASTER_PUBLIC_KEY=1;
- MASTER_HOST / MASTER_PORT: ๋ง์คํฐ ์๋ฒ์ IP ์ฃผ์ / Port๋ก, ์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ๋ง์คํฐ ์๋ฒ์ ์ ์ํ๊ธฐ ์ํด ์์์ผ ํ๋ IP ์ ๋ณด์ ํฌํธ ์ ๋ณด์ด๋ค.
- MASTER_USER / MASTER_PASSWORD: ์ด์ ์ ๋ง์คํฐ ์๋ฒ์์ ์์ฑํ๋ ์ฌ๋ ์ด๋ธ ์๋ฒ์ฉ ๊ณ์ ์ ๋ณด์ด๋ค.
- MASTER_LOG_FILE / MASTER_LOG_POST: ์์ ๋ง์คํฐ ์๋ฒ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ ์ ๋ณด์์ ๋ดค๋ ํ์ผ ์ด๋ฆ๊ณผ ์คํ์
์ ๋ณด์ด๋ค. (์ด๋์๋ถํฐ ์ฝ์ด์ฌ ๊ฒ์ธ์ง ์ ํ๋ ๊ฒ)
- GET_MASTER_PUBLIC_KEY=1 : ์ฌ๋ ์ด๋ธ๊ฐ ๋ง์คํฐ ์๋ฒ์ ์ฐ๊ฒฐํ ๋ ๋ง์คํฐ์ ๊ณต๊ฐํค๋ฅผ ์๋์ผ๋ก ์์ฒญํ๊ฒ ๋๋ค.
์ฐ๋์ ์์ํด์ฃผ๊ธฐ ์ํด start slave๋ฅผ ์ ๋ ฅํด์ฃผ์.
์ฌ๊ตฌ์ฑํ๊ณ ์ถ์ ๋๋ stop replica > reset slave;๋ฅผ ํ์ฉํด์ฃผ๋ฉด ๋๋ค.
start slave;
๋ง์ง๋ง์ผ๋ก ์ฐ๋์ ํ์ธํ๊ธฐ ์ํด ์๋์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด๋ณด์.
show slave status\G
์ฌ๊ธฐ์์ Slave_IO_Running, Slave_SQL_Running์ ๊ฐ์ด ๋ชจ๋ Yes๋ก ํ์๊ฐ ๋์ด์ผ ํ๋ค.
๋ง์ฝ Slave_IO_Running๊ฐ Connecting์ผ๋ก ๋ฌ๋ค๋ฉด, ์๋๋ก ๋ด๋ ค Last_IO_Error ํญ๋ชฉ์ ๋ณด์.
๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ด๊ธฐ์ network ์ค์ ์ ์ ๋๋ก ์ ํด์ค์ ์ด๋ ๊ฒ ํต์ ์ด ์คํจํ์๋ค.
ํน์, ์ด๋ฐ ์์ผ๋ก Authentication ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์ด๊ธฐ์ mysql ์ค์ ํ์ผ์์ default_authentication_plugin ๊ฐ์ ์ง์ ํด์ฃผ์ง ์์์ ํ๋ฅ ์ด ๋๋ค… ์ ์ ๋๋์ง ๋๋ ์๊ณ ์ถ์ง ์์์ง๋ง ์ด 2๊ฐ์ง ์ค๋ฅ ๋๋ฌธ์ ์๊ฐ์ ๋ง์ด ์ผ๋ค.
์ฌ๋ ์ด๋ธ ์๋ฒ์์ ๋ง์คํฐ ์๋ฒ ์ฐ๋ ์ GET_MASTER_PUBLIC_KEY ์ด ์ต์
์ ๋นผ๋จน์์ ํ๋ฅ ๋ ์๋ค…! ์ ํ์ธํด๋ณด์.
์ต์ข
์ ์ผ๋ก ์ ๋๋ก ๋์๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ ๋ค Yes๋ก ๋ฐ ๊ฒ์ด๋ค.
ํธ์คํธ ์ฃผ์๊ฐ ์ด์ ๊ณผ ๋ค๋ฅธ ์ด์ ๋ ์ค๋ฅ๊ฐ ๊ฝค ์ฌ๋ฌ ๋ฒ ๋ด์์ด์ ๋ค์ ๋ง๋๋๋ผ ๋ฐ๋์๋ค.
๋ง์คํฐ์์๋ ์ฌ๋ ์ด๋ธ์ ์ ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋๋ฐ, ์๋์ ๊ฐ์ด ์
๋ ฅํด๋ณด์.
show processlist\G
๊ฐ์ฅ ์๋์ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ํ๋ test-replication ์ด๋ผ๋ ์น๊ตฌ์ ๋ํด State๋ก ‘source๊ฐ ๋ชจ๋ binlog๋ฅผ replication์ ๋ณด๋๋ค’ ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํ ์ ์๋ค!
๐ฑ ๋ณต์ ํ ์คํธ ํด๋ณด๊ธฐ
๋ง์คํฐ ์๋ฒ์ ์ ์ํ์ฌ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ง์ด ๋ฃ๊ณ ํ ๋ฒ ํ์ธํด๋ณด์.
use practice;
create table test(
id bigint not null primary key,
name varchar(100)
) engine = 'INNODB';
insert into test (id, name) values (1, 'test');
insert ํ ๋ง์คํฐ ์๋ฒ์ ๋ชจ์ต์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์ ์ํ์ฌ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ ๋ณต์ ๋์๋์ง ํ์ธํด๋ณด์.
์์ ๊ฐ์ด ์ ๋ณต์ ๊ฐ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค!
(๋ฐ์ดํฐ ๊ฐ์ด ๋๊ฐ์์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์ ์ํ์ ๋ ๋์จ ๊ฒฐ๊ณผ์ด๋ค!
๐ฑ ๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์๋ mySQL์ ํ์ฉํ์ฌ ๊ฐ๋จํ๊ฒ master <-> slave ๊ฐ replication ์ ๋ง๋ค์ด๋ณด์๋ค.
์ค๋ฌด์์๋ ๊ณ ๋ คํด์ผ ํ๋ ์ ๋ค์ด ํจ์ฌ ๋ ๋ง๊ฒ ์ง๋ง, master์ ๋ด์ฉ์ด ์์์ slave๋ก ๋ณต์ ๋๋ ๋ชจ์ต์ ์ง์ ๋ณด๋๊น ๊ต์ฅํ ์ ๊ธฐํ๋ค.
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ง๋๋ ๊ฒ๋ ์์ฒญ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋๋ฐ, ์ค์ ๋ก๋ ํจ์ฌ ๋ณต์กํ๊ฒ ๋์ํ ๊ฒ ๊ฐ๋ค๋ ๊ณ ๋ฏผ๋ ๋ค์๋ค.
์ค์ ๋ก ์ผ์ ํ๋ฉด์ ์ด๋ฐ ๊ฒ๊น์ง ์ ๋๋ก ๊ณ ์ฐฐํด๋ณด์ง ๋ชปํ์๋๋ฐ, ์์ผ๋ก๋ ์ด๋ฐ ์์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด ๋ณผ ์ ์๋ ๊ฒ๋ค์ ์ค์ตํด๋ณด๋ ์์ผ๋ก ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๋ค์ ํฌ์คํ ์ด ์ธ์ ๊ฐ ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง... ์๊ฐ ๋ด์ 2ํธ๋ ์์ฑํด๋ด์ผ๊ฒ ๋ค. ๋!