MySQL Multi Replication 구성에 대해서 포스팅 해 보고자 한다

    1:1 방식의 복제는 무수히 많은 곳에서 사용중이나, 1:N 대의 서버가 있을 때 1에 해당하는 복제 전용 서버로 구성 되는 시스템에 사용이 가능하다


    현재까지의 GA Release 최신 버전은 5.6.x이다.

    5.7.x 버전(현재는 Development Release) 부터 다중 Replication 구성이 가능하다


    즉, Single Slave - Multi Master 간의 복제가 가능하다

    - Slave 서버에서 Master를 지정 시 master_host / master_port 구문을 활용하여 Multi Master 복제가 가능

    - 5.6.x 버전 에서는 master_port 구문 사용 불가능


    Production 서비스에서의 Development 버전 사용은 많은 위험요소가 잠재 되어 있으므로 GA버전을 통한 Single Slave - Multi Master 구성을 위해 편법을 사용하기로 하였다


    전체적인 구성은 다음 그림과 같다


    (설명)

    각각의 DB는 모두 다른 내용의 Data를 보관한다

    모든 DB를 1:1로 Replication하기에는 6대의 서버가 필요하다

    비용을 고려하여 Slave 서버를 1대만 두고 Slave 서버에는 MySQL Instance 를 3개 띄워 DB01, 02, 03을 각각 1:1 매핑한다


    아래부터는 실제 설정 작업 내용이다



    (Slave 서버)


    1. 컴파일러 등 기본 바이너리 설치

    yum install gcc
    yum install gcc-c++
    yum install cmake cmake-gui
    yum install build-essential
    yum -y install zlib curl openssl openssl-devel libtermcap-devel libc-client-devel bison ncurses-devel bzip2-devel
    


    2. MySQL 3개의 Instance 설치

    yum으로 설치 시 기본 3306포트로 설치가 되기 때문에 다중 Instance 설치가 불가능하다

    소스컴파일을 통하여 임의로 3307, 3308, 3309 포트로 각각의 Instance를 설치한다

    이때 설치 경로 및 소켓명은 모두 다르게 설정 되어야 한다


    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql1 -DMYSQL_DATADIR=/data/test1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/usr/local/mysql1 -DMYSQL_UNIX_ADDR=/tmp/mysql1.sock -DMYSQL_TCP_PORT=3307
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql2 -DMYSQL_DATADIR=/data/test2 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/usr/local/mysql2 -DMYSQL_UNIX_ADDR=/tmp/mysql2.sock -DMYSQL_TCP_PORT=3308
    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql3 -DMYSQL_DATADIR=/data/test3 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DSYSCONFDIR=/usr/local/mysql3 -DMYSQL_UNIX_ADDR=/tmp/mysql3.sock -DMYSQL_TCP_PORT=3309
    



    3. 컴파일 및 설치 진행 (각각)

    gmake
    gmake install
    



    4. DB 인스톨

    DB 설치가 모두 완료 되었다면 MySQL DB를 인스톨한다

    이때 basedir 과 datadir 및 my.cnf 파일 경로 설정에 유의한다

    ./scripts/mysql_install_db --basedir=/usr/local/mysql1 --datadir=/data/test1 --ldata=/data/test1 --defaults-file=/usr/local/mysql1/my.cnf --user=mysql
    ./scripts/mysql_install_db --basedir=/usr/local/mysql2 --datadir=/data/test2 --ldata=/data/test2 --defaults-file=/usr/local/mysql2/my.cnf --user=mysql
    ./scripts/mysql_install_db --basedir=/usr/local/mysql3 --datadir=/data/test3 --ldata=/data/test3 --defaults-file=/usr/local/mysql3/my.cnf --user=mysql
    

    5. 각각의 my.cnf 수정

    [mysqld]
    datadir=/data/test1
    socket=/tmp/mysql1.sock
    user=mysql
    port=3307
    
    [mysqld]
    datadir=/data/test2
    socket=/tmp/mysql2.sock
    user=mysql
    port=3308
    
    [mysqld]
    datadir=/data/test3
    socket=/tmp/mysql3.sock
    user=mysql
    port=3309
    

    6. 시작 프로그램 등록

    cp /usr/local/mysql1/support-files/mysql.server /etc/init.d/mysqld1
    cp /usr/local/mysql2/support-files/mysql.server /etc/init.d/mysqld2
    cp /usr/local/mysql3/support-files/mysql.server /etc/init.d/mysqld3
    
    chkconfig --add mysqld1
    chkconfig --add mysqld2
    chkconfig --add mysqld3
    

    7. 편의를 위한 alias 설정

    alias 설정 대상 파일 : /root/.bashrc

    alias 1start='/usr/local/mysql1/bin/mysqld_safe --defaults-file=/usr/local/mysql1/my.cnf --user=mysql &'
    alias 1stop='service mysqld1 stop'
    alias 1restart='/usr/local/mysql1/bin/mysqladmin -u root -p reload'
    
    alias 2start='/usr/local/mysql2/bin/mysqld_safe --defaults-file=/usr/local/mysql2/my.cnf --user=mysql &'
    alias 2stop='service mysqld2 stop'
    alias 2restart='/usr/local/mysql2/bin/mysqladmin -u root -p reload'
    
    alias 3start='/usr/local/mysql3/bin/mysqld_safe --defaults-file=/usr/local/mysql3/my.cnf --user=mysql &'
    alias 3stop='service mysqld3 stop'
    alias 3restart='/usr/local/mysql3/bin/mysqladmin -u root -p reload'
    

    8. MySQL 계정 설정

    root 비밀번호 설정. 각 DB에서..

    update user set password=password('패스워드') where user='root';
    flush privileges;
    
    grant all privileges on *.* to root@'%' identified by '패스워드' with grant option;
    
    INSERT INTO `user` VALUES ('%','root',' 해쉬값','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','');
    flush privileges;
    

    9. Replication Master 설정

    change master to master_host='10.0.0.11',master_port=3306,master_user='root',master_password='패스워드',master_log_file='mysql-bin.000001',master_log_pos=120;
    change master to master_host='10.0.0.12',master_port=3306,master_user='root',master_password='패스워드',master_log_file='mysql-bin.000001',master_log_pos=120;
    change master to master_host='10.0.0.13',master_port=3306,master_user='root',master_password='패스워드',master_log_file='mysql-bin.000001',master_log_pos=120;
    



    (Master 서버)


    각각의 DB서버의 my.cnf 수정

    Replication 계정 설정

    DB 동기화 작업

    바이너리로그 파일 명과 Position 넘버 확인



    Master 서버 부분은.. 잠이 오는 관계로 나중에..





    Posted by sybd