2009년 5월 31일 일요일

MySQL Cluster의 특징 2

◆레코드 데이터와 인덱스를 메모리 상에서 관리

NDB 스토리지 엔진의 행 데이터는 , 데이터 영역, 인덱스 영역을 포함해서 전부 메모리상에서 관리된다.

그 때문에 데이터 액세스는 매우 빠르다.

무엇보다도 메모리는 디스크에 비교해 꽤 비싸기 때문에 수백기가급의 대량 데이터를

다룰 필요가 있다면 MySQL Cluster로 전부 관리하는 것은 현실적이지 않을 수 있다.

다만, MySQL에서는 테이블단위로 스토리지 엔진을 선택가능하기 때문에 고속화가

필요한 테이블은 NDB로 하고 그 이외에는 InnoDB이나 MyISAM으로 하는 구성도 가능하다.

또 5.1에서부터는 테이블데이터(인덱스영역은 빼고)를 디스크상에서 관리할까 메모리상에서

관리할까 하는 선택이 가능하게 된다.

데이터양이 많은 시스템이라서 MySQL Cluster를 사용할 수 없는 것은 아니다.

◆트랜잭션에 대응

InnoDB와 마찬가지로 트랜잭션의 커밋, 롤백이 가능하다.

다만, 분리 레벨은 Read Committed만이 지원된다.

읽고 있는 중에는 Lock을 걸지 않는 것도 InnoDB하고 같다.

◆체크포인트와 그룹 커밋에 따른 영속화

메모리상에서 관리한다라고 하면 머신을 멈추면 모든 데이터가 날라가버린다고 생각할 지도 모른다.

그러나 MySQL Cluster(Data Node)에서는 정기적으로 체크포인트처리가 수행되어

메모리상에 있는 데이터가 디스크에 저장된다. 정상정지나 이상정지등의 이유로 Data Node가

멈추어 재기동이 필요하게 된 경우에는 디스크로부터 테이블 데이터를 읽어들여 메모리에서

전개하게 된다. 그 때문에 Data Node의 프로세스를 멈추어도 테이블 데이터를 잃어버릴 염려는 없다.

이 처럼 Data Node의 모든 메모리데이터를 디스크에 쓰는 처리를 Local Checkpoint라고 부르고 있다.

Local Checkpoint는 기본적으로 수분 간격으로 수행되어진다. (TimeBetweenLocalCheckpoint라는 파라미터로 제어 가능하다. )

그렇지만 이 외에도 트랜잭션의 커밋결과를 디스크에 저장하는 처리도 이루어진다.

이 처리는 Global Checkpoint라고 불리운다.

그러나 InnoDB하고 달리, 커밋 동시에 저장은 하지 않고 일정시간(TimeBetweenGlobalCheckpoint에서 지정한 밀리세컨드)간격으로 그때까지의 커밋정보가

같이 디스크에 쓰여지게 되어있다.

이것은 성능을 높이기 위한 조치이다.

커밋시 동시 저장의 목적은 정전등의 노드 장해가 발생하더라도 직전 커밋정보까지 복원가능케 하는 것이 지만

MySQL Cluster에서는 같은 데이터를 여러개의 노드가 가지고 있기 때문에 1개의 노드에 장해가

발생하더라도 시스템정지으로 되지는 않는다. 그 때문에 엄밀한 커밋시 동시 저장을 하지 않아도

문제는 없다라는 것이다. SQL문등 어플리케이션레벨에서의 튜닝이 필요한 환경에서는 REDO로그 파일에 동기 저장이 bottle neck이 되는 경우가 많지만

MySQL Cluster에서는 그런 걱정이 없다. 이것도 성능 향상에 큰 공헌을 하고 있다.







MySQL Cluster의 특징

MySQL Cluster는 다음과 같은 특징을 가지고 있다.

  • 레코드 데이터와 인덱스를 메모리 상에서 관리
  • 트랜잭션대응
  • 체크포인트와 그룹커밋에 따른 영속화
  • 테이블데이터를 분산배치
  • 동기 replication
  • 복수의 replication 단위
  • shared nothing형
  • Data Node의 fail over 구조를 스스로 갖고 있다.
