사용자 도구

사이트 도구


kb:mysqlcluster

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

kb:mysqlcluster [2014/11/08 17:15] (현재)
줄 1: 줄 1:
 +====== MySQL Cluster ======
 +...
 +
 +====== 제한 사항 ======
 +[[http://​dev.mysql.com/​doc/​refman/​5.0/​en/​mysql-cluster-limitations.html]]
 +
 +제한 사항 적다 보니, 이거 쓸 수 있는 거 맞나 싶을 정도인데... -_-
 +
 +===== Noncompliance with SQL Syntax in MySQL Cluster =====
 +  * 임시 테이블 지원하지 않는다.
 +  * 키와 인덱스에 다음과 같은 제약 사항이 있다.
 +    * 3072바이트보다 큰 컬럼으로 인덱스를 만들 수 있지만, 처음 3072바이트만 인덱싱에 참여한다.
 +    * TEXT 또는 BLOB 타입의 컬럼으로 인덱스를 만들 수 없다.
 +    * FULLTEXT 인덱스 지원하지 않는다. 그러나 VARCHAR 컬럼에 대한 인덱스는 생성 가능.
 +    * NULL이 가능한 컬럼을 unique key, primary key로 만드는 것은 이러한 컬럼을 사용하는 쿼리가 full table scan으로 처리됨을 의미한다. 해당 컬럼을 not null로 만들거나 using hash 옵션을 빼고 만들어야 한다.
 +    * Prefix 인덱스를 지원하지 않는다. 항상 컬럼 전체를 인덱싱한다.
 +    * BIT 컬럼은 primary key, unique key, index가 될 수 없다. 합성키로도 안 된다.
 +    * AUTO_INCREMENT 컬럼은 테이블당 1개만 허용된다. Primary key를 명시하지 않으면, AUTO_INCREMENT 컬럼이 '​hidden'​ primary key가 되고 다른 컬럼을 primary로 설정하려고 하면 에러가 발생한다. AUTO_INCREMENT 컬럼을 primary key로 명시하는 건 문제 없다.
 +  * Geometry data type(WKT, WKB)은 NDB 테이블에서 지원되지만,​ spatial 인덱스를 지원되지 않는다.
 +
 +===== Limits and Differences of MySQL Cluster from Standard MySQL Limits =====
 +  * NDB 테이블에서 DELETE 구문을 처리하기 위해 사용된 메모리는 바로 반환되지 않고, 다음에 일어날 INSERT를 위해 예약된다.
 +    * Rolling restart를 실시하면 이 메모리를 일반적인 용도로 다시 사용할 수 있다고 한다.
 +    * Rolling restart란 서비스 도중에 전체 디비를 재시작하는 것을 말한다. 리플리케이션을 고려하여 데이터 노드 하나씩 재시작해야 한다.
 +    * DROP TABLE, TRUNCATE TABLE, OPTIMIZE TABLE을 수행해도 같은 효과를 볼 수 있다고 한다.
 +  * 클러스터 설정에 따른 제한
 +    * 수정 가능한 hard limit 값이 있는데, 대부분의 값들은 온라인으로 변경이 가능하다.
 +    * DataMemory(Database memory size), IndexMemory(index memory size)
 +    * DataMemory는 32kb 페이지로 할당된다. 페이지가 사용될 때마다 페이지는 특정 테이블에 할당되고,​ 테이블을 드랍하기 전까지는 해제되지 않는다.
 +    * 트랜잭션 하나에 가능한 최대 operation 수는 MaxNoOfConcurrentOperations,​ MaxNoOfLocalOperations 파라미터로 정한다.
 +    * 테이블과 인덱스에 대한 제한을 서로 다르게 할 수 있다. 예를 들어 크러스터에서 정렬된 인덱스의 최대 수는 MaxNoOfOrderedIndexes로 정하고, 테이블당 정렬된 인덱스의 최대 갯수는 16개이다.
 +  * 모든 클러스터 테이블 ROW의 크기는 고정되어 있다. 쉽게 생각해서 VARCHAR 컬럼을 만들면 그 최대치만큼의 공간을 잡는다고 보면 된다.
 +  * 노드와 데이터 오브젝트의 최대값
 +    * 데이터 노드의 최대 수는 48
 +    * 모든 노드 총합의 최대 수는 255. 여기서의 노드는 모든 SQL 노드와 API 노드, 매니지먼트 서버까지 포함한다.
 +    * Metadata 오브젝트의 최대 수는 20320.
 +
 +===== Limits Relating to Transaction Handling in MySQL Cluster =====
 +  * 트랜잭션 격리 수준은 READ COMMITED만 지원한다.
 +  * BLOB/TEXT 데이터 타입을 저장할 때, NDBCLUSTER는 컬럼의 일부분만 MySql이 볼 수 있도록 저장하고,​ 나머지는 MySQL이 접근할 수 없는 내부 테이블에 저장한다. 그래서 아래와 같은 이슈가 생긴다.
 +    * SELECT 구문에 BLOB 또는 TEXT 타입의 컬럼이 포함되어 있으면, READ COMMITED 격리 수준으로 READ LOCK을 갖는 작업으로 변환된다. 이는 일관성을 보장하기 위함이다.
 +    * BLOB/TEXT 타입의 컬럼 값을 가져오기 위해, primary key lookup 또는 unique key lookup을 수행하는 경우, 해당 테이블에 shared read lock이 걸린다. 테이블에 BLOB/TEXT 컬럼이 있어도 사용하지 않는다면 락이 걸리지 않는다. \\ <code sql>
 +CREATE TABLE t (
 +    a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 +    b INT NOT NULL,
 +    c INT NOT NULL,
 +    d TEXT,
 +    INDEX i(b),
 +    UNIQUE KEY u(c)
 +) ENGINE = NDB,
 +
 +SELECT * FROM t WHERE a = 1; -- 요건 primary key lookup을 타므로 락 걸림
 +SELECT * FROM t WHERE c = 1; -- 요건 unique key lookup을 타므로 락 걸림
 +
 +SELECT * FROM t WHERE b = 1;   -- 요건 index scan을 타므로 락 걸리지 않음
 +SELECT * FROM t WHERE d = '​1';​ -- 요건 table scan을 타므로 락 걸리지 않음
 +SELECT * FROM t;               -- 요건 table scan을 타므로 락 걸리지 않음
 +SELECT b,c WHERE a = 1;        -- 요건 primary key lookup을 타지만, BLOB/TEXT 컬럼을 사용하지 않으므로 락 걸리지 않음
 +</​code>​
 +  * 부분 트랜잭션 및 부분 롤백은 없다. 중복 키 또는 유사한 에러는 모두 전체 트랜잭션 롤백을 초래한다.
 +  * MySqlCluster는 커다란 트랜잭션을 잘 처리하지 못한다. 큰 트랜잭션은 메모리를 많이 소모하기 때문에 잘게 쪼개어 처리하는 것이 낫다.
 +    * NDB 테이블에서 truncate table 구문은 트랜잭션이 아니다. 만약 실패하면 재시도해야 한다.
 +    * DELETE FROM 구문은 WHERE 구문이 있건 없건 트랜잭션이다. 매우 큰 테이블의 경우, 성능을 위해서는 DELETE FROM ... LIMIT ... 구문을 사용하는 것이 나을 수 있다.
 +    * LOAD DATA 구문은 트랜잭션이 아니다.
 +    * ALTER TABLE 구문 중에 테이블을 복사하는 경우, 이 복사 작업은 트랜잭션이 아니다. 뭔 말이지...?​
 +  * 수행 시간이 오래 걸리는 트랜잭션이 존재할 경우, 노드의 리스타트를 방해할 수 있다. 노드는 재시작할 때 순간적이지만 모든 것에다 락을 거는데, 트랜잭션이 이를 막을 수 있다. ㄷㄷ
 +
 +===== MySQL Cluster Error Handling =====
 +  * 노드를 start/​stop/​restart할 때 에러가 발생할 수 있는데, 이는 애플리케이션 레벨에서 트랜잭션을 다시 시작하던지 해서 에러를 해결해야 한다.
 +  * "Error 1204 Temporary failure, distribution changed"​와 같은 에러는 노드를 처음 시작할 때 나올 수 있다.
 +
 +===== Limits Associated with Database Objects in MySQL Cluster =====
 +  * 하나의 클러스터에서 database, table, index를 포함한 모든 database object의 최대 수는 20320개이다.
 +  * 테이블당 attribute의 최대 수는 512개이다. 여기서 attribute란 컬럼, index 등을 말한다.
 +  * 키당 attribute의 최대 수는 32개이다.
 +  * 한 행의 최대 크기는 14000바이트(NDB 7.0 기준)이다. TEXT/BLOB 데이터는 여기서 개당 264(256+8) 바이트를 차지한다.
 +  * The maximum number of rows that can be stored in a single MySQL Cluster partition varies with the number of replicas times the number of fragments. Since the number of partitions is the same as the number of data nodes in the cluster (see [[http://​dev.mysql.com/​doc/​refman/​5.0/​en/​mysql-cluster-nodes-groups.htmlSection | 17.1.2, “MySQL Cluster Nodes, Node Groups, Replicas, and Partitions”]]),​ you can increase the number of fragments&#​8212;​and thus the available space&#​8212;​by using more data nodes.
 +    * 한 partition당 저장할 수 있는 최대 행의 갯수는... framents가 뭐야...
 +
 +===== Unsupported or Missing Features in MySQL Cluster =====
 +  * Foreign key는 지원하지 않는다.
 +  * Index prefix는 지원하지 않는다.
 +  * OPTIMIZE 구문은 지원하지 않는다.
 +  * LOAD TABLE ... FROM MASTER 구문은 지원하지 않는다.
 +  * SAVEPOINT와 ROLLBACK TO SAVEPOINTS 구문은 지원하지 않는다.
 +  * 디스크 쓰기 보장은 없다. 기본적으로 다른 노드로 복제되기는 하나, 로그가 디스크에 기록된다는 보장은 없다.
 +  * 복제는 지원하지 않는다.
 +
 +===== Limitations Relating to Performance in MySQL Cluster =====
 +  * Range scan은 NDB에서 상대적으로 비용이 크다.
 +  * 범위 레코드에 대한 통계는 완전히 테스트되지 않았고, 공싱적으로 지원하지 않는다.
 +  * USING HASH로 생성된 unque hash index는 키의 일부로 NULL이 주어지면 사용할 수 없다.
 +
 +===== Issues Exclusive to MySQL Cluster =====
 +  * 클러스터에 사용된 모든 머신의 아키텍쳐는 동일해야 한다. (Bin-endian or little-endian)
 +    * 클라이언트의 아키텍쳐는 상관없다.
 +  * 온라인 상태에서 스키마를 변경할 수 없다.
 +    * 요건 나중에 좀 더 자세히 조사해 보자.
 +  * 바이너리 로깅에 다음과 같은 제약 사항이 있다.
 +    * sql_log_bin은 데이터 operation에는 영향이 없고, 스키마 operation에는 지원된다.
 +    * BLOB 컬럼은 있는데, primary키가 없는 테이블에 대해서는 binary log를 생성할 수 없다.
 +
 +===== Limitations Relating to Multiple MySQL Cluster Nodes =====
 +  * Disk Data Object
 +    * Tablespace 최대 수 : 2^32 (4294967296)개
 +      * 테이블 스페이스는 테이블의 저장 공간을 의미하는데,​ 데이터 파일과 로그 파일을 명시하여 생성한다.
 +    * 테이블 스페이스당 데이터 파일 최대 갯수 : 2^16 (65536)개이지만,​ 실용적인 목적으로 최대 2^15(32768)개를 추천
 +    * 데이터 파일 크기 : 이론적으로는 64G지만, 실용적인 상한선은 32G이다.
 +  * Diskless mode
 +    * 클러스터가 diskless 모드로 동작할 때, Disk Data Table은 지원되지 않는다.
 +
 +
 +====== 링크 ======
 +  * [[http://​www.linuxtopia.org/​online_books/​database_guides/​mysql_5.1_database_reference_guide/​mysql-cluster-limitations.html]]
 +
 +----
 +  * see also [[MySQL]]
  
kb/mysqlcluster.txt · 마지막으로 수정됨: 2014/11/08 17:15 (바깥 편집)