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 동작 과정
- DB 이용자는 insert, update, delete 등으로 데이터 변경을 요청한다.
- Master는 Binary Log에 변경사항을 기록한다.
- Connection thread는 스토리지 엔진에게 Commit을 수행한다.
- Slave가 I/O thread를 통해 Master에게 Event 요청 시 Master의 Binary log dump thread(Master thread)를 통해 Binary log를 전송한다.
- Slave는 전송받은 파일을 Relay Log에 기록한다.
- Slaves는 SQL thread를 통해 스토리지 엔진에 변경 사항을 기록한다.
Replication 실습
다음 글은 master와 1대의 slave Replication의 예제이다. master와 slave엔 동일한 버전의 mysql이 설치되어 있다. (v5.7.32)
1. Master Server
- 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
- 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;