cluster구성 특유의 기능도 있지만 레코드데이터와 인덱스를 메모리 상에서 관리한다는 매우 큰

특징도 지니고 있다.


2009년 5월 30일 토요일

MySQL 개요2

◆Data Node(ndbd)

Data Node는 MySQL Cluster의 중핵에 해당되는 것으로 테이블 데이터의 분산관리, 동기 replication, 분산 트랜잭션 제어, failover/recovery등을 담당한다. 

실제로는 ndbd라는 프로세스가 처리를 수행한다. 

다른 말로 말하면 Data Node를 기동하기(MySQL Cluster를 이용하기)위해서는 ndbd프로세스를 
새롭게 기동할 필요가 있다는 말이다. 

◆SQL Node(mysqld) 
SQL Node는 Data Node에 대해서 테이블 데이터의 취득, 트랜잭션제어등을 지시하기 위한 노드이다. 
MySQL Cluster에서는 NDB API 라는 인터페이스가 있어서 SQL Node에서 NDB API를 이용해서

Data Node에 접근함으로써 테이블데이터 취득, 트랜잭션 제어등을 수행할 수 있다. 

mysqld는 이 NDB API를 호출하는 코드를 가지고 있어 (sql/ha_ndbcluster.cc), mysqld에서부터 이용자가 NDB스토리지엔진에 접근했을 경우에는 
mysqld가 내부적으로 NDB API경유로 Data Node에 접근하고 결과를 되돌리는 처리를 수행하고 있다. 

이때문에  기본적으로 NDB API를 이용자가 의식할 필요는 없다. 

NDB API를  이용한 프로그램을 스스로가 작성해서 직접 Data Node에 접근하는 것도 가능하다.

이 경우에는 mysqld를 필요로 하지 않는다. 

NDB API는 C++로 만들어져 있기 때문에 C++의 지식이 있으면 그다지 곤란없이 프로그램을 작성할 수 있다. 


◆Management Node(ndb_mgmd)

Management Node는 Data Node와 SQL Node관리를 수행하기 위한 노드이다. 

MySQL Cluster에서는 각 노드에  특별한 노드 번호를 할당해서 식별하고 있다. 

또 Data Node에는 특유의 설정파라미터가 다수 있다.  이것의 정보는 Management Node가 일괄 관리한다. 

Data Node와 SQL Node는 기동시에 우선 Management Node에 접속해서 자기 자신의 설정정보를 얻거나  노드 번호에 
관한 정보(예를 들면 노드 번호3은 SQL Node인가 Data Node인가 Management Node인가하는 정보)를 취득하거나 한다. 

MySQL Cluster가 기동한 뒤에는 큰 부하가 되는 처리는 Management Server에 할당되지 않기때문에  장비의 스펙으로서  고성능의 것이 요구되어지지 않는다. 

 


MySQL Cluster개요

MySQL Cluster에 따라서 성능및 가용성을 향상가능하다.  특히 성능의 향상은 극적이 부분이 있어 초간 10만건을 넘는 검색/갱신을 처리했던 사례도 있다.

여기에서는 이 MySQL Cluster의 개요와 이용방법에 대해서 기초적인 부분을 해설해 본다.

MySQL Cluster 를 구성하는 프로세스
MyISAM과 InnoDB등 보통 스토리지엔진만을 사용하는 경우, 데이터베이스 서버 구성으로서는 MySQL본체 프로세스(mysqld) 한개만 쓰이는 것이 기본형이 된다. 

이 응용으로써 replication에 따른 마스터의 mysqld에 대해서 복수의 슬레이브 mysqld를 구성하는 것도 가능하지만 어쨌든 MySQL의 본체 프로세스 mysqld를 1개, 또는 복수 사용하는 구성이 된다. 

한편 MySQL Cluster의 경우 조금 복잡한 구성이 된다.  

다음의 3종류의 노드로부터 구성되고 이 노드를 전부 준비해 둘 필요가 있다. 

  • Data Node(ndbd)
  • SQL Node(mysqld)
  • Management Node(ndb_mgmd)