MySQL5 REPLICATION (MySQL 복제 구현) by Vins

아래 항목은 mysql 5-1.43 버젼에서 테스트 되었으며
mysql 5 이상의 버젼의 문서를 참조하였다

MySQL 복제 구현의 시나리오
 
  MASTER-DB : 192.168.34.72 (TDB1)
  SLAVE-DB : 192.168.34.71 (TDB2)

시나리오 --
Master DB에 이미 운영중인 2년치의 데이터가 들어있고
최근 서버가 불안정해 짐으로 실시간 복제를 구현해 DB이중화를 함이 목적이다
이에 웹소스에서 기존 서버인 TDB1 이 다운될 경우 TDB2에 Connecting 하도록
소스로 구현해 놓았다

(NOTE 설명이나 주의 즉 실행하는 항목이 아님)

사실 아래 STEP 1 ~ STEP 3의 test 까지 순서대로 실행만 해도
무리 없이 복제를 구현할 수 있을 것이다
그럼 STEP 1 Master DB 설정이다

-------------------------------------------------------------------------------------
STEP 1 [MASTER-DB Configuration]

1. connect to master db by root

2. mysql> GRANT REPLICATION SLAVE ON *.* TO 'snsghrepl'@'192.168.34.%' IDENTIFIED BY 'ghrpsns0413';

3. [/etc/my.cnf configure]

log-bin=mysql-bin
server-id=1921683472
NOTE : server-id unique in network and bound from 1 to (2^32)-1 number, recommand ip address with dot
             server-id는 네트워크에서 유일해야 하며 2의32승까지 사용할 수 있다.
             점을 뺀 ip address를 사용하면 아마 유일할 것이다


4. mysql restart 
    4-1. /usr/local/mysql/bin/mysqladimin -uroot shutdown
    4-2. /usr/local/mysql/bin/mysqld_safe --user=mysql & ##(alter enter)
    NOTE : rpm 설치시엔 /etc/rc.d/init.d/mysql restart


5. confirm master db info
    5-1 mysql> FLUSH TABLES WITH READ LOCK;  (data full backup 할꺼니 전체 잠금)
    5-2 mysql> SHOW MASTER STATUS;

+-------------------+----------+---------------+------------------+
 File                         Position        Binlog_Do_DB  Binlog_Ignore_DB
+-------------------+----------+---------------+------------------+
 | mysql-bin.000001 |  106         |                       |                             |
+------------------+----------+---------------+------------------+

1 row in set (0.00 sec)

6. create tar file (NOTE : 테이블 LOCK걸었으니 안심하고 전체백업)

    6-1. cd /usr/local/mysql
    6-2. tar cf /dataCenter/alldb.tar ./usr/local/mysql/data
    (NOTE : mysqldump가 아니라 data 폴더를 전부 가져간다 mysql, information_schema 전부)
    6-3. copy alldb.tar to slave db server (somewhere.. maybe /usr/local/mysql )
    (NOTE : alldb.tar 이라는 이름으로 압축하였으니 이를 Slave DB로 Copy)
7. server reboot
   # reboot (wait a few minutes, 서버 재부팅 할때까지 대기)

8. /usr/local/mysql/bin/mysqld_safe --user=mysql & ##(alter enter)
    NOTE : mysql 을 실행 시킨다.
9. unlock tables;  (백업이 끝났으니 table lock을 풀어주자)
    9-1. # /usr/local/mysql/bin/mysql (access mysql server)
    9-2. mysql> unlock tables;
    9-3. mysql> show master status;    (NOTE : 5-2 와 같으면 됨, 확인작업)
    NOTE : remember value of File Name and Position Number
                 File 필드와 Position 필드의 값을 외워라 (적든가)

10. Master DB Config Complete !!  (Master DB 설정 끝)


STEP 2  [SLAVE-DB Configuration]

1. [/etc/my.cnf configure]  파일내 수정(찾아서 주석 풀거나 server-id만 변경해 주면 됨)
    [mysqld]

log-bin=mysql-bin
server-id=1921683471

NOTE : server-id unique in network and bound from 1 to (2^32)-1 number

2. /usr/local/mysql/bin/mysqladmin -uroot shutdown   (디비 실행 중지)

3. copy alldb.tar in /usr/local/mysql from master-db full back file  
    (NOTE : master full back file 을 소스폴더로 복사)

4. rm -rf /usr/local/mysql/data
    (NOTE : 기존 data폴더를 통채로 지운다 - 완벽한 동기화를 위해서)

5. tar xvf alldb.tar
   (NOTE : recreate /usr/local/mysql/data folder , 압축 풀면 master db의 data폴더가 생성된다)

6. /usr/local/mysql/bin/mysqld_safe --user=mysql &
   (NOTE : Mysql은 서버 재 시작하면 data폴더 이하의 정보를 자동으로 인식한다, database만 제외)

7. /usr/local/mysql/bin/mysql -uroot

    NOTE ; remember filename and position number form STEP1, 9-4
                 9-4에서 외운 정보를 아래에 대입한다
   
    7-1. mysql> CHANGE MASTER TO
                    > MASTER_HOST='192.168.34.72',
                    > MASTER_USER='snsghrepl',
                    > MASTER_PASSWORD='ghrpsns0413',
                    > MASTER_PORT=3306,
                    > MASTER_LOG_FILE='mysql-bin.000001',
                    > MASTER_LOG_POS=106;
       
                   Query OK, 0 rows affected (0.01 sec)

7-2. mysql> START SLAVE;

                    Query OK, 0 rows affected (0.01 sec)

8. Slave DB Config Complete !!  SLAVE DB도 설정 끝


STEP 3. TEST REPLICATION  (이제 테스트)

1. ACCESS MASTER DB
    /usr/local/mysql/bin/mysql -uroot

    mysql> use test;
    mysql> create table replTest (id int, name varcher(20));
    mysql> insert into replTest (1, 'test001');

2. ACCESS SLAVE DB
    /usr/local/mysql/bin/mysql -uroot

    mysql> use test;
    mysql> select * from replTest;
    +------+---------+
     | id      | name      |
    +------+---------+
     | 1       | test001   |
    +------+---------+

NOTE : master db에서 생성하고 insert된 데이터가 slave db에서도 그대로 반영 됨을 알 수 있다

3. Complete TEST !!  (끝)

referance : http://dev.mysql.com/doc/refman/5.1/en/replication-howto-masterbaseconfig.html
참조 : mysql 영문 공식 페이지의 메뉴얼을 참조 하였다
           (개인 블러그, 카페, 기타 웹 사이트에는 허위 정보들이 너무 많았다..)