MySQL Replication 구성 방법

2020. 04. 24 | 블로그

안녕하세요 디딤365입니다.

DBMS의 이중화는 중요하며 이벤트 등 접속자 증가를 위한 또는 백업을 위해 널리 사용할 수 있습니다. MySQL의 이중화 방법으로는 여러가지 방법이 있지만 대표적으로 많이 사용되는 MySQL의 Replication 구성 방법을 소개하려 합니다.

MySQL Replication은 오픈소스를 활용하여 별도의 비용 없이 구성 가능하다는 장점이 있습니다.

MySQL Version : MySQL 5.0 이상

구성정보 : Master(Write, Read) / Slave (Read only)

Master 역할 : 데이터 [생성/변경/수정] 시 Binary log를 생성하여 Slave 서버에 전달합니다. 주로 Write 용으로 사용됩니다.

Slave 역할 : Master에게 전달받은 Binary log를 읽어 DB에 반영합니다. 주로 Read 용으로 사용됩니다.

1. Master 서버설정

• Slave 계정 생성하기

mysql> CREATE USER 'slave'@'Slave server IP' IDENTIFIED BY '패스워드';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'Slave server IP' IDENTIFIED BY '패스워드';
mysql> flush privileges;

• my.cnf 편집하기

# vi /etc/my.cnf – (MySQL5.5 이하)
[mysql]
log-bin=mysql-bin.log
server-id = 1
binlog_do_db = DB명 -- Replication 진행 할 DB 명
max_binlog_size = 100M
expire_logs_days = 10
binlog-ignore-db=mysql  -- 바이너리 로그 제외 DB
binlog-ignore-db=information_schema  -- 바이너리 로그 제외 DB
binlog-ignore-db=performance_schema  -- 바이너리 로그 제외 DB
#log_bin_trust_function_creators=1  -- function 가능하도록 설정
#binlog_format=mixed

# vi /etc/my.cnf – (MySQL5.6 이상)
[mysql]
log-bin=mysql-bin.log
server-id = 1
expire_logs_days = 10 -- 로그 보관 주기
max_binlog_size = 100M

※ MySQL5.6부터는 [binlog_do_db] 설정을 넣지 않아도 모든 DB가 Replication 자동으로 반영됩니다.

2. Master 데이터 백업

Master DB 백업`
# mysqldump -u root -p DB명 > DB명.sql  - 데이터베이스를 Dump 하여 백업
• Master의 Replication 정보 조회
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     120  | DB명         |                  |                   |
+------------------+----------+--------------+------------------+-------------------
1 row in set (0.00 sec)
- 위 상태의 File 값과 Position 값을 꼭 기억해 줘야 합니다. 
  Replication은 File에 기재된 binary log와 Position 값으로 Master / Slave 동기화가 진행됩니다.
- File : mysql-bin.000001
- Position : 120

3. Slave 설정하기

• my.cnf 편집하기

#vi /etc/my.cnf – (MySQL5.5 이하)
[mysql]
server-id=2 – ID의 경우 Master 에서 설정한 값과 달라야 합니다. 
replicate-do-db = DB명 -- Replication 진행 할 DB 명
read_only = 1 -- 읽기 전용으로 설정 (쓰기 불가능)
max_binlog_size = 100M
expire_logs_days = 10 -- 로그 보관 주기

# vi /etc/my.cnf – (MySQL5.6 이상)
[mysql] 
server-id = 2
read_only = 1 -- 읽기 전용으로 설정 (쓰기 불가능)
max_binlog_size = 100M
expire_logs_days = 10 -- 로그 보관 주기

※ MySQL5.6부터는 [replicate-do-db] 설정을 넣지 않아도 모든 DB가 Replication 자동으로 반영됩니다.

4. Slave 설정, Master dump(백업)파일 복원 (Master / Slave 데이터 동기화)

# mysql -u root -p DB명 < DB명.sql (Master 데이터 복원)
mysql> stop slave;  -- slave 중지
mysql> CHANGE MASTER TO MASTER_HOST='Master Server IP', MASTER_USER='slave', MASTER_PASSWORD='패스워드', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=120; 
mysql> start slave;

# /etc/init.d/mysqld restart (DB 재시작)

5. Slave 에서 Replication 적용 여부 확인하기

• slave

mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
                  Master_Host: master server IP
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 120
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 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: 120
              Relay_Log_Space: 120
              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: 0
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
1 row in set (0.00 sec)

– [Slave_IO_Running / Slave_SQL_Running] 두개의 값이 “YES” 상태일 경우 정상적으로 Replication 설정이 된 것입니다.

이제 DB생성과 계정생성을 포함한 Master DB에 데이터가 쌓일 경우 실시간으로 Slave와 동기화 진행되며 MySQL Replication은 구성에 따라 [Master/Master], [Master/Slave], [Master/Slave/Slave] 등 여러 구성을 할 수 있습니다.

작성 : 시스템통합운영센터 3팀 정지훈 팀장

편집 : 전략사업본부 마케팅팀 조항준 주임