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. 컴파일러 등 기본 바이너리 설치
1 2 3 4 5 | 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를 설치한다
이때 설치 경로 및 소켓명은 모두 다르게 설정 되어야 한다
1 2 3 | 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. 컴파일 및 설치 진행 (각각)
1 2 | gmake gmake install |
4. DB 인스톨
DB 설치가 모두 완료 되었다면 MySQL DB를 인스톨한다
이때 basedir 과 datadir 및 my.cnf 파일 경로 설정에 유의한다
1 2 3 | . /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 수정
1 2 3 4 5 | [mysqld] datadir= /data/test1 socket= /tmp/mysql1 .sock user=mysql port=3307 |
1 2 3 4 5 | [mysqld] datadir= /data/test2 socket= /tmp/mysql2 .sock user=mysql port=3308 |
1 2 3 4 5 | [mysqld] datadir= /data/test3 socket= /tmp/mysql3 .sock user=mysql port=3309 |
6. 시작 프로그램 등록
1 2 3 | 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 |
1 2 3 | chkconfig --add mysqld1 chkconfig --add mysqld2 chkconfig --add mysqld3 |
7. 편의를 위한 alias 설정
alias 설정 대상 파일 : /root/.bashrc
1 2 3 4 5 6 7 8 9 10 11 | 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에서..
1 2 | update user set password=password( '패스워드' ) where user= 'root' ; flush privileges; |
1 | grant all privileges on *.* to root@ '%' identified by '패스워드' with grant option; |
1 2 | 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 설정
1 2 3 | 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 서버 부분은.. 잠이 오는 관계로 나중에..