Tuesday 21 August 2012

MySQL Replication


MySQL Replication은 Master 서버의 데이터를 Slave 서버(들)에게 데이터를 동기화 시키는 기능을 제공한다. 주로 데이터를 실시간을 백업하거나 데이터 서버의 부하분산을 하고자 할 때 사용하는 기술이다.
이 페이지에서는 이미 데이터가 있는 서버를 Master 서버로 하고 Slave 서버에 기존 데이터를 복제하는 방법을 기술한다.
다음과 같이 가정하고 진행
  • Master Server: a.domainX.or.kr
  • Slave Server: b.domainX.or.kr

Master/Slave Server 설정

  1. Replication Master Server 설정
    먼저 기존 데이터가 있는 서버를 Master로 설정을 하기 위해서는 Binary Logging과 Server ID를 설정해야한다.
    # vi /etc/my.cnf
    다음을 mysqld 항목에 추가한다. 여기서 server-id는 반드시 1로 하여야 하며, 각 서버간에 같은 값이 있어서는 안된다.
    log-bin=mysql-bin
    server-id=1
    
    Server ID
    가능한 값은 1~(2 32) -1이다
  2. Replication Master Server 재시작
    # service mysqld start
  3. Replication Slave Server 설정
    # vi /etc/my.cnf
    다음을 mysqld 항목에 추가한다. 여기서 server-id는 반드시 2 이상의 값을 할당하며, 각 서버간에 같은 값이 있어서는 안된다.
    server-id=2
    relay-log=mysqld-relay-bin
    
  4. Replication을 위한 사용자 추가 및 권한 할당(MASTER에서 설정)
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%.domainX.or.kr' IDENTIFIED BY '<암호>';
  5. Replication Master 서버의 Binary Log 정보 확인
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;
    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | mysqld-bin.000002 |      938 |              |                  |
    +-------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
  6. mysqldump를 이용하여 Data Snapshot 생성
    mysql> FLUSH TABLES WITH READ LOCK;
    또 다른 세션을 열어 다음을 수행하여 Data의 Snapshot을 생성한다.
    # mysqldump -u root -p --all-databases --lock-all-tables > /tmp/mysql-dbdump.sql
    # scp /tmp/mysql-dbdump.sql root@b.domainX.or.kr:/tmp/
    기존 세션에서 Lock을 해제
    mysql> UNLOCK TABLES;
  7. Slave 서버 시작
    # service mysqld start
  8. Slave 서버에 Replication Master 설정
    mysql> CHANGE MASTER TO
        ->     MASTER_HOST='a.domainX.or.kr',
        ->     MASTER_USER='replicator',
        ->     MASTER_PASSWORD='<암호>',
        ->     MASTER_LOG_FILE='mysqld-bin.000002',
        ->     MASTER_LOG_POS=938;
  9. Slave 서버에 Master Snapshot 데이터 넣기
    # mysql -u root -p < /tmp/mysql-dbdump.sql

No comments:

Post a Comment