MySQL Cluster 구성
1. 안내
1) Cluster 소개
MySQL Cluster 는 기존의 MySQL Replication 의 단방향 데이터 전송 시스템 (Master – Slave) 의 단점을 보완하고 보다 안전하고 활용성 높은 시스템 구현이 가능하게 해줍니다. 대체로 Cluster 로 묶여진 서버는 Multi Master 서버로 활용되어 어느 서버에서 데이터가 입력, 수정, 삭제 되더라도 다른 데이터 서버로의 갱신이 신속히 이루어집니다.
또한 Replication 에서와는 다르게 장애 발생시, 장애 포인트를 인지하여 스스로 복원하는 기능을 제공하고 있어 무정지 DB시스템을 원하는 고객에게 권장할만 합니다. 다량의 접속이 이루어져 DB 서버가 다운되어도 또 다른 서버로 서비스를 유지하기 위한 시스템으로 보면 됩니다.
2) Replication 과 Cluster 의 특징 (장단점)
Replication |
Cluster |
||
장점 |
단점 |
장점 |
단점 |
Slave 서버에 데이터를 실시간 백업 |
Master 서버 다운시 백업 및 업데이트 연산 불가 |
99.999%의 고가용성 구현, 무정지 DB 시스템 구축, 운영 가능 |
데이터를 메모리에 저장 하므로 많은 메모리 필요 |
여러대의 Slave 서버를 이용해 부하분산 가능 |
Master 서버 다운시 수동 복구 |
자동 FailOver |
구성을 위해 최소 3대의 서버 필요
무정지 시스템 운영을 위해 최소 6대의 서버 필요 |
Cluster에 비해 적은 수의 서버로 시스템 구성 및 부하분산 가능 (최소 2대) |
binlog 관리 필요 |
Sql, Data 노드를 복수개로 구성, 부하분산 |
노드 추가를 위해 클러스터 재시작 필요 |
|
Slave가 master 쿼리 처리량을 따라가지 못할경우 일관성 오류 발생 가능 |
|
|
3) Cluster 구성도
그림에서 표현된 것과 같이 MySQL Cluster 는 총 3종류의 요소로 구성이 되며 각각의 역할은 아래와 같습니다.
- Management 서버 (이하 MGM 서버)
Cluster 를 구성하는 서버를 전체적으로 관리 합니다. (DATA 서버 및 SQL 서버 다운 여부 체크)
- DATA 서버
입력된 데이터를 저장하는 역할을 합니다. 또한 데이터를 메모리에 적재하여 SQL 서버가 Application
으로부터 요청받은 정보를 신속히 응답할 수 있도록 해줍니다.
Cluster 초기버전에서는 메모리에 적재하여 사용했었지만, MySQL 5.1 이후 버전부터는 하드디스크를
기반으로 저장하는것이 가능해졌습니다.
- SQL 서버
SQL을 이용하는 Application 의 요청(조회, 갱신, 삭제 등)에 응답하며, 변경되는 데이터 정보를 DATA
서버로 전달하여 모든 SQL 서버가 동일한 데이터로 응답할 수 있도록 합니다.
4) 매뉴얼 테스트 환경
MGM 서버, DATA 서버, SQL 서버의 역할을 나누어 여러대의 서버에 설치가 가능합니다. 굳이 한 대 또는 두 대의 서버에 설치를 모두 할 수 있으나 그러한 구성은 무의미하며, 효율적 관리 및 활용을 위해 최소 3대 이상으로 구성하여 사용하게 됩니다.
(MGM 1대, DATA & SQL 서버 2대)
그러나 이렇게 3대로 구성한 시스템에서도 MGM 서버가 다운되면, 모든 시스템이 마비되기 때문에 MGM 서버도 2중화를 해야 비로소 온전한 무정지 시스템이 구현되는 것 입니다.
(MGM 2대, DATA & SQL 서버 2대 / 여기서 MGM 서버 1대는 Standby Server 로 활용)
본 매뉴얼 작성을 위해 구성했던 테스트 서버 환경은 3대이며 아래와 같습니다.
[MGM 서버]
- DATA & SQL 서버 관리용
- IP : 192.168.56.11
- CentOS 6.7 (64bit)
- MySQL Cluster 7.4.10
[DATA & SQL 서버1]
- 서비스용
- IP : 192.168.56.12
- CentOS 6.7 (64bit)
- MySQL Cluster 7.4.10
[DATA & SQL 서버2]
- 서비스용
- IP : 192.168.56.13
- CentOS 6.7 (64bit)
- MySQL Cluster 7.4.10
* SQL 서버는 mysqld 데몬이 구동되는 서버를 말합니다.
* MySQL Cluster 7.4.10 은 MySQL 5.6.28 을 포함하고 있습니다.
본 매뉴얼은 최소한의 설치 및 설정 방법만 기술하였으므로 설명이 부족한 부분이 있을 수 있습니다. 기타 필요 사항은 검색을 통하여 확인하시기 바랍니다.
2. 설치
설치는 MGM, DATA & SQL 서버 모두 동일합니다.
1) Cmake 설치
# yum -y install gcc* g++*
# cd /usr/local/src
# wget http://pkgs.fedoraproject.org/lookaside/pkgs/cmake/cmake-2.8.5.tar.gz/3c5d32cec0f4c2dc45f4c2e84f4a20c5/cmake-2.8.5.tar.gz
# tar xvzf cmake-2.8.5.tar.gz
# cd cmake-2.8.5
# ./bootstrap
# make
# make install
2) JDK 설치
MySQL Cluster 는 JDK 를 사용 합니다. 본 매뉴얼에서 설치하려는 MySQL Cluster 7.4.10 버전의 경우 JDK 1.8 버전 이상을 필요로 합니다.
# wget http://uni-smr.ac.ru/archive/dev/java/bulk/jdk-8u77-linux-x64.rpm
설치전에 기존버전을 삭제하고 진행합니다.
# yum -y remove java
# rpm -ivh jdk-8u77-linux-x64.rpm
설치된 JDK 버전을 확인해봅니다.
# java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
3) MySQL Cluster 설치
MySQL을 구동하고 관리할 계정을 생성합니다.
# groupadd -g 400 mysql
# useradd -u400 -g400 -d /usr/local/mysql -s /bin/false mysql
문서 작성일 (2016.3.29) 기준 가장 최신버전인 MySQL Cluster 7.4.10을 다운로드 받아 설치합니다.
# wget http://download.softagency.net/MySQL/Downloads/MySQL-Cluster-7.4/mysql-cluster-gpl-7.4.10.tar.gz
# tar xvzf mysql-cluster-gpl-7.4.10.tar.gz
# cd mysql-cluster-gpl-7.4.10
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DMYSQL_TCP_PORT=3306
# make
# make install
4) DB 생성 및 기본보안 설정
# cp -arp scripts/mysql_install_db /usr/local/mysql
# cd /usr/local/mysql
# rm -rf data
# perl ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# chown -R mysql:mysql /usr/local/mysql
# chown -R mysql.mysql /usr/local/mysql/data
(MGM 서버에서는 config.ini 파일 생성)
# cp share/mcc/tst/example_config.ini /etc/config.ini
(DATA & SQL 서버에서는 my.cnf 파일 생성)
# cp support-files/my-default.cnf /etc/my.cnf
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
# chmod 700 /etc/init.d/mysqld
# chown root.root /etc/init.d/mysqld
# chkconfig --add mysqld
# chmod 711 /usr/local/mysql
# chmod 700 /usr/local/mysql/data
# chmod 751 /usr/local/mysql/bin
# chmod 750 /usr/local/mysql/bin/*
# chmod 755 /usr/local/mysql/bin/mysql
# chmod 755 /usr/local/mysql/bin/mysqldump
3. 설정
MGM 서버와 DATA & SQL 서버의 설정 방식이 다릅니다.
주의해서 해당 서버에 맞게 설정하시기 바랍니다.
1) MGM 서버
# vi /etc/config.ini
[NDBD DEFAULT] NoOfReplicas: 2 // Cluster 내 저장된 테이블에 대한 복사본 수 DataDir: /usr/local/mysql/data FileSystemPath: /usr/local/mysql/data DataMemory: 600M // 데이터를 저장할 물리적 메모리 용량 IndexMemory: 100M // 인덱스를 저장할 물리적 메모리 용량 BackupMemory: 64M
[MGM DEFAULT] PortNumber: 1186 DataDir: /usr/local/mysql/data
[NDB_MGMD] NodeId: 1 // NodeId 는 NDBD, API 를 포함하여 유일한 번호로 설정해주어야 함 HostName: 192.168.56.11 // MGM 서버 IP ArbitrationRank: 1
[NDBD] // DATA 서버(NODE) 섹션 NodeId: 2 HostName: 192.168.56.12 // DATA 서버 IP
[NDBD] NodeId: 3 HostName: 192.168.56.13 // DATA 서버 IP
[API] // SQL 서버(NODE) 섹션 NodeId: 12 HostName: 192.168.56.12 // SQL 서버 IP
[API] NodeId: 13 HostName: 192.168.56.13 // SQL 서버 IP |
2) DATA & SQL 서버
# vi /etc/my.cnf
[mysqld] ndbcluster ndb-connectstring=192.168.56.11 // MGM 서버 IP datadir=/usr/local/mysql/data basedir=/usr/local/mysql port=3306 socket=/tmp/mysql.sock
[mysql_cluster] ndb-connectstring=192.168.56.11 // MGM 서버 IP
[mysql] socket=/tmp/mysql.sock
[client] socket=/tmp/mysql.sock |
4. 구동
구동 방법 또한 MGM 서버와 DATA & SQL 서버가 다릅니다.
주의해서 해당 서버에 맞게 구동하시기 바랍니다.
전체적인 데몬 구동 순서는 'MGM 서버 > DATA 서버 > SQL 서버(MySQL)' 입니다.
1) MGM 서버
# /usr/local/mysql/bin/ndb_mgmd -f /etc/config.ini –initial
참고로 중지 방법은 아래와 같습니다.
# /usr/local/mysql/bin/ndb_mgm -e shutdown
2) DATA & SQL 서버
DATA 데몬 (NetworkDatabase) 구동
# /usr/local/mysql/bin/ndbd -c 192.168.56.11:1186
2016-03-29 16:21:33 [ndbd] INFO -- Angel connected to '192.168.56.11:1186'
2016-03-29 16:21:33 [ndbd] INFO -- Angel allocated nodeid: 12
SQL 데몬 구동
# /etc/init.d/mysqld start
5. 확인
구동이 잘 되고 있는지는 MGM 서버에서 명령어를 통해 확인이 가능합니다.
# /usr/local/mysql/bin/ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.56.12 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 0, *)
id=3 @192.168.56.13 (mysql-5.6.28 ndb-7.4.10, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.56.11 (mysql-5.6.28 ndb-7.4.10)
[mysqld(API)] 2 node(s)
id=11 @192.168.56.12 (mysql-5.6.28 ndb-7.4.10)
id=12 @192.168.56.13 (mysql-5.6.28 ndb-7.4.10)
이제 클러스터링 동작 여부를 확인하기 위해 DATA & SQL 서버에 접속하여 아래와 같이 DB 및 table 생성을 해봅니다.
# mysql -p
mysql> create database sysdocu;
mysql> use sysdocu;
mysql> create table example (id int) engine=ndb;
테이블을 직접 생성하지 않은 또다른 DATA & SQL 서버에서 테이블 생성 여부를 확인하면 됩니다.
* 주의 사항
cluster 사용시 단 한가지 주의할 점은 테이블이 반드시 ndb 타입이어야 클러스터링이 됩니다.
(MyISAM, InnoDB 는 동기화되지 않음)
6. 장애 복구 (테스트)
서버는 구성해놓은 채로 당분간 운영이 되겠지만, H/W적인 장애나 S/W적인 이유에서 장애를 일으켜 서비스가 되지 않는 소지가 분명히 존재합니다. 여러가지 경우에 따른 대처 방법을 기술해 놓았습니다.
1) DATA & SQL 1번 서버 다운시
- 상황 : DATA & SQL 1번 서버 (192.168.56.12) 를 완전히 다운시켜놓고 DATA & SQL 2번 서버
(192.168.56.13) 의 데이타를 갱신해보았다. 그 후에 DATA & SQL 1번 서버를 정상 부팅
하였을 경우, 데이타는 갱신이 되어있을까?
- 결과 : 그동안 DATA & SQL 2번 서버에 누적되어있던 데이터가 DATA & SQL 1번 서버에도 적용
이 되었다.
- 이유 : DATA 서버가 한 개 더 있기 때문이다. (DATA & SQL 2번 서버의 ndbd 데몬)
이를 통해 그동안 누적된 데이터가 다운에서 복귀한 서버로 자동 동기화가 된다.
그러므로 서비스용도인 SQL 서버는 물론이고, DATA 서버도 자동 동기화를 위하여 2대 이상
의 서버에 구성하는것을 추천한다. (DATA & SQL 서버 형식으로)
- 복구 절차 : 다운된 서버를 부팅하고 데몬 가동만 하면 되므로 특별한 조치가 없다.
데몬 구동은 'ndbd > mysqld ' 순서로 진행한다.
2) DATA & SQL 1번, 2번 서버의 ndbd 데몬 종료시 (DATA 서버를 없애는 것)
- 상황 : 그럴일은 거의 없겠지만, DATA & SQL 1번 서버, DATA & SQL 2번 서버의 mysqld 데몬
은 살아 있으면서 ndbd 데몬만 두 서버에서 모두 종료 했을때, 데이터가 동기화 되는가?
- 결과 : ERROR 1296 (HY000): Got error 4009 'Cluster Failure' from NDBCLUSTER 라는 메세지
를 뿌리며 select, insert 등의 모든 쿼리가 실행되지 않았다.
- 이유 : DATA 서버 없이는 어떠한 SQL 서버도 데이타 입출력이 되지 않기 때문이다.
(SQL 서버는 무용지물 상태가 됌)
- 복구 절차 : DATA & SQL 서버마다 'ndbd 시작 > mysqld 재시작' 순서로 진행한다.
3) MGM 서버 다운시
- 상황 : DATA 및 SQL 서버를 관리하는 MGM 서버가 다운되었을 경우 데이터가 동기화 되는가?
- 결과 : 2)번 테스트 때와 마찬가지로 ERROR 1296 (HY000): Got error 4009 'Cluster Failure'
from NDBCLUSTER 라는 메세지 를 뿌리며 select, insert 등의 모든 쿼리가 실행되지 않았다.
- 이유 : MGM 서버 없이는 어떠한 SQL 서버도 데이타 입출력이 되지 않기 때문이다.
(SQL 서버는 무용지물 상태가 됌)
- 복구 절차 : MGM 서버의 ndb_mgmd 시작 > DATA 서버의 ndbd 재시작 > SQL 서버의 mysqld
재시작
4) ndbd 데몬 시간차 다운시 (주의해서 잘 볼것! 중요함!)
- 상황 : DATA & SQL 1번 서버, 2번 서버의 ndbd 데몬만 시간차를 두고 종료할 것이다. 테스트를 위
한 순서는 아래와 같다.
① 현재 SQL 서버의 테이블 내 레코드 값이 '10' 이라고 하였을때를 가정한다.
(data 1 : ON, sql 1 : ON, data 2 : ON, sql 2 : ON, record : 10)
② DATA & SQL 1번 서버의 ndbd 를 종료한다.
( data 1 : OFF, sql 1 : ON, data 2 : ON, sql 2 : ON, record : 10)
③ DATA & SQL 2번 서버에서 레코드 값을 '15' 로 변경한다.
( data 1 : OFF, sql 1 : ON, data 2 : ON, sql 2 : ON, record : 15)
④ DATA & SQL 2번 서버의 ndbd 를 종료한다.
( data 1 : OFF, sql 1 : ON, data 2 : OFF, sql 2 : ON, record : ??)
지금 시점에는 레코드를 읽을 수 없다. DATA 서버 둘 중 하나를 구동해야 서비스가 지속될 수
있는데, 현재 DATA 1번 서버에 저장되어있는 레코드 값은 '10' 이고, DATA 2번 서버에 저장되
어 있는 레코드 값은 '15' 이다. 어느 DATA 서버의 ndbd 를 구동 하느냐에 따라 데이터가 다르
게 나타날 수 있는것이다. 당연히 최근 종료된 ndbd 데몬을 구동해야 최근 데이터가 유지된다.
(실수로 오래전 종료된 ndbd 데몬을 먼저 구동했을 경우, 최대한 빨리 최근 종료된 ndbd 데몬
을 가동할 수 있도록 한다.)
⑤ DATA 서버의 ndbd 데몬을 구동 했다면, SQL 서버의 mysqld 데몬도 재구동 해준다.
(그래야 MGM 서버가 SQL 서버를 빨리 인지해 조금이라도 빨리 서비스를 제공할 수 있게
된다.)
- 복구 절차 : 어느 DATA 서버가 마지막 까지 살아있었는지 알고 있을 경우, 그 서버의 ndbd 데몬을
먼저 가동시킨다. 그리고 나서 모든 SQL 서버의 mysqld 데몬을 가동하도록 한다.
'리눅스 > MySQL' 카테고리의 다른 글
mysql 테이블 생성 예제 (0) | 2017.09.01 |
---|---|
우분투 16.04 에서 MySQL 5.7.13 DATA 디렉토리 변경 (0) | 2016.09.02 |
Oracle 자동 백업 스크립트 (0) | 2015.01.27 |
[Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe Statement: (0) | 2015.01.16 |
데이타를 임의 순서로 검색하되 특정 값만 가져오는 쿼리 (0) | 2015.01.16 |