Mysql DB Replication 하기
about.Programing/NCloud 사용기

Mysql DB Replication 하기

#0. 준비

두대의 mysql 서버 : 한대는 main 한대는 replication

클라우드를 사용할 경우 두 디비 모두 공인 아이피를 가지고 있어야한다. 그래야 접근이 가능하다. 

#1. 왜?

서버의 부하를 줄이기 위한 서버 이중화 작업을 하려한다. 양방향 작업보다는 단반향으로 select를 처리할 수 있는 Replication Db와 update/insert/delete와 같은 수정사항을 적용할 수 있는 main DB로 나누려고 한다. 

 

이유는 요청을 분산시키기 위해서다. 사실 업데이트보다 조회 쿼리가 더 많이 디비에 요청되게된다. 서버가 두대이기 때문에 역할에 따라 요청이 분산된다.

 

여기서 더 나아간다면 조회속도가 빠른 Cache를 사용하는 것도 아주 좋은 방법이다. 대용량 트래픽을 처리하는 서비스에서는 Cache를 적극 활용하기위해서 DB테이블을 파티셔닝하는 전략을 사용하기도 한다. (Cache 메모리에 한번에 담길 수 있는 양은 한정적이기 때문에 디비를 여러개로 나누고 각 디비에 존재하는 모든 데이터를 Cache에 올리기 위해서 파티셔닝 전략을 사용하기도 한다.)

 

WAS나 DB 둘다 Replicaion 서버 두대를 포함하여 총 세대의 서버를 가지고 있는게 좋다. 두대 중 한대가 고장났을 때 복제를 위해 나머지 서버의 db서비스가 멈추어야한다. 만약 서비스를 제공하고 있는 입장이라면 고객들은 불편함을 겪어야 한다.  그래서 서버를 구성할 때는 세대까지 scale outg하는 방식이 좋다. 하지만 이번 장에서는 실제 운용되고 있지만 큰 트래픽이 없는 서비스이기 때문에 main과 replication만 사용하려한다.  

 

이 기록은 mysql 공식문서를 참조해서 작성된다. 

 

 

이렇게 아주 멋지게 순서대로 제공해준다. 가서 보면 더 좋을 것 같다.

#2. Set up 시작

[master Server]

1. 로그와 id 세팅

source가 되는 main 서버와 replication이 되는 sub DB는 id 세팅이 필요하다. source서버에서 binary-logging관련 설정이 필요하다.이유는 binary-log를 가지고 replication 서버가 읽어드리기 때문이다. 아래에서 차례로 확인하자.

 

# source
[mysqld]
log-bin=myslq-bin
server-id=1

 

 

2. user 세팅( in master server)

replication이 master 서버에서 binary-log를 읽을 때 필요한 user가 필요하다. 다중 replication이라면 각각의 다른 user를 부여해도 되고 하나의 아이디로 사용해도 된다. 단, 중요한 것은 replication이 사용할 독립적인 user가 필요하다는 것이다. 명령어는 아래와 같다.

mysql> CREATE USER '[user_naem]'@'[IP]' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';
mysql> flush previleges;

3.replication에 main의 binary-log 좌표 주기( in master server)

mysql> FLUSH TABLES WITH READ LOCK;
mysql> reset master;
mysql > SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 73       | test         | manual,mysql     |
+------------------+----------+--------------+------------------+

맨위 명령어로 master의 모든 쓰기와 읽기에 Lock을 건다. master 서버 정보를 초기화 시킨다. 

위 명령어를 통해 로그의 이름과 좌표를 얻는다. position은 file내부에서의 위치를 이야기한다. 

 

4. Replication과 Source의 데이터 맞추기( in master server)

(덤프방식 말고 직접 던지는 방법도 있습니다.)

덤프파일을 이용해서 두개의 데이터를 맞춘다.

#콘솔창으로 돌아와 명령어를 입력한다. 아래 명령어는 디비 전체를 덤프하는 방식이다.
mysqldump --all-databases --master-data > dbdump.db

# 아래 명령어는 특정 database를 덤프 뜨는 명령어다.
mysqldump -u [사용자] -p [비밀번호] -B [덤프할 데이터베이스] > [파일명].sql

# 두작업이 모두 끝나고 아래 명령어를 입력하여 덤프가 잘 되었는지 확인
ls

 

[Replication Server]

# replication
[mysqld]
server-id=2
log-bin=mysql-bin

:wq!
systemctl restart mysql

:wq! 입력으로 저장 후 종료한다. 그다음 명령어로 설정을 적용하기 위해 프로세스를 재시작한다.

 

우선 mysql에 접속한 후 기존에 충돌이 날 것 같은 데이터베이스가 존재한다면 삭제한다. 

 

다시 콘솔창으로 나온다. 덤프 뜬 파일을 Replication Server로 가져온다.(sftp를 사용해도 된다.)

scp [옵션] [파일명] [원격지_id]@[원격지_ip]:[받는 위치]

# main 서버에서 위 명령어를 입력하고 보내면된다. 옵션은 안넣어도 된다. 
# 만약 디렉토리 전체를 보내고 싶은 경우는 아래와같이 작성하자.

scp [옵션] [디렉터리 이름] [원격지_id]@[원격지_ip]:[보낼 경로]

#보내고 나면 Replication server에서 덤프 파일을 db로 옮깁니다.
mysql -u [사용자] -p [비밀번호] < [덤프파일명].sql

 

그 다음  mysql에 접속하고 아래 명령어들을 차례대로 입력합니다. 

mysql > stop slave;
mysql > reset slave;
mysql > use [덤프한 데이터베이스명];
mysql > select * from [존재하는 테이블명]; // 테이블이 잘 전달 되었는지 확인하고 아래 명령얼 입력

//main 서버의 정보를 입력해주는 구간
mysql >
Change master to
MASTER_HOST='[HOST명 또는 HOST IP]',
MASTER_USER='[아까 만든 복제를 위한 아이디]',
MASTER_PASSWORD=‘[설정한 비밀번호]’,
MASTER_LOG_FILE='[status로 확인한 main서버 로그 파일 명]',
MASTER_LOG_POS=[파일 위치] ;

start slave;

마지막으로 main 서버에 mysql에 접속하고 아래 명령어를 통해 lock 모두 해제

mysql> unlock tables;

 

잘 연결되었는지에 대한 확인은 우선 main DB의 테이블에 데이터를 삽입하고 Repli DB에 같은 테이블을 조회 해본다. 결과가 같으면 아주 잘된 케이스이다. 그렇지 않다면 Replication DB 서버에서 아래 명령어를 입력한다. 

 

SHOW SLAVE STATUS\G
// 입력 후 에러로그가 있는지 잘 확인한다.

내가 겪은 오류는 ip 주소를 잘못 입력해서 시간이 걸렸다. 

 

ps. 위에서 만든 아이디의 경우 repli 서버의 접속을 위해서만 권한을 제공했기 때문에 해당 아이디로 외부에서 따로 접속할 경우 복제를 위한 권한 말고 외부접근 권한을 추가적으로 제공해야한다.