MySQL

MySQL Replication 구현해보기 Master & Replica(Slave)

WOOOOJI 2023. 2. 9. 10:24

웹개발 프로젝트를 진행하고 있는데, 멘토님으로부터 피드백을 받아 DB를 이중화를 시켜서 장애 발생시의 경우를 처리할 수 있게,

Replication을 해보는게 어떻게 냐는 피드백을 받아 한번 진행해봤습니다.

 

 

MySQL Replication(복제)

replication이란 말에서 알수 있듯이 복제를 하겠다는 의미를 가지고 있습니다.

2대 이상의 DBMS나눠서 데이터를 저장하는 방식이며, 최소한의 구성은 Master/Slave 입니다.

여기서 Slave라는 단어는 정치적으로 부적절한 단어여서 앞으로는 Replica 라고 부르겠습니다 !

(실제로 mysql에서의 GRANT시에 slave라는 단어는 권장하지 않는다고 warning을 띄워주고 있습니다)

 

 

 

 

그렇다면 Master/Replica의 역할은 뭘까요?

Master DBMS:

웹서버에서 보내는 요청중 수정/등록/삭제에 대항 요청시 바이너리로그를 생성하여 Replica서버에 전송합니다.

 

 

Replica DBMS:

Master DBMS로 부터 전달받은 바이너리 로그를 자신의 데이터로 반영하게 됩니다. (복제)

보통 요청이 많은 읽기를 담당하게 됩니다.

 

 

 

 

 

 

 

MySQL Replication 주의사항

조심해야될 몇가지 부분들이 존재합니다.

 

  • Mysql의 버전을 Master와 Replica를 동일하게 가져가는게 좋습니다 (호환성)
  • 만약에 버전이 다른경우 Replica서버가 상위 버전이여야 합니다.
  • Replication을 구동시에 무조건 Master -> Replica 순으로 진행해야합니다.

 

 

 

 

 

MySQL Replication 구현해보기

Master와 Replica의 구성은 위와 같이 등록/수정/삭제는 Master서버로, 읽기는 Replica서버가 담당하게 구성화 해보도록 하겠습니다.

 

저는 NCP에서 2개의 DB서버를 설계하여 사용했습니다.

 

 

 

 

1. MySQL DB, 계정생성 및 권한 설정

1. 일단은 DB를 먼저 생성해줍니다 (root계정으로 접속하였습니다)

mysql> CREATE DATABASE repl_db DEFAULT CHARACTER SET utf8;

mysql> CREATE USER user22@'%' IDENTIFIED BY 'qwe123';

mysql> GRANT ALL PRIVILEGES ON repl_db.* TO user22@'%' IDENTIFIED BY 'qwe123';

2. 계정을 하나 생성해주고, 모든 권한을 부여해줍니다.

 

 

 

 

3. Replication를 진행할 계정을 생성합니다.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'qwe456';

 

 

2. MySQL 설정 (my.cnf)

my.cnf파일을 들어가 아래내용을 추가해줍니다.

 

 

vi에디터로 수정해줍니다.

들어가는법 -> vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin
server-id=1

여기서 server-id 는 데이터베이스의 고유번호이며 Master가 1번을 담당하고 그 이외에 DB는 아무숫자나 지정하셔도 상관없습니다.

 

 

 

 

3. MySQL 재시작

$ systemctl restart mysqld

 

 

 

4. Master 서버 정보 확인

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 |     287 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

 

여기서 2가지만 기억하시면 됩니다.

File에 해당되는 로그파일명과 Position에 해당되는 로그 파일내 읽을 위치입니다.

즉 mysql-bin.000010과 287를 기억해두세요!!!

 

 

5. 동기화할 DB를 dump(백업) 파일로 추출합니다.

mysqldump -u root -p -user22 repl_db > repl_db.sql

생성된 dump파일을 이제 Replica DB가 있는 서버로 전송해주면 됩니다.

 

scp -P 22 repl_db.sql root@xxx.xx.xxx.xxx:/root

 

 

 


 

 

Master는 준비 끝! 자 이제 Replica쪽으로 가봅시다.

위 과정과 동일하게 일단은 DB를 이름이 똑같게 하나를 생성해주시고,

계정 역시 생성해줍니다.

 

 

1. my.cnf 설정

[mysqld]
server-id=2
replicate-do-db='repl_db'

1번을 제외한 아무숫자나 가능합니다!

 

 

2. MySQL dump파일 복원

 

$ mysql -u user22 -p repl_db < repl_db.sql
$ mysql -u user22 -p

생성되있는 DB에 dump를 한 다음에 접속해줍니다.

 

 

 

3. Master 서버로 연결하기 위한 설정

mysql> change master to
master_host='xx.xxx.xx.xxx',
master_user='repl_user',
master_password='test456',
master_log_file='mysql-bin.000010',
master_log_pos=287;

생성되있는 DB에 dump를 한 다음에 접속해줍니다.

 

 

 

4. MySQL 재시작

$ systemctl restart mysqld

 

 

 

 

놀랍게도 여기까지가 끝 입니다!

만약 여기까지 잘 됬다면, 확인을 해봐야겠죠!

 

mysql> show slave status\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.65.148
                Master_User: repl_user
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000012
        Read_Master_Log_Pos: 434
             Relay_Log_File: slave-relay-bin.000042
              Relay_Log_Pos: 419
      Relay_Master_Log_File: mysql-bin.000012
      
      
      
           여기가 No이거나 Connecting 중이면 에러입니다.
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
          
          
            Replicate_Do_DB: repl_db,repl_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: 434
            Relay_Log_Space: 419
            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
1 row in set (0.00 sec)

 

728x90