2009년 6월 17일 수요일

MySQL Cluster도입시의 포인트1

ndb_size.pl를 이용한 메모리 사이즈 견적

실제로 MySQL Cluster환경을 셋업할 때에는 메모리사이즈를 어느정도하면 좋을까하는 의문이 반드시 생기게 될 것이다.

메모리는 고가이므로 디스크처럼 충분한 여유를 가지고 미리 준비해 둘 수도 없다.

메모리사이즈 견적에는 테이블수, 인덱스수, 컬럼의 데이터형, 레코드수를 기준으로 산출하게 된다.

계산식도 있기때문에 수작업으로 산출하는 것도 가능하지만 복잡하므로 매우 피곤할 것이다.

이를 위해 MySQL Cluster에서는 사이즈 견적 툴로서 ndb_size.pl이라는 Perl스크립트를 제공하고 있다.

이것을 사용하면 간단히 사이즈를 견적내는 것이 가능하다.

ndb_size.pl 의 실행에는 DBI와 HTML::Template모듈이 필요하다.

또, MySQL인스톨 디렉토리밑/share/mysql/ndb_size.tmpl이라는 파일을 현재 디렉토리에 복사해둘 필요가 있다.

ndb_size.pl은 다음과 같이 실행한다.

ndb_size.pl의 실행
shell>perl ndb_size.pl db_name hostname username password > file_name.html

ndb_size.pl에서는 MySQL 서버에 접속해서 지정된 데이터베이스안의 테이블과 레코드수를 보고 NDB 스토리지 엔진으로 이행했을 때 필요한 메모리 사이즈를 계산해준다.

Data Node(ndbd)가 기동되어 있을 필요는 없다. NDB스토리지엔진으로 만들고 싶은 테이블을 MyISAM등으로 작성해놓고 ndb_size.pl을 실행해서 NDB이행시의 메모리양을 견적내보는 것이 전형적인 방법이다.

예를 들어 다음과 같이 MyISAM 테이블이 있는 상태에서 ndb_size.pl명령을 실행해보자.

ndb_size.pl의 실행예
mysql> create table tbl1(col1 integer primary key, col2 varchar(30) ) engine=myisam;
mysql> insert into tbl1 values(1, 'abc'),(2,'def');
mysql> select * from tbl1;

shell> cp share/mysql/ndb_size.tmpl ./
shell>./bin/ndb_size.pl db1 192.168.0.3:3306 user1 pass1 > size1.html

size1.html이라는 파일이 생성된다.
이것은 테이블 tbl1에 대해서 데이터형과 인덱스(INTEGER형의 primary key와 varchar(30)의 컬럼)을 계산에 넣어서 데이터부분(DataMemory), 인덱스부분(IndexMemory)의 값을 견적해준다.

현재는 레코드 수가 2개밖에 없으므로 Total DataMemory와 Total IndexMemory값은 작게 된다.
중요한 것은 Total DataMemory/Row 하고 IndexMemory/Row이다.
각각 한개의 레코드에 대한 DataMemory양과 IndexMemory양에 해당된다.

실제로 어플리케이션에서 100만레코드를 다룬다고 한다면 이 값을 100만배한 값이 대충 그 DataMemory, IndexMemory가 된다고 생각하면 된다.

물론 테이블수가 여러개 있다면 그것도 고려해야하지만 말이다.

한가지 더, 현재 ndb_size.pl에서는 DECIMAL형을 0바이트로 봐버리는 문제가 있으니 주의하길 바란다.



※NDB인덱스에는 2종류가 있다.

NDB인덱스에는 해쉬인덱스와 T-Tree인덱스(Ordered Index) 2종류가 있다.

전자는 키워드 검색에 사용되는 것으로 primary key제약과 unique key제약을 정의할 때 자동적으로 작성된다.

후자는 범위 검색 에 사용되는 것으로 primary key제약, unique key제약, 보통 인덱스를 정의할 때 자동적으로 작성된다.

다시말해 primary key제약과 unique key제약을 정의하면 해쉬 인덱스와 T-Tree인덱스 양쪽이 정의되게 된다.

T-Tree인덱스를 작성하지 않고 해쉬인덱스만을 정의하는 것은 가능한데 다음과 같이 USING HASH 문을 사용한다.

해쉬 인덱스만을 정의
mysql> CREATE TABLE tbl1(col1 INTEGER PRIMARY KEY USING HASH(col1) ENGINE=NDBCLUSTER;

해쉬인덱스와 T-Tree인데스는 구문만이 아니라 메모리 사용방법도 틀리다.

해쉬 인덱스는 IndexMemory에 들어가지만 T-Tree인덱스는 DataMemory에 들어간다.

T-Tree인덱스1개에 대해서 1레코드당 10바이트 정도이다.

해쉬인덱스는 인덱스1개에 대해서 25바이트정도 이다.

ndb_size.pl에서는 인덱스 차이를 자동적으로 고려해서 견적을 내준다.

덧붙여서, unique key제약등으로 해쉬 인덱스를 추가하는 경우는 1개의 해쉬 인덱스가 1개의 테이블에 대응하기때문에 생각외의 메모리를 사용하게 됨으로 주의가 필요하다.