반응형

들어가며

Replication이란?

  • Master DB의 데이터를 Slave DB에 복제하는 방식을 말한다.
  • DB에 과도한 부하가 발생할 경우 Master DB에는 추가/수정/삭제만 처리하고, Slave DB에서 읽기 작업을 처리하도록 하여 부하 분산 효과를 얻을 수 있다.
  • Master DB 장애 발생으로 데이터 유실시 Slave DB에 데이터가 남아있어 복구하기 쉽다.

Master 서버 설정

my.cnf

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

DB Backup

  • 아래 명령어로 생성된 dump.sql 파일은 Slave 서버 설정시 필요하므로 잘 관리한다.
mysqldump -u root -p --all-databases > dump.sql

Replication용 계정 생성

  • username : im_master_repl
  • password : 123456
CREATE USER 'im_master_repl'@'%' IDENTIFIED BY '123456';

Replication용 계정 권한 부여

GRANT REPLICATION SLAVE ON *.* TO 'im_master_repl'@'%';
FLUSH PRIVILEGES;

Master 정보 확인

  • 아래 File, Position 정보를 Slave 설정시에 활용하므로 잘 확인해야함
mysql> SHOW MASTER STATUS\G;
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 816
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:

Slave 설정

my.cnf

  • 다른 Master, Slave 서버의 server-id를 제외한 값으로 설정
[mysqld]
server-id=2

DB Restore

  • 위 Master 설정 과정에서 만들어진 dump.sql 파일을 Slave 서버로 이동시킨 후 아래 명령어를 실행하여 Master와 동일한 상태로 만든다.
mysql -u root -p < dump.sql

Master 서버 정보 추가

  • MASTER_HOST, MASTER_PORT : Master 서버의 주소, 포트값
  • MASTER_USER, MASTER_PASSWORD : Master에서 생성한 레플리케이션용 계정 정보
  • MASTER_LOG_FILE, MASTER_LOG_POS : Master 설정 과정 마지막에서의 File, Position 값
CHANGE MASTER TO
    MASTER_HOST = '192.168.56.12',
    MASTER_PORT = 13306,
    MASTER_USER = 'im_master_repl',
    MASTER_PASSWORD = '123456',
    MASTER_LOG_FILE = 'mysql-bin.000003',
    MASTER_LOG_POS = 816;

Slave 시작

-- Slave 종료 명령어는 STOP SLAVE
START SLAVE;

Slave 상태 확인

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.56.12
                  Master_User: im_master_repl
                  Master_Port: 13306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1632
               Relay_Log_File: 94d17d89a2f8-relay-bin.000002
                Relay_Log_Pos: 1136
        Relay_Master_Log_File: mysql-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: 1632
              Relay_Log_Space: 1350
              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
                  Master_UUID: fdbab12e-45b8-11ec-80c8-0242c0a88002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:

테스트

Master에 접속하여 테이블 생성 & 데이터 추가

CREATE TABLE User
(
    userId VARCHAR(200),
    name   VARCHAR(200),
    PRIMARY KEY (userId)
);

INSERT INTO User (userId, name) VALUES ('1', 'john');
INSERT INTO User (userId, name) VALUES ('2', 'jane');
mysql> SELECT * FROM User;
+--------+------+
| userId | name |
+--------+------+
| 1      | john |
| 2      | jane |
+--------+------+

Slave에 접속하여 데이터 백업 확인

mysql> SELECT * FROM User;
+--------+------+
| userId | name |
+--------+------+
| 1      | john |
| 2      | jane |
+--------+------+

주의사항

  • Slave에 데이터를 추가하면 Master에 반영되지 않으므로 꼭 변경 작업은 Master에서 진행해야한다.

참고

반응형

'Development > MySQL' 카테고리의 다른 글

[MySQL] Partition  (0) 2024.09.06
[MySQL] ProxySQL  (0) 2021.11.16
[MySQL] MATCH AGAINST  (0) 2021.10.31
[MySQL] SQL_CACHE  (0) 2021.10.30
[MySQL] Lock  (0) 2021.02.26

+ Recent posts