2010년 8월 17일 화요일

파티셔닝1

파티셔닝은  MySQL 5.1에서 추가된 기능이다.  이것은  한개의 테이블을 여러개로 나누어 사용하는 기능으로 I/O분산을 위한 것이다.

I/O를 분산시킨다는 의미로는 MySQL에서 다음과 같은 방법이 제공되었다.

  • 데이터베이스 디렉토리를 심볼릭 링크로 해서 분산 배치 
  • InnoDB에서는 테이블스페이스 파일(innodb_data_file_path)를 여러개의 파일로 분할 
  • InnoDB에서는 테이블단위로 파일을 작성(innodb_file_per_table)
  • MyISAM에서는 MERGE 테이블 
  • MyISAM에서는 RAID테이블( MySQL5.0에서 페지: 옛날 OS에서는 한개의 파일 사이즈가 4G제한이 있었지만 현재는 그런 제한이 없어졌으므로 자연스럽게 없어짐... )
  • MyISAM에서 파일단위로 심볼릭 링크를 사용해서 분산배치 
그러나, 이것은  어떤 특정 스토리지엔진에서만 가능하다던지 또 사용방법도 각각 다르므로 범용적이라고 할 수 없었다.   그중에는 서버의 설정작업등의 변경작업도 필요하므로 관리자는 별도로 지식을 익혀두어야 했다.

MySQL5.1에서 도입된 파티셔닝기능은 MyISAM과 InnoDB둘다 동작하는 공통의 인터페이스(사용방법)이어서 통일감도 있고,  조작은 SQL문의 실행만으로 완료할 수 있으므로 관리자도 이용자도 편하게 되어졌다. 

파티셔닝을 이용하는 것으로 지금까지 보다 편하게  I/O분산배치를 시행할 수 있게 되었다.

다만,  파티셔닝이 지금까지의 수법을 완전히 대체할 수 있느냐라고는 할 수 없다.
예를 들어 innodb_data_file_path등은 DB셋업할 때 고려해야할 사항이다.

또 MERGE테이블에서는  myisampack으로 각각의 테이블을 작게 할 수 있으므로  이미 존재하는 테이블을 분할 할 때는 파이셔닝보다 편리할 때도 있다.

각각 때와 장소에 맞게 적절히 사용할 필요가 있다.

파티셔닝기능이 유효인지 확인하는 방법에는 SHOW VARIABLES로  have_partitioning의 값을 보면 알 수 있다.   이 값이 YES이면 파티셔닝기능이 들어있다라고 할 수 있다.

만약 값이 NO로 되어 있거나 원래 have_partitioning자체가 나타나지 않은 경우 사용하고 있는 mysqld 바이너리에 파티셔닝이 포함되어 있지 않는 것이다.

서버 소스를  configure할 때 --with-partition를 지정해서 컴파일하면 될 것이다.