본문 바로가기

Database/MySQL

MySQL(MariaDB) Replication - DB 실시간 이중화 :: DANIDANI

MySQL(Maria DB) Replication 이란?

  • DB 복제를 의미한다.

  • 2대 이상의 DBMS를 나눠서 데이터를 저장하는 방식이다.

    (master - slave, master - master, 다중 slave 방식 등)

  • 비동기 복제 방식이다.

  • master와 slave에 각각 서버 고유 넘버를 지정하고, 이 고유 넘버를 서로 인식하여 작동하게 된다.

Replication을 하는 이유

  • 실시간 데이터 백업이 가능하다.

  • DB 서버 부하 분산이 가능하다.

    (master에서는 주로 삽입, 삭제, 수정을, slave에서는 주로 조회)

master와 slave의 역할

  • master

    데이터에 대한 변경(등록, 수정, 삭제) event 발생시 binary logs에 기록하고 slave 서버에 전달한다.

    master는 slave에 대한 정보를 전혀 모른다(몇 개의 slave가 있는지 등)

  • slave

    master에서 전달받은 binarylog를 읽어 DB에 반영한다.

binary log가 뭐지?

  • binarylog = binlog
  • mysql(maria DB)에서 발생하는 모든 내역들이 기록되는 파일이다.
  • binay log는 default는 비활성되어있는데, 이를 활성화시켜야 한다.

복제 방식

  • STATEMENT - SQL문을 복사
  • ROW - 변경된 row만 복사
  • MIXED - 두 가지 방식을 섞어서 복사

주의사항

  • master와 slave의 구성환경을 동일해야 한다. ex. mysql 버전!

  • master → slave 순으로 작동시켜야 한다.

  • replication을 하다 보면 binary log가 계속 쌓인다.

    이를 cron을 이용하여 처리하거나

    my.cnf에 expire_logs_days에 유효기간을 지정한다.

  • Replication 과정에서 에러가 발생하는 경우, slave는 에러 로그를 작성한다.

    후에 에러를 추적하여 바이너리 로그를 분석하여 유실된 자료에 대해 자동 업데이트가 가능하다.

Replication 동작 과정

  1. DB 이용자는 insert, update, delete 등으로 데이터 변경을 요청한다.
  2. Master는 Binary Log에 변경사항을 기록한다.
  3. Connection thread는 스토리지 엔진에게 Commit을 수행한다.
  4. Slave가 I/O thread를 통해 Master에게 Event 요청 시 Master의 Binary log dump thread(Master thread)를 통해 Binary log를 전송한다.
  5. Slave는 전송받은 파일을 Relay Log에 기록한다.
  6. Slaves는 SQL thread를 통해 스토리지 엔진에 변경 사항을 기록한다.

 


Replication 실습

다음 글은 master와 1대의 slave Replication의 예제이다. master와 slave엔 동일한 버전의 mysql이 설치되어 있다. (v5.7.32)

1. Master Server

  1. Master 서버 설정
sudo vi /etc/my.cnf

 

log-bin = mysql-bin 
server-id = 1 
binlog_format = row 
expire_logs_days = 2

mysql-bin은 binary log의 파일명을 의미한다.

server-id는 master와 slave의 값만 다르면 된다. 아무 숫자나 사용 가능.

binlog_format는 유형을 선택한다.(STATEMENT, ROW, MIXED 중 선택)

expire_logs_days는 보관기간을 설정한다.

 

 

     2. MySQL 재시작

sudo service mysqld restart

 

     3. mysql 접속

mysql -u root -p

 

     4. slave에서 접속할 계정 생성

mysql> grant replication slave on *.* to 'slave_db'@'%' identified by '12345678';

 

     5. binay log 확인

show master status;

File 명과 Position을 잘 기록해둔다.

‼️DB 재시작 시 file명과 position 번호가 변경될 수 있음‼️


2. Slave Server

  1. slave 설정 수정
sudo vi /etc/my.cnf 
log-bin = mysql-bin 
server-id = 2 
binlog_format = row expire_logs_days = 2

master 서버와 server-id가 다름을 유의하자!

 

     2. MySQL 재시작

sudo service mysqld restart

 

     3. mysql 접속

mysql -u root -p

 

     4. mater 연동 설정

mysql> CHANGE MASTER TO 
        MASTER_HOST=“(마스터 서버 ip 주소)”, 
        MASTER_USER=“slave_db”, 
        MASTER_PASSWORD=“12345678”, 
        MASTER_PORT=3306, 
        MASTER_LOG_FILE=“(아까 기록한 File명)”, 
        MASTER_LOG_POS= (아까 기록한 Position 번호);

 

      5. slave 실행

mysql> start slave;

 

      6. slave 상태 확인

mysql> show slave status;

 


MySQL(MariaDB) Replication 확인

     1. Master에서 database 생성

mysql> create databse TEST_DB;

     Slave에서 확인

mysql> show databases;

     2. Master에서 테이블 생성

mysql> use TEST_DB; 
mysql> CREATE TABLE USER_TB(
        user_idx INT PRIMARY KEY AUTO_INCREMENT,
        user_name VARCHAR(10) NOT NULL
        );

     Slave에서 확인

mysql> use TEST_DB; 
mysql> show tables;

 

     3.  Master에서 데이터 삽입

mysql> INSERT USER_TB(user_name) values('daeun');

      Slave에서 확인

mysql> SELECT * FROM USER_TB;

 

 
728x90