๊ฐ์
MySQL์ Master-Slave Replication์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ(Consistency) ๋ฐ ๊ฐ์ฉ์ฑ(Availability)์ ๋ณด์ฅํ๊ธฐ ์ํด ๋๋ฆฌ ์ฐ์ด๋ ๊ธฐ์ ์ ๋๋ค. ์ด ๊ธ์์๋ Docker๋ผ๋ ์ปจํ ์ด๋ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ MySQL ํ๊ฒฝ์์ Master-Slave Replication์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
- Master-Slave Replication ๊ตฌ์ฑํ๊ธฐ
- Bridge Network์ ์ด์ฉํ Replication ๊ตฌ์ฑ
Replication ๋์ ์๋ฆฌ
MySQL์ ๋ณต์ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ๋ง์คํฐ ์๋ฒ์์ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ก ๋ณต์ฌํ๋ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค. ์ด ๊ณผ์ ์ ํฌ๊ฒ 4๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
- ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋ก: ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์์ฒญํ๊ณ ์ด๋ฅผ Commitํ๋ฉด, ์ด ๋ณ๊ฒฝ์ฌํญ์ ๋จผ์ ๋ง์คํฐ ์๋ฒ์ ์กด์ฌํ๋ Binary log์ ๊ธฐ๋ก๋ฉ๋๋ค. Binary log๋ MySQL ์๋ฒ์์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ ์ถ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ก๊ทธ ํ์ผ์ ๋๋ค.
- ๋ณ๊ฒฝ์ฌํญ์ ์ ์ก: ๋ง์คํฐ ์๋ฒ์ Master Thread๋ Binary log๋ฅผ ์ฝ์ด ์ฌ๋ ์ด๋ธ ์๋ฒ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์ ์กํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ณต์ฌ๋๋ ์๊ฐ์ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๊ธฐ ๋๋ฌธ์, ํฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ด ์๋๋ผ๋ ๋ง์คํฐ ์๋ฒ์ ์์ ์ด ์ง์ฐ๋์ง ์์ต๋๋ค.
- ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅ: ์ฌ๋ ์ด๋ธ ์๋ฒ์ I/O Thread๋ ๋ง์คํฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ Relay log์ ๊ธฐ๋กํฉ๋๋ค. Relay log๋ ๋ง์คํฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ Binary log๋ฅผ ์ ์ฅํ๋ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋ก๊ทธ ํ์ผ์ ๋๋ค.
- ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉ: ๋ง์ง๋ง์ผ๋ก, ์ฌ๋ ์ด๋ธ ์๋ฒ์ SQL Thread๋ Relay log์ ๊ธฐ๋ก์ ์ฝ์ด ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์คํ ๋ฆฌ์ง ์์ง์ ์ต์ข ์ ์ผ๋ก ์ ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ์ฌ ๋ง์คํฐ ์๋ฒ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ฌํญ์ด ์ฌ๋ ์ด๋ธ ์๋ฒ์๋ ๋ฐ์๋๊ฒ ๋ฉ๋๋ค.
ํ ์คํธ ํ๊ฒฝ: Amazone Linux
1. Master-Slave Replication ๊ตฌ์ฑํ๊ธฐ
1.1 ๋๋ ํ ๋ฆฌ ๋ฐ ํ์ผ ์ค์
๋จผ์ , Master์ Slave ์๋ฒ๋ฅผ ์ํ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด ๋จ๊ณ์์๋ ๋ฐ์ดํฐ, ๋ก๊ทธ, ์ค์ ํ์ผ์ ์ ์ฅํ ๊ณต๊ฐ์ ๋ง๋ค์ด ์ค๋๋ค.
mkdir -p /db/db001/data /db/db002/data /db/db003/data
chmod 777 /db/db001 /db/db001/data
chmod 777 /db/db002 /db/db002/data
chmod 777 /db/db003 /db/db003/data
mkdir -p /db/db001/log /db/db001/conf
mkdir -p /db/db002/log /db/db002/conf
mkdir -p /db/db003/log /db/db003/conf
chmod 777 /db/db001/log /db/db001/conf
chmod 777 /db/db002/log /db/db002/conf
chmod 777 /db/db003/log /db/db003/conf
์ ๋ช ๋ น๋ค์ ์คํํ๋ฉด, ํ์ํ ๋๋ ํ ๋ฆฌ๋ค์ด ์์ฑ๋ฉ๋๋ค.
1.2 MySQL ์ค์
์ด ๋จ๊ณ์์๋ ๊ฐ๊ฐ์ ์๋ฒ์ ๋ํ MySQL ์ค์ ํ์ผ์ ๋ง๋ค๊ณ , ๊ฐ ์๋ฒ๋ง๋ค ๊ณ ์ ํ ์ค์ ์ ์ ์ํฉ๋๋ค. ์ฃผ์ ์ค์ ์๋ binlog, gtid, server-id ๋ฑ์ด ์์ผ๋ฉฐ, ์ด๋ค์ ๋ฐ์ดํฐ ๋ณต์ ์ ํ์ํ ์ค์ ๋ค์ ๋๋ค. master(db001)๋ฅผ ์ ์ธํ slave(db002, db003)์๋ read_only ์ค์ ์ด ์ถ๊ฐ๋ฉ๋๋ค. ์ด ์ค์ ๋ค์ ๊ฐ๋ตํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- log_bin: ๋ฐ์ด๋๋ฆฌ ๋ก๊น ์ ํ์ฑํํ๋ค. ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ ๋ณต์ ์ ํธ๋์ญ์ ๋ณต๊ตฌ์ ํ์ํ๋ฉฐ, ๋ก๊ทธ ํ์ผ์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ธฐ๋ก๋๋ค.
- binlog_format: ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ์ด๋ฒคํธ๊ฐ ์ ์ฅ๋๋ ํ์์ ์ง์ ํ๋ค. ROW๋ ๊ฐ ํ ๋ณ๊ฒฝ์ ๋ก๊ทธ์ ๊ธฐ๋กํ๋ค.
- gtid_mode ๋ฐ enforce-gtid-consistency: GTID(Global Transaction Identifier)๋ฅผ ํ์ฑํํ๋ค. GTID๋ ๊ฐ ํธ๋์ญ์ ์ ๊ณ ์ ํ ID๋ฅผ ๋ถ์ฌํ์ฌ ๋ณต์ ๋ฅผ ๋ ์์ ์ ์ด๊ณ ์ฝ๊ฒ ๊ด๋ฆฌํ๋๋ก ํ๋ค.
- server-id: ๋ณต์ ๊ตฌ์ฑ์์ ๊ฐ MySQL ์๋ฒ๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- log_slave_updates:์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ์์ ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๋ณต์ ๋ ํธ๋์ญ์ ์ ๊ธฐ๋กํ๋๋ก ํ๋ค.
- datadir: MySQL ๋ฐ์ดํฐ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ๋ค.
- socket: MySQL ์๋ฒ์ ์ ๋์ค ์์ผ ํ์ผ์ ์์น๋ฅผ ์ง์ ํ๋ค.
- read_only: ์ฌ๋ ์ด๋ธ ์๋ฒ์์๋ง ์ฌ์ฉ๋๋ฉฐ, ์ฌ๋ ์ด๋ธ์์ ๋ชจ๋ ๋ณ๊ฒฝ์ ๊ฑฐ๋ถํ์ฌ ๋ชจ๋ ๋ณ๊ฒฝ์ด ๋ง์คํฐ์์๋ง ๋ฐ์ํ๋๋ก ํ๋ค.
1.1์์ ์์ฑํ /db/dbxxx/conf ๋๋ ํ ๋ฆฌ์ cnf ํ์์ ํ์ผ์ ์์ฑํ๊ณ , ์์ ์ค์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, db001์ MySQL ์ค์ ์ ์ํด /db/db001/conf/my.cnf ํ์ผ์ ์์ฑํ๊ณ ์๋์ ๋ด์ฉ์ ๊ธฐ๋กํฉ๋๋ค.
db001 MySQL ์ค์
# db001์ MySQL ์ค์ ์์
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 100
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db001
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋จธ์ง ์๋ฒ(db002, db003)์ ์ค์ ํ์ผ๋ ์์ฑํฉ๋๋ค. ์ด๋, ๊ฐ ์ค์ ํ์ผ์ server-id๋ ๊ณ ์ ํด์ผ ํ๋ฉฐ, ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๊ฒฝ์ฐ read_only ์ค์ ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
db002 MySQL ์ค์
# db002์ MySQL ์ค์ ์์
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 200
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
read_only
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db002
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0
db003 MySQL ์ค์
# db003์ MySQL ์ค์ ์์
[mysqld]
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce-gtid-consistency = true
server-id = 300
log_slave_updates
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
read_only
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links = 0
log-error = /var/log/mysql/mysqld.log
pid-file = /var/run/mysqld/mysqld.pid
report_host = db003
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
nice = 0
1.3 Docker ์ปจํ ์ด๋ ์คํ
์ด์ ๊ฐ MySQL ์๋ฒ๋ฅผ Docker ์ปจํ ์ด๋๋ก ์คํํฉ๋๋ค. db001, db002, db003์ ์ด๋ฆ์ผ๋ก ๊ฐ๊ฐ์ ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
docker run -i -t --name db001 -h db001 -p 3306:3306 \
-v /db/db001/data:/var/lib/mysql \
-v /db/db001/log:/var/log/mysql \
-v /db/db001/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
docker run -i -t --name db002 -h db002 -p 3307:3306 \
-v /db/db002/data:/var/lib/mysql \
-v /db/db002/log:/var/log/mysql \
-v /db/db002/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
docker run -i -t --name db003 -h db003 -p 3308:3306 \
-v /db/db003/data:/var/lib/mysql \
-v /db/db003/log:/var/log/mysql \
-v /db/db003/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
๋ชจ๋ ์ปจํ ์ด๋๊ฐ ์ ์์ ์ผ๋ก ์์ฑ๋์๋์ง ํ์ธํ๊ธฐ ์ํด docker ps ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ ํ์ฌ ์คํ ์ค์ธ ๋ชจ๋ ์ปจํ ์ด๋์ ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๋ฉฐ, --format ์ต์ ์ ์ถ๊ฐํ์ฌ ์ถ๋ ฅ ํ์์ ์ง์ ํ๋ฉด, ID, ์ด๋ฆ, ์ํ ๋ฑ ํ์ํ ์ ๋ณด๋ง ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
1.4 ๋ณต์ ์ฌ์ฉ์ ์์ฑ ๋ฐ ๊ถํ ๋ถ์ฌ
์ด ๋จ๊ณ์์๋ ๋ง์คํฐ ์๋ฒ์์ ๋ณต์ ๋ฅผ ์ํ ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ , ํ์ํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
# Docker ์ปจํ
์ด๋ ์ ์
docker exec -it -uroot db001 /bin/bash
# MySQL ์ ์
mysql -uroot -p
# ๋ณต์ ์ฌ์ฉ์ ์์ฑ
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
# ๋ณต์ ๊ถํ ๋ถ์ฌ(์ฌ๊ธฐ์ 'REPLICATION SLAVE'๋ ๋ณต์ ์ฌ๋ ์ด๋ธ ๊ถํ์ ์๋ฏธ)
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# ๊ถํ ์ฆ์ ์ ์ฉ
FLUSH PRIVILEGES;
1.5 Slave ์๋ฒ ์ค์ (db002 ๋ฐ db003 Replication ์ค์ )
์ด์ ๊ฐ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋ํด ๋ณต์ ์ค์ ์ ์งํํฉ๋๋ค. ์ฌ๊ธฐ์ db002์ db003์ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ์ปจํ ์ด๋ ์ด๋ฆ์ ๋๋ค. ๊ฐ ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋ํด ๋์ผํ ์ค์ ์ ์งํํ๋ฉฐ, ๊ฐ ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# Docker ์ปจํ
์ด๋ ์ ์
docker exec -it -uroot db002 /bin/bash
# ๋๋
docker exec -it -uroot db003 /bin/bash
# MySQL ์ ์
mysql -uroot -p
# ์ด์ ๋ณต์ ์ค์ ์ด๊ธฐํ
reset master;
# Master ์๋ฒ ์ ๋ณด ์ค์
CHANGE MASTER TO MASTER_HOST='172.17.0.1', \
MASTER_USER='repl', MASTER_PASSWORD='repl', \
MASTER_AUTO_POSITION=1;
# ๋ณต์ ์์
START SLAVE;
์ฌ๊ธฐ์ MASTER_HOST๋ ๋ง์คํฐ ์๋ฒ์ IP ์ฃผ์๋ ํธ์คํธ ์ด๋ฆ์ด๋ฉฐ, MASTER_USER์ MASTER_PASSWORD๋ ์์ ๋ง์คํฐ ์๋ฒ์์ ์์ฑํ ๋ณต์ ์ฌ์ฉ์์ ์ ๋ณด์ ๋๋ค. MASTER_AUTO_POSITION=1์ GTID ๊ธฐ๋ฐ ๋ณต์ ๋ฅผ ํ์ฑํํ๋ ์ค์ ์ ๋๋ค.
๋ณต์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์งํ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์๋์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. ์ฌ๊ธฐ์ Slave_IO_Running์ Slave_SQL_Running ์ํ๊ฐ ๋ชจ๋ 'Yes'๋ก ์ถ๋ ฅ๋๋์ง ํ์ธํ๋ฉด ๋ฉ๋๋ค. 'Yes'๋ก ์ถ๋ ฅ๋๋ฉด ์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ๋ง์คํฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ์์ ์ผ๋ก ๋ฐ์์ฌ ์ ์๊ณ , ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ์ ์์ ์ผ๋ก ์คํํ ์ ์๋ค๋ ์๋ฏธ์ ๋๋ค.
show slave status\G
2. Bridge Network์ ์ด์ฉํ Replication ๊ตฌ์ฑ
Docker์ Bridge Network๋ Docker ์ปจํ ์ด๋ ๊ฐ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋คํธ์ํฌ ๋ชจ๋์ ๋๋ค. ์ด๋ ๊ฐ ์ปจํ ์ด๋์ ๋ํด ๊ฒฉ๋ฆฌ๋ ๋คํธ์ํฌ ํ๊ฒฝ์ ์ ๊ณตํ๋ฉฐ, ์ปจํ ์ด๋ ๊ฐ์๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ํตํด ํต์ ํ ์ ์์ต๋๋ค.
Docker ์ปจํ ์ด๋๋ ์ธ์ ๋ ์ง ์ฌ์์๋ ์ ์์ผ๋ฉฐ, ์ปจํ ์ด๋๊ฐ ์ฌ์์๋๋ฉด ํด๋น ์ปจํ ์ด๋์ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋๋ฐ, ์ด๋ MySQL์ ๋ณต์ ์ค์ ์ด๋ ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA) ์ค์ ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ์ค์ ๋ค์ ํน์ IP ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์, IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ณต์ ๋ HA ์ค์ ์ด ์ ๋๋ก ์๋ํ์ง ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด Docker์ Bridge Network๋ฅผ ์ฌ์ฉํ์ฌ net alias๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. net alias๋ ํน์ ์ปจํ ์ด๋๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ถ๊ฐ์ ์ธ DNS ์ด๋ฆ์ผ๋ก, ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํ ์ด๋์ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ net alias๋ ๋์ผํ๊ฒ ์ ์ง๋์ด ๋ณต์ ๋ HA ์ค์ ์ด ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
Bridge Network๋ฅผ ๊ตฌ์ฑํ๊ณ net alias๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
2.1 Bridge Network ์์ฑ
๋จผ์ docker network create ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Bridge Network๋ฅผ ์์ฑํฉ๋๋ค.
# ์์ฑ
docker network create --driver bridge mybridge
# ํ์ธ
docker network ls
2.2 ์ปจํ ์ด๋ ์์ฑ ๋ฐ Bridge Network ์ฐ๊ฒฐ
์ด์ ์์ฑ๋ Bridge Network๋ฅผ ์ด์ฉํ์ฌ ๊ฐ MySQL ์๋ฒ์ ์ปจํ ์ด๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ ์ปจํ ์ด๋๋ 'mybridge'๋ผ๋ ์ด๋ฆ์ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋๋ฉฐ, 'db001', 'db002', 'db003'๋ผ๋ net alias๋ฅผ ๊ฐ๊ฐ ๋ถ์ฌ๋ฐ์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ์ปจํ ์ด๋๋ ์๋ก ํต์ ํ ์ ์๋ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค.
docker run -i -t --name db001 -h db001 -p 3306:3306 \
--net mybridge --net-alias=db001 \
-v /db/db001/data:/var/lib/mysql \
-v /db/db001/log:/var/log/mysql \
-v /db/db001/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
docker run -i -t --name db002 -h db002 -p 3307:3306 \
--net mybridge --net-alias=db002 \
-v /db/db002/data:/var/lib/mysql \
-v /db/db002/log:/var/log/mysql \
-v /db/db002/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
docker run -i -t --name db003 -h db003 -p 3308:3306 \
--net mybridge --net-alias=db003 \
-v /db/db003/data:/var/lib/mysql \
-v /db/db003/log:/var/log/mysql \
-v /db/db003/conf:/etc/percona-server.conf.d \
-e MYSQL_ROOT_PASSWORD="root" -d percona:5.7.30
์ฌ๊ธฐ์ --net mybridge ์ต์ ์ ์ปจํ ์ด๋๋ฅผ 'mybridge' ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ผ๋ ์๋ฏธ์ด๊ณ , --net-alias=db001 ๊ฐ์ ์ต์ ์ ์ปจํ ์ด๋์ 'db001'์ด๋ผ๋ net alias๋ฅผ ๋ถ์ฌํ๋ผ๋ ์๋ฏธ์ ๋๋ค. ์ด net alias๋ฅผ ํตํด ์ปจํ ์ด๋์ IP ์ฃผ์๊ฐ ๋ฐ๋๋๋ผ๋, ์ด alias๋ฅผ ํตํด ์ปจํ ์ด๋๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด, ์ปจํ ์ด๋์ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ณต์ ์ค์ ์ด ์ํฅ์ ๋ฐ์ง ์๊ฒ ๋ฉ๋๋ค.
2. 3 Slave ์๋ฒ ์ค์ (db002 ๋ฐ db003 Replication ์ค์ )
์ด์ ๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ฒ์๋ MASTER_HOST์ IP ์ฃผ์ ๋์ ๋ง์คํฐ ์๋ฒ์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ๋ง์คํฐ ์๋ฒ์ IP ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ค์ ์ ์ํฅ์ ์ฃผ์ง ์๊ฒ ๋ฉ๋๋ค.
# Docker ์ปจํ
์ด๋ ์ ์
docker exec -it -uroot db002 /bin/bash
# ๋๋
docker exec -it -uroot db003 /bin/bash
# MySQL ์ ์
mysql -uroot -p
# ์ด์ ๋ณต์ ์ค์ ์ด๊ธฐํ
reset master;
# Master ์๋ฒ์ ๋ํ ๋ณต์ ์ค์
CHANGE MASTER TO MASTER_HOST='db001', \
MASTER_USER='repl', MASTER_PASSWORD='repl', \
MASTER_AUTO_POSITION=1;
# ๋ณต์ ์์
START SLAVE;
๋ง์ฐฌ๊ฐ์ง๋ก ์ฑ๊ณต ์ฌ๋ถ๋ ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
show slave status\G
Replication ํ ์คํธ
๋ง์คํฐ ์๋ฒ์ MySQL์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ ๋, ์ฌ๋ ์ด๋ธ ์๋ฒ์ MySQL์์๋ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์กฐํ๋๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
์ฌ๊ธฐ๊น์ง MySQL์ Master-Slave ๋ณต์ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค. ์ ๊ตฌ์ฑ์ ๋ง์คํฐ ์๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ์ฌ๋ ์ด๋ธ ์๋ฒ์ ๋๊ธฐํ๋๊ฒ ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ง์คํฐ ์๋ฒ์ ๋ถํ๋ฅผ ํธ์จ์ ์ผ๋ก ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
ํ์ง๋ง, ํ์ฌ ๊ตฌ์ฑ์์๋ ๋ง์คํฐ ์๋ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์ค๋จ๋๋ฉด, ์ฌ๋ ์ด๋ธ ์๋ฒ๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด์์๊ฐ ์ง์ ์กฐ์น๋ฅผ ์ทจํ๊ธฐ ์ ๊น์ง๋ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ๋ง์คํฐ ์๋ฒ๋ก ๋์ฒดํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๋ฌธ์ ๊ฐ ์กด์ฌํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ค์ ๊ธ์์๋ ๋ง์คํฐ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ๋ง์คํฐ ์๋ฒ๋ก ์น๊ฒฉ์ํค๋ ๊ณผ์ ์ ์๋ํํ๋ Orchestrator๋ฅผ ํ์ฉํ ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA) ๊ตฌ์ฑ์ ๋ํด ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
'BackEnd๐ฑ > DB & SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
select .. for update ๋์ ์ ๋ฌด์ ๋ฐ๋ฅธ ์ ๊ธ ์ํ (0) | 2024.04.11 |
---|---|
[Docker MySQL] Proxy Layer ๊ตฌ์ถํ๊ธฐ (0) | 2023.11.12 |
[Docker MySQL] Orchestrator๋ฅผ ์ด์ฉํ High Availability(HA) ๊ตฌ์ถํ๊ธฐ (6) | 2023.11.06 |
[MySQL] MVCC๋ฅผ ํตํ ์ ๊ธ์๋ ์ฝ๊ธฐ (7) | 2023.10.07 |
[MySQL] ์ฌ์ฉ์ ์์ฑ ๋ฐ ๊ถํ ๋ถ์ฌ ๋ฐฉ๋ฒ (0) | 2023.10.06 |
MySQL์์ VARCHAR์ TEXT์ ์ฐจ์ด (1) | 2023.09.17 |
๋๊ธ