2022. 11. 29. 04:07ใSystem ์์ ์ค/DBMS
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ ๋ชฉ์ฐจ
โ [Infra] Maria DB(MySQL) ์ด์คํ(Replication) ๋จ๋ฐฉํฅ ๊ตฌ์ฑ
โ [Spring Boot][MariaDB] ์ด์คํ๋ Data Base ์ด๊ธฐ ๊ตฌ์ฑ
๐ Maria DB(MySQL) ์ด์คํ
๐ฝ ๊ฐ์
๐ฆ ์๊ฐ
์ฃผ๋ํ๋์ด ํ์ฌ ์งํํ๊ณ ์๋ ๋ชจ์์์ Data Base๋ฅผ ์ด๋ค ๊ฒ์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ง ๊ณ ๋ฏผํ๊ณ , Maria DB๋ฅผ ์ ํํ๊ธฐ๋ก ํ์์ด์.
๊ทธ๋ฐ๋ฐ, ํ์
์์๋ Data Base ๋ถํ๋ฅผ ๋ง๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง ์์
์ ํ๊ฒ ๋๋๋ฐ, ๋ชจ์์ ์ผ๋จ Data Base ์ด์คํ๋ฅผ ํตํด ๊ฐ๋ฐ ํ๊ฒฝ์์์ ๋ถํ๋ฅผ ๋ง์๋ณด๋ ๊ฒ์ผ๋ก ๊ฒฐ์ ์ ํ์์ด์.
์ฐจํ ์ด์ ํ๊ฒฝ Data Base๋ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ์์ง ์ ํด์ง์ง ์์์ง๋ง, Data Base ์ด์คํ๋ฅผ ํตํด Back End์์ ์ด๋ป๊ฒ ์ด์คํ๋ Data Base๋ฅผ ์ด์ฉํ ์ ์์์ง์ ๋ํด ๊ณ ๋ฏผํ๊ณ , ๊ณต๋ถํ๊ณ ์ ์ฉํด ๋ณด๋ ์๊ฐ์ ๊ฐ์ผ๋ ค๊ณ ํด์.
MariaDB (MySQL) Replication(๋ณต์ )๋?
Replication์ ๋ณต์ ๋ฅผ ๋ปํ๋ฉฐ, 2๊ฐ ์ด์์ DBMS๋ฅผ ๋๋ ๊ฐ๊ฐ์ Data๋ฅผ ๋๋ ์ ์ฅํ๋ ๋ฐฉ์์ด์์.
์ด ๋, ๊ฐ๊ฐ์ DBMS๋ Master - Master ํน์ Master - Slave ํํ๋ก ๊ตฌ์ฑํ ์ ์๋ ๊ฒ์ด์์.
๋ํ, ์ด๊ฒ์ ๋น๋๊ธฐ ๋ณต์ ๋ฐฉ์์ ์ด์ฉํ๊ฒ ๋๊ณ , Master์ Slave์ ๊ฐ๊ฐ ๊ณ ์ ๋ฒํธ๋ฅผ ์ง์ ํ์ฌ ์ด ๊ณ ์ ๋ฒํธ๋ฅผ ํตํด ์๋ก๋ฅผ ์ธ์ํ์ฌ ์๋ํ๊ฒ ํด์ผ ํด์.
๐ก ์ฐธ๊ณ ์ฌํญ
Master DBMS ์ญํ :
WAS(Web Application Server)์์ ์ฝ์ / ์์ / ์ญ์ ์์ฒญ์ Binary Log๋ฅผ ๋ง๋ค์ด Slave Server๋ก ๋ณด๋ด๋ ์ญํ .
Master๋ WAS๋ก๋ถํฐ ์์ฒญ๋ Data ์ฝ์ / ์์ / ์ญ์ ๊ธฐ๋ฅ์ ํ๋ ํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์
Slave DBMS ์ญํ :
Master DBMS๋ก ๋ถํฐ ์ ๋ฌ ๋ฐ์ Binary Log๋ฅผ ํตํด ์ค์ DB๋ด์ Data๋ฅผ ๊ตฌ์ฑ
Slave๋ WAS๋ก๋ถํฐ ์์ฒญ์ ํตํด Data๋ฅผ ๋ถ๋ฌ์ค๋ (Select) ์ฒ๋ฆฌ๋ฅผ ์ํด ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์
์ต์ด Master DBMS์ Insert / Update ๋ฑ์ Event๊ฐ ๋ฐ์ํ๋ ์ฆ์ Slave Server์ ๋ณ๊ฒฝ๋ Data ๋ด์ฉ์ด ๋ด๊ธด Binary Log๋ฅผ ์ ๋ฌํ๊ฒ ๋์. ์ด๋ฌํ ๊ณผ์ ์ผ๋ก ์ ์ชฝ DBMS๋ฅผ ๋์ผํ Data๊ฐ ์กด์ฌํ๋๋ก Syncํ ์ ์๊ณ , Master๊ฐ ์ฅ์ ๊ฐ ๋๊ฒ ๋๋ฉด Slave ์๋ฒ๋ก ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ์ฒ๋ฆฌํ ์๋ ์์ด์.
ํ์ง๋ง, ์ฃผ๋ํ๋์ด ์ด์คํ๋ฅผ ํ๋ ค๋ ์ด์ ๋ ์์ ๊ฐ์ ์ด์ ๋ ์์ง๋ง, ํ DBMS์ ๋ถํ๊ฐ ์ง์ค๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ๊ธฐ ๋๋ฌธ์ด์์.
Binary Log๋?
binarylog๋ binlog๋ผ๊ณ ๋ ๋ถ๋ฅด๊ณ ์์ด์.
MariaDB(MySQL)์์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ด์ญ์ ๊ธฐ๋กํ๋ Log File์ด๊ณ , ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ ๋์ด ์๋๋ฐ, ์ด๋ฅผ ํ์ฑํ ์์ผ์ฃผ์ด์ผ ํด์.
๋ณต์ ๋ฐฉ์
STATEMENT : SQL๋ฌธ ๋ณต์ฌ
ROW - ๋ณ๊ฒฝ๋ row๋ง ๋ณต์ฌ
MIXED - ๋๊ฐ์ง ๋ฐฉ์ ํผ์ฉ
User๋ฅผ WAS๋ผ๊ณ ์๊ฐํ๊ณ , ์ต์ด ์ด์ฉ์๊ฐ Web์ ํตํด ์ด๋ค ์์ฒญ์ ํ๊ฒ ๋๋ฉด ํด๋น ์์ฒญ์ WAS๋ก ์ ๋ฌ๋๊ฒ ๋๊ณ , WAS๋ Query๋ฅผ ๋ง๋ค์ด Master DBMS์ ์ ๋ฌํ๊ฒ ๋ ๊ฑฐ์์. ๊ทธ๋ฆฌ๊ณ ๋ณ๊ฒฝ์ฌํญ์ Binary Log๋ก ๋ง๋ค์ด Slaver Server์ ์ ๋ฌํ๊ฒ ๋๊ณ , ์ด๋ฅผ ํตํด Data Sync๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด์์.
Maria DB(MySQL) ๋จ๋ฐฉํฅ ์ด์คํ
์ด์ฉ์๊ฐ ๋ง๊ฒ ๋๋ฉด ์์ฒญ๋๊ฒ ๋ง์ ์์ฒญ์ด ๋ค์ด์ค๊ฒ ๋ ๊ฒ์ด๊ณ ,
์ด๊ฒ์ ๋ชจ๋ Server์ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ฒ ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๊ฒ ๋์.
์ด ๋, DBMS์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด MariaDB (MySQL)
Replication์ ์ด์ฉํ์ฌ ๊ฐ์ DB๋ฅผ ์ฌ๋ฌ ๋๋ก ๋ถ์ฐํ์ฌ ๋ถํ ๋ถ์ฐ์ ํ ์ ์๋ ๊ฒ์ด์์.
โ Data Base ์ฌ์ฉ์ ํน์ WAS๋ Insert, Update, Delete ๋ฑ์ผ๋ก Data ๋ณ๊ฒฝ ์์ฒญ์ ์ํ Query๋ฅผ ์ ๋ฌ.
โ Master DBMS๋ Binary Log์ Data ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก.
โ Connection Thread๋ DB Storage ์์ง์ Commit ์ํ.
โ Slave๊ฐ I/O Thread๋ฅผ ํตํด Master์๊ฒ Event ์์ฒญ ์ Master์ Binary Log Dump Thread(Master Thread)๋ฅผ
ํตํด Binary Log๋ฅผ ์ ์ก.
โ Slave๋ ์ ์ก ๋ฐ์ File์ Relay Log์ ๊ธฐ๋ก.
โ Slave๋ SQL Thread๋ฅผ ํตํด Storage ์์ง์ ๋ณ๊ฒฝ ์ฌํญ ๊ธฐ๋ก.
Maria DB(MySQL) ์๋ฐฉํฅ ์ด์คํ
Maria DB๋ฅผ ์ด์คํ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ด ์ธ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง, ๋ํ์ ์ผ๋ก๋ ํฌ๊ฒ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ์์ด์.
์ฌ๊ธฐ์ ์ฃผ๋ํ๋์ ๋ชจ์์ ํ๊ฒฝ์ ๋ง๋ ์ด์คํ๋ฅผ ๊ณ ๋ฏผํด ๋ณด์๊ณ , ๊ตณ์ด ๋ ๊ฐ์ Data Base์ ์ฝ๊ธฐ / ์ฐ๊ธฐ ๋ชจ๋ ์์
์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ฒ๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋จ๋ฐฉํฅ ์ด์คํ๋ฅผ ๊ตฌํํ๊ธฐ๋ก ๊ฒฐ์ฌํ์์ด์.
โป ์ฃผ์์ฌํญ
ํธํ์ฑ์ ์ํด Replication์ ์ด์ฉํ๋ ๋ชจ๋ DBMS๋ ๋์ผํ ํ๊ฒฝ์ผ๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
Replication์ ์ด์ฉํ๋ DBMS Version์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒฝ์ฐ Slave Server๊ฐ Master Server๋ณด๋ค ์์ Version์ด์ฌ์ผ ํฉ๋๋ค.
Replication ๊ธฐ๋ ์ Master Server๋ถํฐ ์ฌ๋ฆฌ๊ณ , Slave๋ฅผ ์ฌ๋ ค์ผ ํฉ๋๋ค.
๋ํ, Replication์ ์ด์ฉํ๊ฒ ๋๋ฉด ๊ณ์์ ์ผ๋ก Binary Log๊ฐ ์์ด๊ฒ ๋๊ณ , ์ด๋ ๊ฒฐ๊ตญ Storage ์ฉ๋์ ์ก์๋จน๋ ์์ธ์ด ๋์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Cron์ ์ด์ฉํด์ ์ ๋ฆฌ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๊ฑฐ๋, my.cnf์ expire_logs_days์ Log์ ๋ํ ์ ํจ๊ธฐ๊ฐ์ ์ง์ ํด ์ฃผ์ด์ผ ํด์.
Replication ๊ณผ์ ์์ Error๊ฐ ๋ฐ์ํ๋ฉด Slave๋ Error Log๋ฅผ ์์ฑํ๊ฒ ๋์.
๋์ค์ Server ๊ด๋ฆฌ์ ๋ฑ์ด Error๋ฅผ ์ถ์ ํ์ฌ Binary Log๋ฅผ ๋ถ์ํ์ฌ ์ ์ค๋ ์๋ฃ๋ฅผ ๋ณต๊ตฌํ ์ ์๋๋ก ํ ์ ์๋ต๋๋ค.
๐ฝ Master Server
๐ฆ Version ํ์ธ
์ต์ด Master DBMS์ ์ค์ ์์
์ ํด์ค๊ฒ์.
๋จผ์ ํด๋น DBMS Version์ ํ์ธํด ๋ณด์์ด์.
ํด๋น DBMS๋ Synology NAS์์ Docker Service๋ฅผ ์ด์ฉํด ๊ตฌ์ถํ Maria DB์์.
๐ฆ ์ค์
# Data Base ์์ฑ
create database test_replication character set utf8;
# Replication์ ์ํ ๊ณ์ ์์ฑ
grant replication slave on *.* to 'repl_adm'@'%' identified by '{๊ณ์ ๋น๋ฐ ๋ฒํธ}';
์ด๋ ๊ฒ DB๋ฅผ ๋ง๋ค๊ณ , ๊ณ์ ์ ๋จผ์ ๋ง๋ค์ด ์ฃผ์ด์ผ ํด์.
๋ค์์ ํด๋น DBMS์ OS์์ ์์
์ ํด๋ณด๋ ค ํด์.
[mysqld]
log-bin = mysql-bin
server-id = 1
binlog_format = row
expire_logs_days = 90
์์ ๊ฐ์ด 32 ~ 36๋ฒ์งธ ์ค์ ๋ฃ์ด์ฃผ์์ด์.
๐ก ์ฐธ๊ณ ์ฌํญ
mysql-bin : Binary log File Name
server-id : master์ Slave์ ๊ฐ๋ง ๋ค๋ฅด๋ฉด ์ด๋ค ๊ฐ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅ
binlog_format : ์ด์คํ ์ ํ ์ ํ (STATEMENT, ROW, MIXED ์ค ์ ํ)
expire_logs_days : Binary Log ๋ณด๊ด ๊ธฐ๊ฐ ์ค์
๊ทธ๋ฐ ๋ค MariaDB Deamon์ ์ฌ ๊ธฐ๋ํ์ฌ ์ฃผ์์ด์.
์ฃผ๋ํ๋์ ํ์ฌ Master DBMS๋ฅผ Synology NAS Docker์ ๋์ด ๊ฒ์ด์์.
๊ทธ๋ฐ๋ฐ ์์ ๊ฐ์ด ์ฌ๊ธฐ๋์ ๋ฌธ์ ๊ฐ ์์ด Synology NAS์์ ์ง์ ์ฌ๊ธฐ๋์ ํด์ฃผ์์ด์.
์์ ๊ฐ์ด Binary Log๊ฐ ์
๋ ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
File๋ช
๊ณผ Position์ ์ ๊ธฐ๋กํด๋์ด์ผ ํด์.
๋ํ, Data Base ์ฌ ๊ธฐ๋ ์ File๋ช
๊ณผ Position ๋ฒํธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์ ์ ์์ผ๋ฉด ์๋์.
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
๐ฝ Slave Server
๐ฆ Version ํ์ธ
์ด๋ฒ์๋ Slave Server๋ฅผ ๊ฐ์ง๊ณ ๋์๋ณด๋ ค๊ณ ํด์.
์ต์ด Version ๋ถํฐ ํ์ธํด ๋ณผ๊ฒ์.
Master DBMS์ ๋์ผํ Version์ผ๋ก ๋ง์ถ๊ณ ์์
์ ํ๋ ์ค์ด์์.
ํด๋น DBMS๋ Laptop์ CentOS 7 Version์ ์ฌ๋ฆฌ๊ณ , ๊ตฌ์ถํ Maria DB์์.
์ด ์๋ฒ์์๋ Docker๋ฅผ ์ด์ฉํ์ง ์์์ด์.
[mysqld]
log-bin = mysql-bin
server-id = 2
binlog_format = row
expire_logs_days = 90
ํด๋น Server๋ Master์ ๋ค๋ฅด๊ฒ my.cnf ์์น๊ฐ etc Directory ๋ฐ๋ก ์์ ์์์ด์.
์๋ฌด๋๋ Docker๋ฅผ ๋ง๋ ์ฌ๋์ด ์กฐ์ ์ ํด์ ๊ทธ๋ฐ๊ฐ๋ด์.
Slave๋ ๋ง์ฐฌ๊ฐ์ง๋ก 12 ~ 16๋ฒ์งธ๊น์ง ์ถ๊ฐํด ์ฃผ์์ด์.
๋ค๋ง, Master์ ๋ค๋ฅธ ๋ถ๋ถ์ server-id ๋ถ๋ถ์ธ๋ฐ, ๋ฐ๋์ Master์ ๋ค๋ฅธ ๋ฒํธ๋ฅผ ๊ธฐ์
ํด ์ฃผ์ด์ผํด์.
MariaDB Deamon์ ๋ค์ ์ฌ ๊ธฐ๋ํ์ฌ ์ฃผ์์ด์.
MariaDB์ root ๊ณ์ ์ผ๋ก ์ ์์ ํด ์ฃผ์์ด์.
์ฃผ๋ํ๋์ root ๊ณ์ ์ด ์ธ๋ถ์์ ์ ์ํ์ง ๋ชปํ๋๋ก ํ๊ธฐ ๋๋ฌธ์
SQL Tool์ ์ด์ฉํด์ ๋ถ์ ์ ์์ด CLI๋ก ์ง์ ์์
์ ํ๋ คํด์.
change master to
-> master_host="192.168.100.1",
-> master_user="{๊ณ์ ์ด๋ฆ}",
-> master_password="{๊ณ์ ๋น๋ฐ๋ฒํธ}",
-> master_port={MariaDB Port ๋ฒํธ},
-> master_log_file="{Master DBMS Binary Log File Name}",
-> master_log_pos={Master DBMS Binary Log Position ๋ฒํธ};
์์ ๊ฐ์ด Master์ ์ฐ๊ฒฐ์ ์ํ Query๋ฅผ ์์ฑํด ์ฃผ์์ด์.
์์ Query๋ก Slave ๋์์ ์คํํด ์ฃผ์์ด์.
์์ ๊ฐ์ด ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ด์.
๋ง์ฝ ์์ ๊ฐ์ด Last_IO_Error์ Error๋ฌธ์ด ๋์จ๋ค๋ฉด Master Server์์ ์ฐ๊ฒฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด์์.
์ฃผ๋ํ๋์ Port ๋ฒํธ๋ฅผ ๋ฐ๊ฟจ๋๋ฐ, ๊ธฐ์กด Port๋ฒํธ๋ฅผ ์ด์ฉํ๊ณ , IP๋ฅผ ์๋ชป ์
๋ ฅํด์ ๋์ค๋ ๋ฌธ์ ์์ด์.
์ฃผ๋ํ๋์ ์์ ๊ฐ์ด Project์์ ์ฌ์ฉํ DB๋ฅผ ๋ง๋ค์ด ์ฃผ์์ด์.
DB๋ ์ ์์ ์ผ๋ก ์ ๋ง๋ค์ด์ก์ด์.
Slave DBMS์์๋ ์์ ๊ฐ์ด ๋ง๋ค์ด ์ง๊ฒ์ ํ์ธํ ์ ์์ด์.
๋ค์ Master์์ DB์์ Table์ ํ๋ ๋ง๋ค์ด ์ฃผ์์ด์.
๊ทธ๋ฆฌ๊ณ ์์ ๊ฐ์ด ๊ฐ์ ๋ฃ์ด์ค๋ดค์ด์.
๊ณผ์ฐ Slave์๋ ์๊ฒผ์๊น์?
์์ ๊ฐ์ด Slave์๋ ๋์ผํ ๊ฐ์ด ๋์ค๋ ๊ฑธ ํ์ธํ ์ ์์ด์.
์์
์ฑ๊ณต์ด์์!
์ด๋ ๊ฒ ํ๋ฉด DB ๋ฟ๋ง ์๋๋ผ, ์ฌ์ฉ์ ๊ณ์ ๋ ๋ชจ๋ Master์์๋ง ๋ง๋ค๋ฉด ๋ฐ๋ก Slave๋ก Syncํ ์ ์์ด์.
์ด์ Data Base ์ด์คํ๋ฅผ ํด ๋ณด์์ผ๋ ๋ค์์๋ BackEnd ๊ฐ๋ฐ์ ๋ต๊ฒ
Spring Boot์์ ์ด์คํํ Data Base๋ฅผ ์ค์ ํ๊ณ , ๊ฐ์ง๊ณ ๋์๋ณผ๊ฒ์.
๐ง ์ฐธ๊ณ ์๋ฃ
"์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ต๋๋ค."
'System ์์ ์ค > DBMS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Infra - Synology NAS Docker] Ubuntu 22.04 - PostgreSQL 12 ์ค์น (0) | 2022.12.18 |
---|---|
[MariaDB] ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ (0) | 2021.01.19 |