Database๋ฅผ ๋ง๋ค๊ณ ๋์ ํน์ ๋ชจ๋ฅผ DB์๋ฒ์ฅ์ ์ ๋๋นํ๊ธฐ ์ํ ์๋ฐฉ์ฑ ์ผ๋ก๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ์ค์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๊ณ ํจ๊ณผ์ ์ธ ๋๋น์ฑ ์ ๋ฐ๋ก ๋ฐฑ์ (backup)์ธ๋ฐ์. ๋ฐฑ์ ๋ฐฉ์์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ์์ด ์์ต๋๋ค. linux ๊ธฐ๋ฐ DB ์๋ฒ๋ผ๋ฉด ์ค์ผ์ค๋ฌ์ธ cron์ ์ด์ฉํด์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋คํํ์ผ์ ์์ฑํ ์๋ ์๊ณ ์๋๋ฉด ์ค๋ ์ ๋ฆฌํ master-slave ์ค์ ์ ํตํด์ ๋ณต์ (replication)ํ์ฌ ์ฅ์ ์ ๋๋นํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์์์ ์ธ๊ธํ๋ค์ํผ ์ค๋์ master-slave๋ฅผ ์ค์ ํด์ DB๋ฅผ ๋ฐฑ์ ํ๊ณ master๋ write๋ง, slave๋ read๋ง ํ๋ ๋ถ์ฐ์ฒ๋ฆฌ๋ฅผ ํตํด ์ฝ๊ฐ์ ์ฑ๋ฅํฅ์์ ๋ ธ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฐ์ master์ slave๊ฐ ๊ฐ์ ์๋ฒ ์ฆ, ํ๋์ ์๋ฒ์์ ๋์ํ ์๋ ์๊ฒ ์ง๋ง ๊ทธ๋ ๊ฒ๋๋ฉด ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ ๋๋ก๋ ์ญํ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ๋ฅผ ๋ณ๋๋ก ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
์ค๋น๋ฌผ
1. master ์๋ฒ
2. slave ์๋ฒ
3. ๊ฐ๊ฐ ๋์ผํ DB ๋ฐ์ดํฐ
**master ์๋ฒ๋ slave ์๋ฒ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ผํจ.
1. Master ์ค์
master์ชฝ์ ์ค์ ์ ๋จผ์ ํด์ค์๋ค.
1-1. my.cnf (mariadb ์ค์ ํ์ผ) ์์
my.cnfํ์ผ์ ์ด์ด์ [mysqld] ์๋์ server_id๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์.
...
[mysqld]
#
# * Master Settings
#
server_id = 1
...
server_id๋ฅผ my.cnf์ ์ถ๊ฐํด์ฃผ๊ณ ์ค์ ๋ก ์ ์ ์ฉ์ด ๋์๋์ง ํ์ธํด๋ด ๋๋ค.
# service mysql restart
# mysql -uroot -p
> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.001 sec)
๊ฒฐ๊ณผ๋ก ์์์ ์ค์ ํ server_id๊ฐ 1๋ก ๋์ค๋ฉด ์ ์์ ๋๋ค. ๋ง์ฝ์ ๊ฐ์ด ์ผ์นํ์ง ์๋๋ค๋ฉด ์๋์ ๊ฐ์ด ์๋์ผ๋ก server_id๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
> SET GLOBAL server_id = 1;
1-2. Replication ์ฌ์ฉ์ ๋ฑ๋ก
replication์ ํ slave ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
> grant replication slave on *.* to ์์ด๋@'%' identified by '๋น๋ฐ๋ฒํธ';
> flush privileges;
์ฌ๊ธฐ์ ์์ด๋, ๋น๋ฐ๋ฒํธ์๋ ์ฌ์ฉํ์ค ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
1-3. Master ์ ๋ณด ํ์ธ
์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด์ Slave์์ ์ง์ ํ Master์ ์ ๋ณด๋ฅผ ํ์ธํฉ๋๋ค.
> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000001 | 344 | | |
+--------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ก ๋์ค๋ File๊ณผ Position์ ๊ธฐ์ตํ์๊ฑฐ๋ ๋ฉ๋ชจํด์ฃผ์ธ์. Slave์ค์ ์ ์ฌ์ฉ๋ฉ๋๋ค.
1-4. Master ์ ๋ณด ํ์ธ ๋ถ๊ฐ (์ ๋ณด๊ฐ ๋์ค์ง ์๋ ๊ฒฝ์ฐ. Empty set)
Empty set (0.00 sec)
๋ง์ฝ์ ์์๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒฝ์ฐ log_bin์ด ๊บผ์ ธ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ log_bin์ด ์๋ต๋๋๋ก my.cnf์ ์ค์ ๋์ด์์ง๋ ์์์ง ์๋๋ฉด ์์ ์ค์ ์ด ์ ๋์ด์๋ ๊ฒ์ ์๋์ง ํ์ธํ์๊ณ ์ค์ ํ์ผ์ ์์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
MariaDB [(none)]> show variables like '%log_bin%';
+---------------------------------+----------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------+
| log_bin | OFF |
| log_bin_basename | /var/log/mysql/mariadb-bin |
| log_bin_compress | OFF |
| log_bin_compress_min_len | 256 |
| log_bin_index | /var/log/mysql/mariadb-bin.index |
| log_bin_trust_function_creators | OFF |
| sql_log_bin | ON |
+---------------------------------+----------------------------------+
7 rows in set (0.00 sec)
log_bin์ด OFF๋ก ๊บผ์ ธ์๋๊ฒ ํ์ธ์ด ๋์์ต๋๋ค. my.cnf ํ์ผ์ ๋ค์ ์ด์ด์ [mysqld] ์์ญ์ log_bin ๊ฒฝ๋ก๋ฅผ ์ ํ ํด์ฃผ๊ฑฐ๋ ๋ฐ์ skip_log_bin์ด ์ค์ ๋์ด์์ง ์์์ง ํ์ธํ์๊ณ ์์ ํ ํ์ mysql restart ํด์ฃผ์๋ฉด ํด๊ฒฐ๋ฉ๋๋ค.
my.cnf ์์
[mysqld]
...
# log_bin = mysql-bin -> ์ฃผ์์ฒ๋ฆฌ๋์ด์๊ฑฐ๋ ์์ ์๋๊ฒฝ์ฐ ์ถ๊ฐํด์ฃผ์ด์ผํจ
skip_log_bin -> ์ ๊ฑฐํด์ฃผ์ด์ผํจ
...
2. Slave ์ค์
Master ์ค์ ์ ๋ง์ณค๋ค๋ฉด ์ ๋ฐ์ ์ฑ๊ณตํ์ ๊ฒ๋๋ค. ์ด์ด์ Slave๋ ์ค์ ํด์ฃผ์ธ์.
2-1. my.cnf ์์
Master์ ๋ง์ฐฌ๊ฐ์ง๊ณ my.cnfํ์ผ์ ์ด์ด์ [mysqld] ์๋์ server_id ๋ฐ slave ์ ๋ณด๋ฅผ ์ค์ ํด์ฃผ์ธ์.
...
[mysqld]
#
# * Slave Settings
#
server_id = 2
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
...
my.cnf ์์ ํ ๋ด์ฉ์ ์ ์ฉ์ํค๊ธฐ ์ํด์ mysql๋ฅผ restartํด์ฃผ๊ณ server_id๋ฅผ ํ์ธํด์ค์.
# service mysql restart
# mysql -uroot -p
> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 2 |
+---------------+-------+
1 row in set (0.001 sec)
Master์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋๋ก ์ค์ ๋์ด์์ง ์๋ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ํตํด ์๋์ผ๋ก ์ค์ ํด์ค์.
> SET GLOBAL server_id = 2;
2-2. Master ์ ์ ์ ๋ณด ์ค์
Slave์์ Master๋ก ์ ์ํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ฟผ๋ฆฌ๋ฅผ ํตํด์ ์ค์ ํด์ค์.
** ์ฌ๊ธฐ์ ์์์ Master ์ค์ ์ ๊ธฐ์ตํ๊ฑฐ๋ ๋ฉ๋ชจํ๋ ์ ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
> CHANGE MASTER TO MASTER_HOST='Master์๋ฒ IP',
MASTER_USER='์์ด๋',
MASTER_PASSWORD='๋น๋ฐ๋ฒํธ',
MASTER_PORT=Master DB Port,
MASTER_LOG_FILE='์์์ ํ์ธํ File',
MASTER_LOG_POS=์์์ ํ์ธํ Position,
MASTER_CONNECT_RETRY=10;
๋ณด๊ธฐ ํธํ๊ฒ ๊ฐํํ์์ต๋๋ค. ์ ๋ ฅํ์ค๋์๋ ํ์ค์ ์ ๋ ฅํ์ ๋ ๋ฌด๋ฐฉํฉ๋๋ค.
Master-slave ์ค์ ๋ถ๋ถ์ค์ ๊ฐ์ฅ ๋ณต์กํ ๋ถ๋ถ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ฟผ๋ฆฌ์์ MASTER_HOST๋ Master ์๋ฒ์ IP๋ฅผ ์ ๋ ฅํด์ฃผ์๋ฉด ๋๊ณ
MASTER_USER์๋ Master์ค์ ์ replication salve ๊ณ์ ์ ์์ด๋๋ฅผ MASTER_PASSWORD์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
MASTER_LOG_FILE๊ณผ MASTER_LOG_POS์ Master ์ค์ ์ show master status; ์ฟผ๋ฆฌ๋ก ํ์ธํ๋ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ์ ๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก MASTER_CONNECT_RETRY๋ ์ฐ๊ฒฐ ์๋ ํ์๋ฅผ ์ง์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ 10๋ฒ์ผ๋ก ์ง์ ํ์์ต๋๋ค.
์๋ฅผ๋ค๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='45.119.144.73',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='repl_pw',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='mariadb-bin.000001',
-> MASTER_LOG_POS=344,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.01 sec)
์ค์ ์ ๋ง์ณค์ผ๋ฉด slave๋ฅผ ๊นจ์๋ด ์๋ค.
2-3. Slave start (์์)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
2-4. Slave ๋์ ํ์ธ
์ ๋๊ฑด์ง ํ์ธํด๋ณด๊ธฐ ์ํด ์๋ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Queueing master event to the relay log
Master_Host: <host>
Master_User: <user>
Master_Port: <port>
Connect_Retry: 10
Master_Log_File: mariadb-bin.000004
Read_Master_Log_Pos: 105184981
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 53169888
Relay_Master_Log_File: mariadb-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 53169975
Relay_Log_Space: 210825132
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 3453
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: optimistic
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Update
Slave_DDL_Groups: 297
Slave_Non_Transactional_Groups: 3
Slave_Transactional_Groups: 31
1 row in set (0.425 sec)
Slave_I/O_Running: Yes
Slave_SQL_Running: Yes
์์ 2๊ฐ ํญ๋ชฉ์ด ๋ชจ๋ Yes์ด๊ณ Slave_I/O_State: Waiting for master to send event ์ด๋ฉด ์ ์์๋ํ๋ ์ค์ ๋๋ค.
์ด์ master์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด slave์ ๋ฐ์ดํฐ ๋ํ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ ์คํธ ํด๋ณด์๋ฉด ํ์ธํ์ค ์ ์์ต๋๋ค.
๋ง์ฝ์ slave๊ฐ ์ ๋๋ก ๋์ํ์ง ์๋ ๊ฒฝ์ฐ show slave status\G; ์ฟผ๋ฆฌ๋ฅผ ํตํด์ ์๋ฌ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Last_IO_Errno
Last_IO_Error
Last_SQL_Errno
Last_SQL_Error
์ด 4๊ฐ์ ํ๋๋ฅผ ํ์ธํด๋ณด์๋ฉด ๋ฉ๋๋ค.
์ฐธ๊ณ