MySQL 다중 Replication 구성
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 서버 부분은.. 잠이 오는 관계로 나중에..