2008년 12월 03일
MySQL을 실시간 백업을 하라고?
담당자가 퇴사 해 버린 상황.
서비스의 DB가 백업이 안되고 있었다는 사실에 내가 폭탄을 맞았다. 나보고 해 놓으란다....담당할 개발자나 뽑아주지...
퇴사한 담당자들에게 알아보니 DB백업을 위해, 특히 실시간 동기화를 위해 MySQL에서 지원하는 Replication을 사용하면 된단다.
서비스 중의 하나는 Replication 중에 무슨 이유에선가 오류가 발생하여 중지한 상태란다. 그게 3,4개월 전 이야기...T.T;
설명이 잘되어 있는 블로그나 위키등이 많다. 이곳저곳에서 얻은 내용을 나중에 나 보기 좋게 정리 했다.
까라니까 까준다. 어차피 알아두면 피가되고 살이되니까...
MySQL의 Replicaion
1.
장점으로 1.이중화, 2.부하분산(SELECT한해서), 3.실시간 백업을 얘기하고 있다.
Replication은 Master-Slave구성으로 되어 있는데,
Master의 데이터를 Slave에서 실시간으로 동기화 하도록 구성한다면, Master가 다운시 Slave로 짧은 시간에 서비스 복구가 가능하게 할 수 있다(이중화, 실시간 백업). 현재 회사의 서비스 중 백업이 적용되는 경우 사용하고 있다.
Master는 쓰기와 읽기가 모두 가능하도록하고 Slave에서는 읽기만 가능하게 구성하면 DB에 대한 부하를 분산이 가능하다. 일반적인 웹 서비스는 읽기가 쓰기보다 수배이상 많기 때문에 충분히 이점을 제공할 수 있는 구성이 된다(부하분산). 현재 회사에서 제공하는 서비스 중 Choix에서 적용해서 사용 중이다.
2.
동작은 Master DB에서 Slave DB로 변경된 내용을 보내고 로그에 기록한다. Slave DB는 릴레이로그에 기록한 후 순차적으로 쿼리를 실행하여 반영한다.
중간에 Slave를 멈추더라도 재시작시 Master DB에서 멈춘 위치의 정보부터 반영을 하므로 시간이 걸리는 것 이외에 다른 문제는 없다.
3.
설정은 의외로 간단하다. Master DB부터 설정을 한다.
- Master DB
1. my.cnf 파일을 찾아 아래 내용을 설정한다.
[mysqld]
log-bin = /var/lib/mysql/xxxxxxx.log
server-id = 1 <- 이거 중복되면 안된다.
대부분 설정 파일에 보니 위의 내용이 주석처리 되어 있다. 주석을 제거해 주거나 없으면 설정해 준다.
2. MySQL을 재시작 해 주자. 권한에 주의!
> /etc/init.d/mysql restart / start
3. MySQL에 접속해서 Slave의 접속 정보를 설정해 준다.
mysql >GRANT REPLICATION SLAVE ON *.* TO '아이디'@'접속하는 Slave ip' IDENTIFIED BY '접속시 사용할 비번';
내딴에는 디비를 지정한다고 *.* 부분을 '디비명'.* 로 했더니 에러만 난다. 내가 모르는 것인지 모르겠지만, 무조건 *.* 다.
4. Master DB의 진행 상태를 확인하자. 아래 명령어를 넣으면 로그파일 이름과 위치 값이 나온다.
mysql> SHOW MASTER STATUS;
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| Master-bin.000001 | 79 | | |
+-----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
위의 로그 파일과 위치 값은 Slave의 설정에 필요하다는 설명을 꼭 기억해 둔다.
일단...여기까지...
서비스의 DB가 백업이 안되고 있었다는 사실에 내가 폭탄을 맞았다. 나보고 해 놓으란다....담당할 개발자나 뽑아주지...
퇴사한 담당자들에게 알아보니 DB백업을 위해, 특히 실시간 동기화를 위해 MySQL에서 지원하는 Replication을 사용하면 된단다.
서비스 중의 하나는 Replication 중에 무슨 이유에선가 오류가 발생하여 중지한 상태란다. 그게 3,4개월 전 이야기...T.T;
설명이 잘되어 있는 블로그나 위키등이 많다. 이곳저곳에서 얻은 내용을 나중에 나 보기 좋게 정리 했다.
까라니까 까준다. 어차피 알아두면 피가되고 살이되니까...
MySQL의 Replicaion
1.
장점으로 1.이중화, 2.부하분산(SELECT한해서), 3.실시간 백업을 얘기하고 있다.
Replication은 Master-Slave구성으로 되어 있는데,
Master의 데이터를 Slave에서 실시간으로 동기화 하도록 구성한다면, Master가 다운시 Slave로 짧은 시간에 서비스 복구가 가능하게 할 수 있다(이중화, 실시간 백업). 현재 회사의 서비스 중 백업이 적용되는 경우 사용하고 있다.
Master는 쓰기와 읽기가 모두 가능하도록하고 Slave에서는 읽기만 가능하게 구성하면 DB에 대한 부하를 분산이 가능하다. 일반적인 웹 서비스는 읽기가 쓰기보다 수배이상 많기 때문에 충분히 이점을 제공할 수 있는 구성이 된다(부하분산). 현재 회사에서 제공하는 서비스 중 Choix에서 적용해서 사용 중이다.
2.
동작은 Master DB에서 Slave DB로 변경된 내용을 보내고 로그에 기록한다. Slave DB는 릴레이로그에 기록한 후 순차적으로 쿼리를 실행하여 반영한다.

3.
설정은 의외로 간단하다. Master DB부터 설정을 한다.
- Master DB
1. my.cnf 파일을 찾아 아래 내용을 설정한다.
[mysqld]
log-bin = /var/lib/mysql/xxxxxxx.log
server-id = 1 <- 이거 중복되면 안된다.
대부분 설정 파일에 보니 위의 내용이 주석처리 되어 있다. 주석을 제거해 주거나 없으면 설정해 준다.
2. MySQL을 재시작 해 주자. 권한에 주의!
> /etc/init.d/mysql restart / start
3. MySQL에 접속해서 Slave의 접속 정보를 설정해 준다.
mysql >GRANT REPLICATION SLAVE ON *.* TO '아이디'@'접속하는 Slave ip' IDENTIFIED BY '접속시 사용할 비번';
내딴에는 디비를 지정한다고 *.* 부분을 '디비명'.* 로 했더니 에러만 난다. 내가 모르는 것인지 모르겠지만, 무조건 *.* 다.
4. Master DB의 진행 상태를 확인하자. 아래 명령어를 넣으면 로그파일 이름과 위치 값이 나온다.
mysql> SHOW MASTER STATUS;
+-----------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------------+----------+--------------+------------------+
| Master-bin.000001 | 79 | | |
+-----------------+----------+--------------+------------------+
1 row in set (0.00 sec)
위의 로그 파일과 위치 값은 Slave의 설정에 필요하다는 설명을 꼭 기억해 둔다.
일단...여기까지...
# by | 2008/12/03 17:29 | DB | 트랙백




