MySQL Replication
MySQL Replication(리플리케이션) 이란 복제를 뜻한다.
최소 구성은 2대 이상이며 Master / Slave 구성이다.
실시간 데이터 백업과 여러 대의 DB서버의 부하를 분산시킬 수 있다.
웹서버 같은 경우 L4를 이용하여 로드밸런싱으로 부하를 해결할 수 있다.
웹서버의 부하를 해결하여도 DB서버의 부하로 인하여 사이트가 느리게 열릴 수 있다.
1) DB서버 부하는 어떻게 해결해야 되는지?
2) DB서버 이중화하는 방법은 없는지?
구성
OS : Linux (CentOS)
Master IP : 192.168.0.51
Slave IP : 192.168.0.52
DataBase : repl_db
[Master 계정 정보]
Master 서버에 데이터를 가져오기 위해선 계정 정보가 필요하다
Slave 서버 에 Replication 설정을 하면 계정 정보가 암호화되지 않은 텍스트 형태로 저장되기 때문에 보안상 root 계정 사용을 권하지 않는다
User : repl_user
Password : 123123
필수사항
1. 안정성을 위해서 두대의 DB서버의 버전을 동일하게 맞추어 주는것이 좋다.
2. 버전이 다른경우 높은 버전은 Slave 만 가능하다.
3. 서버는 Master 를 먼저 시작한 후 Slave를 시작시킨다.
4. Master의 status 에 지정된 File 이외의 로그파일은 삭제해도 무방하다.
5. Master의 status의 Position과 Slave status의 Read_Master_Log_Pos는 동일해야 한다.
6. 서버환경, 계정이 바뀐후에는 데이터 디렉토리안의 master.info를 변경하거나 제거한 후 재시작을 해야한다.
7. Master의 Replication로그나 Slave의 relay-bin로그는 vi로는 읽을수 없으며 아래와 같은 방법으로 변환후에 읽을 수 있다.
ex) mysqlbinlog mysql-bin.000001 > binlog.sql
8. Insert 이후 Slave 동기화 도중 데이터 조회가 이루어 져야 하는 상황에는 해당 경우만 Master DB에서 보게 하거나 process 종료 후 sleep 타임을 잠시주어 해결하면 된다
9. MySQL 리플리케이션 서비스 중에 마스터 서버에 장애가 발생하였다면, 슬레이브 서버 중 하나를 마스터 서버로 전환을 하여 서비스를 정상적으로 복구 할 수 있다. 추후 장애가난 마스터 서버가 정상화 되면 슬레이브 서버 중 하나로 역할을 수행하게 만든다.
역할
[Master]
Master 서버는 Binary log에 변경된 데이터 정보를 기록
( Master에서 Binary log 가 활성화되면 Master의 모든 데이터 구문이 Binary log에 저장된다 )
[Slave]
Master Binary log를 Slave 서버가 읽어서 실행함으로써 복제
--------------------------------------------------------------------------------------------------------[Master]--------------------------------------------------------------------------------------------------------
1) DB 생성 ( create database repl_db default character set utf8; )
2) 리플리케이션 계정 생성 ( grant replication slave on *.* to 'repl_user'@'%' identified by '123123'; )
Slave 서버가 Master 서버에 변경된 정보를 가져오는 것이기 때문에 Replication 전용 계정을 생성
mysql의 user테이블에 Replication 권한만 주기 위하여 slave 권한만 부여
3) vi /etc/my.cnf ( 아래 사진과 같이 추가 후 mysql restart )
server-id는 1부터 2^32까지 아무 숫자나 기입해도 되지만 Master는 기본적으로 1번으로 하는 것이 좋다
log-bin 만 기입시 `hostname`-bin.000001 으로 생성
6) Master 서버 접속하여 정보 확인 ( show master status; )
show master status에 나오는 정보로 slave가 master의 정보를 가져오기에 때문에 File과 Position의 정보를 적어둔다
File : MySQL Log 파일
Position : 로그 파일 위치
Binlog_Do_DB : 바이너리 로그파일
Binlog_Ignore_DB : 복제 제외
---------------------------------------------------------------------------------------------------------[Slave]---------------------------------------------------------------------------------------------------------
1) DB 생성 ( create database repl_db default character set utf8; )
2) vi /etc/my.cnf ( 아래 사진과 같이 추가 후 mysql restart )
Server-id : Master 서버의 server-id를 제외하여 설정
replicate-do-db : 복제하고자 하는 데이터베이스, 2개 이상의 데이터베이스를 할 경우 replicate-do-db를 추가
3) Master 서버 연결을 위한 정보 입력
Slave 서버가 실행되면 Master 서버에 접속하기 위한 정보를 master.info에서 읽어온다
만약 master.info에 아무런 정보가 없다면 my.cnf를 참조하여 master.info에 연결 정보를 기록하며,
master.info에 정보가 있으면 my.cnf를 참조하지 않으므로 my.cnf 정보를 수정해도 master에 반영되지 않는다.
change master to를 이용하면 master.info를 바로 변경한다
따라서 master 연결 정보는 my.cnf에 설정하는 것보다는 change master to를 이용하여 설정하는 게 바람직하다
또한 현재는 MySQL 버전이 올라가서 my.cnf에 등록이 안되며, change master to 쿼리로 지정해야 한다
4) start slave;
5) MySQL Replication 상태 확인 ( RHCS2.com = 192.168.0.52 )
Id가 1번과 2번을 확인하면알 수 있듯이 Master노드와 접속을 하고 있는 스레드이다.
※ Slave 서버에 Error 가 발생하면 발생하였던 시점으로부터 Master 서버로부터 갱신된 쿼리를 실행하지 않는다
이런 경우 Error를 넘겨야 다음 쿼리를 실행하기 때문에 Slave 서버에 다음과 같이 넣고 restart 해준다.
# vi /etc/my.cnf
slave-skip-errors=all
slave-skip-errors=1062
'💾Data > 🧩Database' 카테고리의 다른 글
MySQL socket Error (0) | 2020.09.16 |
---|---|
Oracle 필수 프로세스 (0) | 2020.04.14 |
MYSQL 복구 (0) | 2020.03.24 |
MYSQL 초기 패스워드 및 설정파일 위치 (0) | 2020.02.22 |
mysql 정리1 (0) | 2019.10.08 |