Mysql์ Replicatoin ๊ฐ๋ ์ ์ ๋ฆฌํ๊ณ ํ๋ก์ ํธ ์ค AI ๋ชจ๋ธ ์ฌํ์ต ์ 900๋ง ๊ฑด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฉด์ ์๊ธฐ๋ DB์ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํ ํฌ์คํฐ์ ๋๋ค.
1. ๋ณต์ (Replication)
๋ณต์ (Replication)๋ 1๊ฐ ์ด์์ ๋ ํ๋ฆฌ์นด(replica) ์ ์ฅ์๊ฐ ์์ค ์ ์ฅ์์ ๋๊ธฐํ๋ฅผ ์๋์ผ๋ก ์ ์งํ๋ ๊ณผ์ ์ด๋ค. ์ฌ์ฉํ๊ธฐ ์ํ ์ต์ ๊ตฌ์ฑ์ Master / Slave์ด๋ค.
Master DBMS ์ญํ
์น์๋ฒ๋ก ๋ถํฐ ๋ฐ์ดํฐ ๋ฑ๋ก/์์ /์ญ์ ์์ฒญ์ ๋ฐ์ด๋๋ฆฌ๋ก๊ทธ(Binarylog)๋ฅผ ์์ฑํ์ฌ Slave ์๋ฒ๋ก ์ ๋ฌํ๊ฒ ๋๋ค. (์น์๋ฒ๋ก ๋ถํฐ ์์ฒญํ ๋ฐ์ดํฐ ๋ฑ๋ก/์์ /์ญ์ ๊ธฐ๋ฅ์ ํ๋ DBMS๋ก ๋ง์ด ์ฌ์ฉ)
Slave DBMS ์ญํ
Master DBMS๋ก ๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฐ์ด๋๋ฆฌ๋ก๊ทธ(Binarylog)๋ฅผ ๋ฐ์ดํฐ๋ก ๋ฐ์ํ๊ฒ ๋๋ค. (์น์๋ฒ๋ก ๋ถํฐ ์์ฒญ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ DBMS๋ก ๋ง์ด ์ฌ์ฉ)
2. Mysql Repication ์ฌ์ฉ ๋ชฉ์
mysql ๋ฆฌํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ๋ชฉ์ ์ ํฌ๊ฒ ์ค์๊ฐ Data ๋ฐฑ์ ๊ณผ ์ฌ๋ฌ๋์ DB ์๋ฒ์ ๋ถํ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ค.
๋จผ์ ๋ฐ์ดํฐ์ ๋ฐฑ์ ์ด๋ค.
์๋ฅผ ๋ค์ด Master ์๋ฒ๋ฅผ ๋ฐ์ดํฐ์ ์๋ณธ์๋ฒ, Slave ์๋ฒ๋ฅผ ๋ฐฑ์ ์๋ฒ๋ก ์ง์นญํ์๋ค.
Master ์๋ฒ์ DBMS์ ๋ฑ๋ก/์์ /์ ๋ฐ์ดํธ๊ฐ ์๊ธฐ๋ ์ฆ์ Slave ์๋ฒ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฒ ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ผ๋ก ๋ฐฑ์ ์ ํ ์ ์์ผ๋ฉฐ, Master ์๋ฒ์ ์ฅ์ ๊ฐ ์๊ฒผ์ ๊ฒฝ์ฐ Slave ์๋ฒ๋ฅผ DB๋ก ์ฌ์ฉํ ์ ์๋ค.
DBMS์ ๋ถํ ๋ถ์ฐ์ด๋ค.
์ฌ์ฉ์์ ํญ์ฃผ๋ก ์ธํด 1๋์ DB์๋ฒ๋ก ๊ฐ๋นํ ์ ์์ ๋, MySQL ๋ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ฉํ์ฌ ๊ฐ์ DB ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ๋๋ก ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๋ถํ๋ฅผ ๋ถ์ฐ์์ผ์ค ์ ์๋ค.
์์์๋ ์๊ธฐํ๋ฏ์ด Master ์๋ฒ๋ ๋ฑ๋ก/์์ /์ญ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ฒ๋ก ์ฌ์ฉํ๊ณ , Slave ์๋ฒ๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ฉฐ ๋ถํ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ค.
์ด ์ธ์๋ ๋ณต์ ์ ์ฅ์ ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- ๋ถ์
- ์๋ณธ ๋ฐ์ดํฐ์ ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ณ , ์๋ณธ ๋ฐ์ดํฐ์ ์ฑ๋ฅ ์ด์์์ด ๋ ํ๋ฆฌ์นด์์ ๋ถ์์ ํ ์ ์๋ค.
- ์๊ฑฐ๋ฆฌ ๋ฐ์ดํฐ ๋ถ์ฐ
- ์๋ณธ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ์๊ณ ๋, ์๊ฒฉ ์ฌ์ดํธ์์ ์ฌ์ฉ ํ ๋ก์ปฌ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ ์์ฑํ ์ ์์ต๋๋ค.
3. ๋ณต์ ์ ์๋ฆฌ
์๋๋ MySQL์ Master-Slave ๋ณต์ ์๋ฆฌ์ด๋ค.
MySQL์์ ๋ณต์ ๋ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ์ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ ๊ธฐ๋กํ๋ค.
1. ๋ ํ๋ฆฌ์นด๊ฐ ์ด๊ธฐํ๊ฐ ๋๋ค๋ฉด, 2๊ฐ์ ์ฐ๋ ๋ ์์ ์ ์์ฑ
2. ํ๋๋ I/O ์ฐ๋ ๋๋ก ์๋ณธ ์ธ์คํด์ค์ ์ฐ๊ฒฐํ๊ณ ํ ์ค์ฉ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ๋ฅผ ์ฝ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ํ๋ฆฌ์นด ์๋ฒ์ Relay ๋ก๊ทธ์ ํด๋น ๋ด์ฉ๋ค์ ๋ณต์ฌ.
3. ๋๋ฒ์งธ ์ฐ๋ ๋๋ SQL ์ฐ๋ ๋๋ก, relay ๋ก๊ทธ๋ฅผ ์ฝ๊ณ ๋ ํ๋ฆฌ์นด ์ธ์คํด์ค์ ์ต๋ํ ๋น ๋ฅด๊ฒ ์ ์ฉ๋ค.
4. Replication ์ ์ฃผ์ ์ฌํญ
mysql replication์ ์งํํ๊ธฐ ์ ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ํด์ผ ํ๋ ๋ช ๊ฐ์ง ์ฌํญ๋ค์ด ์๋ค.
1. ํธํ์ฑ์ ์ํด Replication์ ์ฌ์ฉํ๋ MySQL์ ๋ฒ์ ์ ๋์ผํ๊ฒ ๋ง์ถ๊ธฐ
2. Replication์ ์ฌ์ฉํ๊ธฐ์ MySQL ๋ฒ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ Slave ์๋ฒ๊ฐ ์์ ๋ฒ์ ์ด์ด์ผ ํ๋ค.
3. Replication์ ๊ฐ๋์์ Master ์๋ฒ, Slave ์๋ฒ ์์ผ๋ก ๊ฐ๋์์ผ์ผ ํ๋ค.
5. ๊ตฌ์ฑํด๋ณด๊ธฐ
๋ ๊ฐ์ ์ฐ๋ถํฌ ํ๊ฒฝ์์ ํด๋ณด๋ ค๋ค ๊ฐ๋จํ๊ฒ Docker๋ฅผ ์ฌ์ฉํด์ ๊ตฌ์ฑํด๋ณด๊ธฐ๋ก ํ๋ค.
5-1. master DB ์์ฑ
master ์ปจํ ์ด๋ ์คํ ํ ์ปจํ ์ด๋ ๋ด๋ถ ์ ์, ์ค์ ํ์ผ ์์ ์ ์ํด vim ์ค์น
vim ์ค์น๊ฐ ์ ๋ ๊ฒฝ์ฐ, ๋ก์ปฌ์์ my.cnf๋ฅผ ์์ฑํด docker cp๋ก ๋ฃ์ด์ฃผ์. ์ด๋ฏธ์ง ๋ง๋ค apt๋ฅผ ์ง์ํด์ฃผ๋ ์ด๋ฏธ์ง๋ ์๊ณ ์๋ ๊ฒ๋ ์๋ค.
$ docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=1234 -d mysql:8-debian
$ docker exec -it mysql-master /bin/bash
$ apt-get update
$ apt-get install -y vim
vi ๋ช ๋ น์ด๋ก /etc/mysql/my.cnf ํ์ผ์ ์ด๊ณ , ์๋์ ๊ฐ์ด 2์ค์ ์ถ๊ฐ
log-bin=mysql-bin
server-id=1
๊ธฐ์กด ์ด์์ค์ธ DB๋ฅผ Replicationํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํด์ผ ํ๋๋ฐ ์ด๋ ๋ณดํต dump๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. dump์ ์ฑ๋ฅ ํฅ์์ ์ฌ๋ ค์ฃผ๋ ค๋ฉด buffer size๋ฅผ ๋๋ ค ์งํํ๋ฉด ๋๋ค.
์๋๋ dummy data๋ฅผ ๋ฃ์์ง๋ง ์ถํ์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ insertํด์ผํ๊ธฐ ๋๋ฌธ์ ์๋ ์ต์ ๋ ์ถ๊ฐํด์ฃผ์๋ค.
innodb_buffer_pool_size = 4G
innodb_log_file_size = 1G
ํ์ฌ ์ฌ์ฉ์ค์ธ ๋ฒํผ ์ฌ์ด์ฆ๋ฅผ ํ์ธํ๋ ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ mysql์ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
log bin
์ ๋ฐ์ดํธ๋๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ค์ด Binary log ํ์ผ์ ๊ธฐ๋ก๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Binary log ํ์ผ์ MySQL์ data directory์ธ /var/lib/mysql/ ์ ํธ์คํธ๋ช -bin.000001, ํธ์คํธ๋ช -bin.000002 ํํ๋ก ์์ฑ๋๋ค.
์ด๋, log-bin ์ค์ ์ ๋ณ๊ฒฝํ๋ฉด Binary log ํ์ผ์ ๊ฒฝ๋ก์ ํ์ผ๋ช ์ ์ ๋์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
์์์ log-bin=mysql์ด๋ผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ mysql-bin.000001, mysql-bin.000002 ์ด๋ฆ์ผ๋ก๋ก Binary log ํ์ผ์ด ์์ฑ๋๋ค.
server-id
์ค์ ์์ ์๋ฒ๋ฅผ ์๋ณํ๊ธฐ ์ํ ๊ณ ์ ID๊ฐ์ด๋ค. master, slave ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ์ค์ ํด์ผ ํ๋ค.
๋์ปค๋ฅผ ์ฌ์์ํ์ฌ ์ค์ ๋ณ๊ฒฝ ์ ์ฉ ํ ๋์ปค ๋ด๋ถ์ ๋ค์ ์ ์ํ์ฌ ์ค์ ์ด ์ ๋๋ก ์ ์ฉ๋์๋์ง ํ์ธ
$ docker restart mysql-master
$ docker exec -it mysql-master /bin/bash
$ mysql -u root -p
mysql> SHOW MASTER STATUS\G
ํ์ฌ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ๋ช ์ด๊ณ , Position์ ํ์ฌ ๋ก๊ทธ์ ์์น๋ฅผ ๋ํ๋ธ๋ค.
master DB์ ๊ณ์ ์์ฑ
master DB์์ ์ฌ์ฉํ ๊ณ์ ์ ์์ฑํ๋ค. ์ด ๊ณ์ ์ด slave DB์์ ๋ณต์ ํ ์์ ์ด๋ค. dgjinsu ๋ผ๋ ๊ณ์ ์ ์๋ก ์์ฑํ๊ณ , ๋ชจ๋ ip์ ๋ํด์ ๊ถํ์ ์ด์ด์ค๋ค.
$ CREATE USER 'dgjinsu'@'%' IDENTIFIED BY '1234';
//sha256_password
$ ALTER USER 'dgjinsu'@'%' IDENTIFIED WITH mysql_native_password BY '1234';
$ GRANT REPLICATION SLAVE ON *.* TO 'dgjinsu'@'%';
$ FLUSH PRIVILEGES;
MySQL 5.8๋ถํฐ๋ Password Auth๋ฐฉ์์ด caching_sha2_password ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋์๋ค๊ณ ํ๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ด ์ ์ ๋ฅผ ์์ฑํ ๋ IDENTIFIED WITH mysql_native_password BY ๋ก ์์ฑํด์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋์ ์๋ฌ๋ฅผ ๋ง๋ ์ ์๋ค.
error connecting to master 'replication
user@mysql-primary:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching
sha2_password' reported error: Authentication requires secure connection.
์ ๋ถ ์ ๋ ฅํ๋ค๋ฉด ๋ฐฉ๊ธ ์์ฑ๋ ๊ณ์ ์ด ๋ณด์ผ ๊ฒ์ด๋ค.
$ SELECT User, Host FROM mysql.user;
database, table์ ๋ง๋ค๊ณ ์๋ฌด ๋ฐ์ดํฐ๋ ์ฝ์ ํด์ค๋ค.
master ์ปจํ ์ด๋๋ก ๋์์์, dump๋ฅผ ํด์ค๋ค.
์์ฑํ dump.sql ํ์ผ์ ๋ก์ปฌ ํ๊ฒฝ์ผ๋ก ๊ฐ์ ธ์์ค๋ค.
$ mysqldump -u root -p bookclub > dump.sql // ์ปจํ
์ด๋์์ ์คํ
$ docker cp mysql-master:dump.sql . // ๋ก์ปฌ์์ ์คํ
5.2 slave DB ์์ฑ
slave DB๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋ก์ด ์ปจํ ์ด๋ mysql-slave ์์ฑ
docker run -p 3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=1234 --link mysql-master -d docker.io/mysql
slave ์ปจํ ์ด๋๋ my.cnf ํ์ผ์ ํธ์งํด์ฃผ์
์์์ ํ๋ ๊ฒ์ฒ๋ผ vi ์ค์นํด์ค ํ ์๋์ ๊ฐ์ด id๋ฅผ ์ค์ ํด์ฃผ์.
[mysqld]
server-id=2
์ค์ ํ๋ค๋ฉด ์ ์ฉ์ ์ํด docker ์ปจํ ์ด๋๋ฅผ restart
๋ก์ปฌ ํ๊ฒฝ์ ์ฎ๊ฒจ๋๋ dump ํ์ผ์ slave ์ปจํ ์ด๋๋ก ๋ณต์ฌํ๊ณ , dump ํ์ผ์ ์ ์ฉํด์ค๋ค.
$ docker cp dump.sql mysql-slave:.
$ docker exec -it mysql-slave /bin/bash
$ mysql -u root -p
mysql> CREATE DATABASE test;
mysql> exit
$ mysql -u root -p test < dump.sql
5.3 slave๋ฅผ master์ ์ฐ๊ฒฐ
master mysql์ ์ ์ํด SHOW MASTER STATUS\G ๋ฅผ ์ด์ฉํด Position์ ํ์ธํด์ค๋ค.
ํน์ SHOW BINARY LOG STATUS ์ ์ฌ์ฉํ์ฌ ํ์ธ
์ฒ์ ํ์ธํ์ ๋ ๋ณด๋ค ์ฆ๊ฐํ๊ฑธ ํ์ธํ ์ ์๋ค.
mysql-slave ์ปจํ ์ด๋๋ก ๋์์ mysql-master๋ฅผ ๋ณ๊ฒฝํ๊ณ slave๋ฅผ ์์ํ๋ค.
mysql> CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='dgjinsu', MASTER_PASSWORD='1234', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1890;
Query OK, 0 rows affected, 8 warnings (0.04 sec)
mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.02 sec)
MASTER_HOST : master ์๋ฒ์ ํธ์คํธ๋ช
MASTER_USER : master ์๋ฒ์ mysql์์ REPLICATION SLAVE ๊ถํ์ ๊ฐ์ง User ๊ณ์ ์ ์ด๋ฆ
MASTER_PASSWORD : master ์๋ฒ์ mysql์์ REPLICATION SLAVE ๊ถํ์ ๊ฐ์ง User ๊ณ์ ์ ๋น๋ฐ๋ฒํธ MASTER_LOG_FILE : master ์๋ฒ์ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ๋ช
MASTER_LOG_POS : master ์๋ฒ์ ํ์ฌ ๋ก๊ทธ์ ์์น
slave์์ ์ฐ๊ฒฐ์ ๋ณด๋ฅผ ์กฐํํด ๋ณด๋ฉด, ์๋์ ๊ฐ์ด mysql-master์ ์ฐ๊ฒฐ๋ ์ ๋ณด๊ฐ ๋์จ๋ค.
์์์ ์๊ธฐํ๋ ๋ ๊ฐ์ง ์ค๋ ๋์ธ Slave_IO ์ Slave_SQL ์ด ์ ์์ ์ผ๋ก Running ๋๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
mysql> SHOW SLAVE STATUS\G
์ด์ Master ์ปจํ ์ด๋๋ก ๋ค์ด๊ฐ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ ์ถ๊ฐํ๋ฉด slave์์๋ ์ ๋จ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
6. SpringBoot์์ DataSource ๋ถ๊ธฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ Source - Replica ๋ก ์ด์คํ ํ์์ผ๋ฏ๋ก, ์คํ๋ง๋ถํธ์์ ์ฌ์ฉํ๋ DataSource๋ Master-Slave ์ ๋ง๊ฒ 2๊ฐ๋ฅผ ์จ์ผํ๋ค. readOnly = true ํธ๋์ญ์ ์ Slave DataSource๋ฅผ, readOnly = false ์ธ ํธ๋์ญ์ ์ Master DataSource๋ฅผ ์ฌ์ฉํ๋๋ก ๋ถ๊ธฐํด์ผํ๋ค.
application.yml
spring:
datasource:
master:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: [url]
username: [username]
password: [password]
slave:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: [url]
username: [username]
password: [password]
DataBaseConfig.class
@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) // ์คํ๋ง ๋ถํธ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์ฑ์ ๋นํ์ฑํ
@EnableTransactionManagement // ํธ๋์ญ์
๊ด๋ฆฌ๋ฅผ ํ์ฑํ
@EnableJpaRepositories(basePackages = {"test"}) // JPA ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํ์ฑํํ๊ณ , ํจํค์ง ์ค์บ ๊ฒฝ๋ก๋ฅผ ์ง์
public class DataBaseConfig {
// ๋ง์คํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ ์ํ ๋น
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
// ์ฌ๋ ์ด๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ ์ํ ๋น
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DataSourceBuilder.create().type(HikariDataSource.class).build();
}
// ๋ผ์ฐํ
@Bean
public DataSource routingDataSource(@Qualifier("masterDataSource") DataSource master,
@Qualifier("slaveDataSource") DataSource slave) {
ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource();
HashMap<Object, Object> sources = new HashMap<>();
sources.put(DATASOURCE_KEY_MASTER, master);
sources.put(DATASOURCE_KEY_SLAVE, slave);
routingDataSource.setTargetDataSources(sources);
routingDataSource.setDefaultTargetDataSource(master);
return routingDataSource;
}
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์์ค๋ฅผ ์ค์
@Primary
@Bean
public DataSource dataSource(@Qualifier("routingDataSource") DataSource routingDataSource) {
return new LazyConnectionDataSourceProxy(routingDataSource);
}
}
ReplicationRoutingDataSource.class
Spring Boot์์ MySQL Replica๋ฅผ ์ด์ฉํด ํธ๋์ญ์ ์์ ์ฝ๊ธฐ ์ ์ฉ์ slave DB์์ ์ฒ๋ฆฌํ๊ณ ,
์ฐ๊ธฐ๋ master DB์์ ์ฒ๋ฆฌํ๋๋ก ์ค์ ํด ๋ณด์.
์ด๋ฅผ ์ํด์ master, slave DB ์ค ์ด๋ DB๋ฅผ ์ ํํ๋์ง ์ค์ ํ๋ AbstractRoutingDataSource์ ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ slave DB ๊ฐ ์ปค๋ฅ์ ๋๋๋ก ํ๋ LazyConnectionDataSourceProxy์ ์ฌ์ฉํ๋ค.
AbstractRoutingDataSource๋ spring-jdbc ๋ชจ๋์ ํฌํจ๋์ด ์๋ ํด๋์ค๋ก, ์ฌ๋ฌ ๋ฐ์ดํฐ์์ค๋ฅผ ๋ฑ๋กํ๊ณ ํน์ ์ํฉ์ ์ํ๋ ๋ฐ์ดํฐ์์ค๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ถ์ํํ ํด๋์ค์ด๋ค.
determineCurrentLookupKey() ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ, ์ฝ๊ธฐ ์ ์ฉ์ผ ๊ฒฝ์ฐ slave๋ฅผ, ์๋ ๊ฒฝ์ฐ master๋ฅผ ๋ฐํํ๋๋ก ํด์คฌ๋ค.
@Slf4j
public class ReplicationRoutingDataSource extends AbstractRoutingDataSource {
public static final String DATASOURCE_KEY_MASTER = "master";
public static final String DATASOURCE_KEY_SLAVE = "slave";
@Override
protected Object determineCurrentLookupKey() {
// ํ์ฌ ํธ๋์ญ์
์ด ์ฝ๊ธฐ ์ ์ฉ์ธ์ง ํ์ธ
boolean isReadOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
String dataSourceKey = (isReadOnly) ? DATASOURCE_KEY_SLAVE : DATASOURCE_KEY_MASTER;
log.info("Selected DataSource: {}", dataSourceKey);
return dataSourceKey;
}
}
์ด๋ ๊ฒ ํธ๋์ญ์ ์ ๋ฐ๋ผ ๊ฐ์ ๋ค๋ฅธ DB๊ฐ ์ ํ๋๋๊ฑธ ํ์ธํ ์ ์๋ค.
'DB ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ์์ฐํค์ ์ธ์กฐํค ์ค ์ด๋ค๊ฑธ ๊ธฐ๋ณธํค๋ก ๋ฌ์ผ ํ ๊น? (1) | 2024.12.16 |
---|---|
[Neo4j] Graph Database๋? RDBMS์ ๋น๊ต, neo4j ๋์ ์ด์ (1) | 2024.03.27 |
[Redis] redis์์ ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅํ๋ ๋ฐฉ๋ฒ (RDB / AOF) (0) | 2024.03.09 |
[Lock] DB Lock & JPA Lock ์ฝ๋๋ก ์ดํด๋ณด์ (MySQL) (0) | 2024.02.20 |
[Index] MySQL ์ฑ๋ฅ ์ต์ ํ (+์คํ ๊ณํ) (0) | 2024.02.19 |