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
데몬을
가동하도록 한다.