본문으로 바로가기

서론

응용 프로그램 혹은 웹 페이지의 작은 기능 단위 연동을 위해서는, rsync로 db 파일을 동기화하는 경우가 있었다.

하지만 rsync 서비스도 정상인지 봐야 하고 스케줄링(crontab) 주기도 설정해야 하고 간혹 문제가 생기기도 하고 테이블 index가 꼬이거나 파일이 깨지는 등 번거로운 방법이다.

 

그래서 향후에는 작은 부분이더라도 Replication을 하기로 했다.

특정 DB 혹은 특정 Table만 동기화 설정이 가능하기 때문이다.

 

선행 작업

Master에서 Slave로 동기화하기를 원하는 DB(및 Table)는 미리 Dump를 떠서 최초 한번은 Slave에 생성해 놓아야 한다.

 

 

Master 서버 설정

우선 server-id가 1로 설정되어 있는지 확인한다.

Master는 보통 1로 설정한다. 그래야 Slave에서 부가적인 설정을 할 필요가 없다.

# cat /etc/my.cnf -n | grep server-id
67 server-id          = 1

 

이번엔 mysql에 접속해서 상태를 확인한다.

 

mysql> show master status;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_do_db | Binlog_ignore_db |
+---------------+----------+--------------+------------------+
| mysql-bin.189 | 91120973 |              |                  |
+---------------+----------+--------------+------------------+

File, Position 값을 각각 메모해 둔다(mysql-bin.189, 91120973).

 

마지막으로 본 서버에 접속해서 동기화 받아갈 Slave 서버들에 권한을 주자.

 

mysql> GRANT REPLICATION SLAVE ON *.* TO 유저@'%' IDENTIFIED BY '패스워드';
mysql> FLUSH PRIVILEGES;

*.*은 DB.Table 이고 %는 ip 모두 허용... 인데 GRANT는 익숙한 구문이므로 자세한 설명은 생략한다.

 

 

 

Slave 서버 설정

Master와 같이 server-id 값을 확인한다.

Slave는 Master와 다른 값을 가져야 하므로 2로 수정하는게 좋겠다.

# cat /etc/my.cnf -n | grep server-id
67 server-id          = 2

 

Slave의 mysql에 접속해서 동기화 받을 DB가 존재하는 Master 서버의 정보를 입력할 차례다.

mysql> STOP SLAVE;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.xxx.xxx', MASTER_USER='유저',MASTER_PASSWORD='패스워드', MASTER_LOG_FILE='mysql-bin.189', MASTER_LOG_POS=91120973;
mysql> START SLAVE;

Master에서 메모한 2개의 값을 MASTER_LOG_FILE 부분과 MASTER_LOG_POS 부분에 대입한다.

 

Slave가 Master에게서 제대로 동기화 받아오는지 확인해 보자.

 

mysql> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.xxx.xxx
                                     ...(생략)...

Waiting for master to send event 문구가 표시되면 정상이다.

 


 

여기서 일단 끝인데... 조금 더 세부적으로...

모든 DB를 동기화하는 것이 아니라, 특정 DB 특정 Table만 동기화 하고 싶다면 아래와 같이 my.cnf 파일에 설정한다.

 

# vi /etc/my.cnf
[mysqld]
...(생략)...
replicate-do-table = DB.Table1
replicate-do-table = DB.Table2
replicate-do-db = DB1
replicate-do-db = DB2

 

  • Slave에 설정할 수도 있고 Master에 설정할 수도 있다.
  • 한 라인에 여러 값을 기입할 수는 없었다. 여러 라인에 각각 지정해야 한다.
  • replication-ignore-table은 동기화 받지 않을 테이블만 기록하는 설정이다.
  • 이 외에도 여러 설정이 존재한다(더 자세한건 구글링을).

 

참고 사항

1. 기본적인 것이지만 iptables 등의 방화벽 설정에서 서버 ip, port를 open해야 한다.

2. 역시 기본적인 것이지만 my.cnf 파일을 수정했다면 mysqld service를 재시작해야 한다.