최초 작성일 : 2021-10-10 | 수정일 : 2021-10-15 | 조회수 : 794 |
MySQL(Maria DB) Replication 이란?
DB 복제를 의미한다.
2대 이상의 DBMS를 나눠서 데이터를 저장하는 방식이다.
(master - slave, master - master, 다중 slave 방식 등)
비동기 복제 방식이다.
master와 slave에 각각 서버 고유 넘버를 지정하고, 이 고유 넘버를 서로 인식하여 작동하게 된다.
실시간 데이터 백업이 가능하다.
DB 서버 부하 분산이 가능하다.
(master에서는 주로 삽입, 삭제, 수정을, slave에서는 주로 조회)
master
데이터에 대한 변경(등록, 수정, 삭제) event 발생시 binary logs에 기록하고 slave 서버에 전달한다.
master는 slave에 대한 정보를 전혀 모른다(몇 개의 slave가 있는지 등)
slave
master에서 전달받은 binarylog를 읽어 DB에 반영한다.
master와 slave의 구성환경을 동일해야 한다. ex. mysql 버전!
master → slave 순으로 작동시켜야 한다.
replication을 하다 보면 binary log가 계속 쌓인다.
이를 cron을 이용하여 처리하거나
my.cnf에 expire_logs_days에 유효기간을 지정한다.
Replication 과정에서 에러가 발생하는 경우, slave는 에러 로그를 작성한다.
후에 에러를 추적하여 바이너리 로그를 분석하여 유실된 자료에 대해 자동 업데이트가 가능하다.
다음 글은 master와 1대의 slave Replication의 예제이다.
master와 slave엔 동일한 버전의 mysql이 설치되어 있다.
(v5.7.32)
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 번호가 변경될 수 있음‼️
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;
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;
Tags #MySql