๐ MariaDB ๋
MariaDB๋ ์คํ ์์ค์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (RDBMS)์ด๋ค. MySQL๊ณผ ๋์ผํ ์์ค ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, GPL v2 ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฅธ๋ค. ์ค๋ผํด ์์ ์ ํ์ฌ ๋ถํ์คํ MySQL์ ๋ผ์ด์ ์ค ์ํ์ ๋ฐ๋ฐํ์ฌ ๋ง๋ค์ด์ก์ผ๋ฉฐ, ๋ฐฐํฌ์๋ ๋ชฌํฐ ํ๋ก๊ทธ๋จ AB(Monty Program AB)์ ์ ์๊ถ์ ๊ณต์ ํด์ผ ํ๋ค.[1] ์ด๊ฒ์ MySQL๊ณผ ๋์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํจ์ด๋ฉฐ, MySQL API์ ๋ช ๋ น์ ์ ํํ ๋งค์นญํ์ฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ์ด๋๋ฆฌ์ ์์ํจ์ ์ ๊ณตํ์ฌ ๊ต์ฒด ๊ฐ๋ฅ์ฑ์ ๋์ด๊ณ ์ ํจ์ด๋ค.[2] ๋ง๋ฆฌ์ DB์๋ ์๋ก์ด ์ ์ฅ ์์ง์ธ ์๋ฆฌ์(Aria)๋ฟ๋ง ์๋๋ผ, InnoDB๋ฅผ ๊ต์ฒดํ ์ ์๋ XtraDB ์ ์ฅ ์์ง์ ํฌํจํ๊ณ ์๋ค.[3] ์ด๊ฒ์ ํธ๋์ญ์ ๊ณผ ๋นํธ๋์ญ์ ์์ง ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋์ ๋์ฌ MySQL ํ์ ๋์ํ๊ณ ์ ํจ์ผ ๊ฒ์ด๋ค.[4] ๋ง๋ฆฌ์ DB์ ์ฃผ์ ๊ฐ๋ฐ์๋ MySQL๊ณผ ๋ชฌํฐ ํ๋ก๊ทธ๋จ AB๋ฅผ ์ค๋ฆฝํ ๋ชฌํฐ ์์ด๋๋์ด์ค(Michael Monty Widenius)์ด๋ค. ๊ทธ๋ ์ด์ ์ ์์ ์ ํ์ฌ, MySQL AB๋ฅผ ์ฌ ๋ง์ดํฌ๋ก์์คํ ์ฆ์ 10์ต ๋ฌ๋ฌ์ ํ๋งค๋ฅผ ํ ์ ์ด ์์ผ๋ฉฐ, ๋ง๋ฆฌ์ DB๋ ๊ทธ์ ๋์งธ ๋ธ์ธ ๋ง๋ฆฌ์์ ์ด๋ฆ์ ๋ด ๊ฒ์ด๋ค.[5]
๊ฒฐ๋ก ์ ์ผ๋ก MariaDB๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ผ๋ก, Mysql๊ณผ ๋น์ทํ๊ฒ ์คํ ์์ค์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ (RDBMS) ์ค ํ๋์ด๋ค.
๐ Replication ๋ [6]
๋ณต์ ๋ ๋ง์คํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์๋ฒ๋ก ์๋ ค์ง ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ๋ฌ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ๋ง์คํฐ ์๋ฒ๋ ๋ณต์ ์ฉ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๊ฒ ์๋ ค์ ธ ์์ต๋๋ค. ๋ณต์ ๋ ๋ฐ์ดํฐ๋ ์์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธํธ, ๋จ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ํ ์ด๋ธ์ผ ์ ์์ต๋๋ค.
๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๊ตฌ์ฑ์์ ์ฌ๋ ์ด๋ธ ์ค ํ๋์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ์ด ๋ง์ ๋ง์คํฐ ๋ ์ฝ๋์ ์๋์ผ๋ก ๋ฐ์๋๊ณ , ๊ทธ ํ ๋ชจ๋ ์ฌ๋ ์ด๋ธ๋ ๋ง์คํฐ ์๋ฒ์์ ์์ ์๋ํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๋ฅผ ์์ ํฉ๋๋ค.
๋ณต์ ์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ:
- Scalability: ํ๋ ์ด์์ ์ฌ๋ ์ด๋ธ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ฅผ ์ํํ ์ ์์ผ๋ฏ๋ก ์ฐ๊ธฐ ์์ ๋ง ์ํํ ์ ์๋ ๋ง์คํฐ ์๋ฒ์ ๋ถํ๊ฐ ์ค์ด๋ญ๋๋ค.
- Backup Assistance: ์ฌ๊ธฐ์๋ ๋ฐฑ์ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ฌ๋ ์ด๋ธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด ๋ฐฑ์ ์ด ์์ ์ ์ธ ์ํ์ ๋ ๋ฆฝ ์คํํ ์๋ฒ๋ก ์๋ํ ์ ์์ต๋๋ค.
- Data Analysis: ๋ณต์ ๊ฐ ์๋ ์ํ์์ ๋ง์คํฐ ์๋ฒ์ ์ถ๊ฐ ๋ถํ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ์ฌ๋ ์ด๋ธ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ ํ ์ ์์ต๋๋ค.
- Distribution of Data: ๋ณต์ ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์คํฐ ์๋ฒ์ ์ฐ๊ฒฐํ์ง ์๊ณ ๋ ์ด ๋ฐ์ดํฐ์ ๋ํด ๋ก์ปฌ๋ก ์์ ํ ์ ์์ต๋๋ค. ํ์ ์ฐ๊ฒฐ ์ ์ ๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๊ฐ ๋ง์คํฐ์ ๋ณํฉ๋ฉ๋๋ค.
MariaDB๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ณต์ ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ์ ์์ต๋๋ค. MariaDB์ ๋ณต์ ๋ ๋ง์คํฐ-์ฌ๋ ์ด๋ธ ๊ตฌ์ฑ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ ๋ชจ๋ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ์ํ๋๋ ๋ง์คํฐ ์๋ฒ์์ binlog๋ฅผ ํ์ฑํํฉ๋๋ค. ๋ง์คํฐ ์๋ฒ๋ ๋ชจ๋ ํธ๋์ญ์ ์ ๋ํด ๊ธ๋ก๋ฒ ํธ๋์ญ์ ID(GTID)๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฅผ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ์๋๋ค.
GTID(๊ธ๋ก๋ฒ ํธ๋์ญ์ ID)๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ๋ณต์ ํ๋ ์๋ก ๋ค๋ฅธ ์๋ฒ์์ ๋์ผํ binlog ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์์ต๋๋ค. ์ด์ง ๋ก๊ทธ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ(๋ฐ์ดํฐ ๋ฐ ๊ตฌ์กฐ ๋ชจ๋)๊ณผ ๊ฐ ๋ช ๋ น๋ฌธ์ด ์คํ๋๋ ๋ฐ ๊ฑธ๋ฆฐ ์๊ฐ์ด ํฌํจ๋ฉ๋๋ค. ์ฌ๋ ์ด๋ธ๋ ๋ณต์ ํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ๊ฐ ๋ง์คํฐ๋ก๋ถํฐ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ(binlog)๋ฅผ ์ฝ์ด์จ๋ค. ์ฌ๋ ์ด๋ธ ์๋ฒ์์๋ ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ์ ๋์ผํ ํ์์ผ๋ก ๋ฆด๋ ์ด ๋ก๊ทธ๋ฅผ ์์ฑํ์ฌ ๋ณต์ ๋ฅผ ์ํํฉ๋๋ค.
MariaDB์ ๋ณต์ ์ ํ
MariaDB๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ ์ ์์ต๋๋ค.
- Master-slave replication.
- Master-master replication.
- Multi-source replication.
- Star replication.
๐ณ Master-Slave Replication (docker)
์ด๋ฒ ํฌ์คํ ์์๋ MariaDB๋ฅผ docker๋ก Master-Slave ๊ตฌ์กฐ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ ์ผ๋จ ํ๋์ ๋๋ ํ ๋ฆฌ์ slave์ฉ ๋๋ ํ ๋ฆฌ์ master์ฉ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
## master DB์ฉ ๋๋ ํ ๋ฆฌ
mkdir master
## slave DB์ฉ ๋๋ ํ ๋ฆฌ
mkdir slave
๐ Master DB์ ํ๊ฒฝ์ค์ ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๊ฒฝ์ค์ ํ cnfํ์ผ์ master์ฉ ๋๋ ํ ๋ฆฌ์ ์์ฑํฉ๋๋ค.
## master DB์ฉ ํ๊ฒฝ์ค์ ํ์ผ
vi master/my.cnf
๊ทธ ๋ค์ my.cnf ํ์ผ ๋ด์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
[mysqld]
log-bin=mysql-bin
server-id=1
๐ Slave DB์ ํ๊ฒฝ์ค์ ์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๊ฒฝ์ค์ ํ cnfํ์ผ์ slave์ฉ ๋๋ ํ ๋ฆฌ์ ์์ฑํฉ๋๋ค.
## Slave DB์ฉ ํ๊ฒฝ์ค์ ํ์ผ
vi slave/my.cnf
๊ทธ ๋ค์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์์ฑํฉ๋๋ค.
[mysqld]
log-bin=mysql-bin
server-id=2
relay-log=relaylog
log-slave_updates=1
๐ ์ด์ Master-Slave DB๋ฅผ docker๋ฅผ ํตํด ์คํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
master DB์ container๋ฅผ ๋์ฐ๋ ๋ช ๋ น์ด๋ ์๋์ ๊ฐ์ต๋๋ค.
## ์คํ ๋ช
๋ ์ด
docker container run -d -p 13306:3306 \
-e MYSQL_ROOT_PASSWORD=root๋น๋ฐ๋ฒํธ \
-v .../master:/var/lib/mysql \
-v .../master:/etc/mysql/conf.d \
--name maria-master mariadb
## ์คํ ์์
docker container run -d -p 13306:3306 \
-e MYSQL_ROOT_PASSWORD=pwd123 \
-v /Users/Shared/data/maria/master:/var/lib/mysql \
-v /Users/Shared/data/maria/master:/etc/mysql/conf.d \
--name maria-master mariadb
-p ๋ ํฌํธ๋ฒํธ ์ค์ ์ผ๋ก ์ ๋ 13306 ๋ฒ์ ์ด์ฉํ์ต๋๋ค.
-e MYSQL_ROOT_PASSWORD ๋ ์ ์์ root์ ๋น๋ฐ๋ฒํธ ์ ๋๋ค.
-v .../master:/var/lib/mysql ๋ ๊ฐ์ข
log์ index๋ฑ์ด volume์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ ์ค์ ์
๋๋ค. (์คํ์์์ ๊ฒฝ์ฐ ์ ๊ฐ ์์์ master ๋๋ ํ ๋ฆฌ ๋ง๋ ๊ณณ์ผ๋ก ์ค์ ํ์ต๋๋ค. )
-v .../master:/etc/mysql/conf.d ๋ ์๊น ์ค์ ํ ํ๊ฒฝ์ค์ ํ์ผ์ ์์น๋ฅผ ์ค์ ์
๋๋ค. ์คํ์์์ ๊ฒฝ์ฐ ์ ๊ฐ ์์์ master ๋๋ ํ ๋ฆฌ ๋ง๋ ๊ณณ์ผ๋ก ์ค์ ํ์ต๋๋ค.)
Slave DB์ container๋ฅผ ๋์ฐ๋ ๋ช ๋ น์ด๋ ์๋์ ๊ฐ์ต๋๋ค.
## ์คํ ๋ช
๋ ์ด
docker container run -d -p 23306:3306 \
-e MYSQL_ROOT_PASSWORD=root๋น๋ฐ๋ฒํธ \
-v .../slave:/var/lib/mysql \
-v .../slave:/etc/mysql/conf.d \
--link maria-master \
--name maria-slave mariadb
## ์คํ ์์
docker container run -d -p 23306:3306 \
-e MYSQL_ROOT_PASSWORD=pwd123 \
-v /Users/Shared/data/maria/slave:/var/lib/mysql \
-v /Users/Shared/data/maria/slave:/etc/mysql/conf.d \
--link maria-master \
--name maria-slave mariadb
๐ Master DB์์ ๋ณต์ ํ database์ user๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
์ผ๋จ master DB container์ ์ ์ํฉ๋๋ค.
## master DB contianer ์ ์ (1)
mysql -u root -ppwd123 --port 13306 --host 127.0.0.1
## master DB contianer ์ ์ (2)
docker exec -it maria_master /bin/bash
>> mysql -u root -p
>>> pwd123
๊ทธ ๋ค์ database์ user๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
## ๋ณต์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ
create database repldb;
## user ์์ฑ
grant all privileges on repldb.* to repldb@'%' identified by 'replpw';
## slave ์๋ฒ์์ master ์๋ฒ์ ์ ์ํ ์ ์๋๋ก ๊ถํ ์ถ๊ฐ
grant replication slave on *.* to 'repldb'@'%';
## ์ ์ฉํ๊ธฐ
flush privileges;
์ด์ ์์ฑ๋ user๋ฅผ ํ์ธ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
## ์์ฑ๋ user ํ์ธ
use mysql;
select user, host from user;
ํ์ธํด๋ณด๋ฉด user๊ฐ repldb๋ก ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๐ Slave DB์์ user๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
์ผ๋จ Slave DB container์ ์ ์ํฉ๋๋ค.
## slave DB contianer ์ ์ (1)
mysql -u root -ppwd123 --port 23306 --host 127.0.0.1
## slave DB contianer ์ ์ (2)
docker exec -it maria_slave /bin/bash
>> mysql -u root -p
>>> pwd123
๊ทธ ๋ค์ user๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ์ต๋๋ค.
## user ์์ฑ
CREATE USER 'repldb'@'%' IDENTIFIED BY 'replpw';
## ๊ถํ ์ค์
grant all privileges on repldb.* to repldb@'%' identified by 'replpw';
## ์ ์ฉํ๊ธฐ
flush privileges;
๐ Slave DB์์ Master DB๋ฅผ ์ค์ ํ๊ฒ ์ต๋๋ค.
์ผ๋จ master DB์ File๊ณผ position๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. master์ DB์ ์ ๊ทผํ์ฌ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก ํ์ธํฉ๋๋ค.
## File, position ํ์ธํ๊ธฐ
SHOW MASTER STATUS\G
์ด์ slave DB์์ master DB๋ฅผ ์ค์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
## master DB ์ค์
CHANGE MASTER TO MASTER_HOST='maria-master', MASTER_USER='repldb', MASTER_PASSWORD='replpw', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1223;
๊ฐ ์ต์ ์ ์ค๋ช ์ ์๋์ ๊ฐ์ต๋๋ค.
- MASTER_HOST='maria-master' -> master DB์ container name
- MASTER_USER='repldb' -> ๋ณต์ ํ DB
- MASTER_PASSWORD='replpw' -> ๋น๋ฐ๋ฒํธ
- MASTER_LOG_FILE='mysql-bin.000003' -> master์ file
- MASTER_LOG_POS=1223 -> master์ position
๊ทธ ๋ค์ ์์ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. slave DB์์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
## ์์ ๋ช
๋ น์ด
start slave;
## ์ค์ ๋์ง ํ์ธํ๊ธฐ
SHOW SLAVE STATUS\G
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ Last_Errno ๋ 0, Last_IO_Errnork 0์ด๋ฉด ์ค์ ์ด ์๋ฃ๋๊ฒ ์ ๋๋ค.
์ค์ ์ ์๋ฃํ๊ฒ ๋๋ฉด ์ด์ Master container์์ ๋ณต์ ์ค์ ํ DB์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ฑฐ๋ ์ญ์ ๋๋๊ฒฝ์ฐ Slave DB์๋ ๋ฐ๋ก ์ ์ฉ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์์ต๋๋ค.
๐ Reference
์ ์ฒด์ ์ฐธ์กฐ https://lemontia.tistory.com/741
- Contributing Code Archived 2013๋ 3์ 16์ผ - ์จ์ด๋ฐฑ ๋จธ์ , AskMonty Knowledgebase
- MariaDB versus MySQL - Compatibility Archived 2013๋ 5์ 26์ผ - ์จ์ด๋ฐฑ ๋จธ์ , AskMonty KnowledgeBase
- About XtraDB Archived 2013๋ 7์ 8์ผ - ์จ์ด๋ฐฑ ๋จธ์ , AskMonty KnowledgeBase
- Aria FAQ Archived 2013๋ 6์ 16์ผ - ์จ์ด๋ฐฑ ๋จธ์ , AskMonty KnowledgeBase
- Why is the project called MariaDB? Archived 2013๋ 6์ 4์ผ - ์จ์ด๋ฐฑ ๋จธ์ , AskMonty KnowledgeBase
- https://hevodata.com/learn/mariadb-replication-easy-steps/