3. Mysql 아키텍처(3.4, 3.5, 3.6)
3.4 Memory 스토리지 엔진 아키텍처
Memory 스토리지 엔진은 Heap 스토리지 엔진 이라고도 하는데, 이름 그대로 데이터를 메모리에 저장하는 것이 특징이다. 데이터의 크기가 작고 아주 빠른 처리가 필요한 경우 적합한 엔진이다.
3.4.1 주의사항
테이블의 최대 크기
다른 스토리지 엔진을 이용한 테이블과는 달리 Memory 스토리지 엔진을 사용하는 테이블은 저장할 수 있는 데이터의 최대 용량이 정해져 있다. 최대 데이터의 크기는 max_heap_table_size 파라미터로 정의한다
고정 길이 칼럼만 지원
Memory 테이블의 모든 칼럼은 항상 고정 길이로만 생성된다. 즉 varchar(100)와 같은 타입의 칼럼을 만들어도 char(100)과 동일하게 공간이 할당된다는 의미이다. 따라서 불필요하게 너무 큰 데이터 타입을 사용하지 않는 것이 좋다.
Blob 이나 Text와 같은 LOB(Large Object) 타입은 지원하지 않음
Memory 테이블은 기본적으로 해시 인덱스 사용
InnoDB나 MyISAM 테이블을 생성할 때 별다른 내용을 명시하지 않으면 기본적으로 B-Tree 인덱스가 생성되지만 Memory 스토리지 엔진을 사용하면 해시 인덱스를 생성한다.
3.4.2 용도
Memory 스토리지는 사실 Mysql 엔진이 쿼리를 처리하는 과정에서 임시로 생성되는 임시 테이블 용도로 자주 사용된다.
3.5 NDB 클러스터 스토리지 엔진
NDB 클러스터는 “Network DataBase” 의 줄임말로 일반적으로 NDB 라 불리운다. NDB는 데이터의 분산이나 그로인한 성능 향상 보다는 가용성에 집중된 스토리지 엔진이다.
3.5.1 NDB 클러스터의 특성
무공유 클러스터링
NDB는 데이터를 저장하는 스토리지가 분산되어 관리되기 때문에 하나의 데이터 저장소가 작동을 멈추더라도 서비스에 영향을 미치지 않는다.
메모리 기반의 스토리지 엔진
NDB는 클러스터 노드 간의 빠른 데이터 동기화를 위해 메모리를 사용한다. NDB 클러스터는 데이터 스토리지까지 분산하기 때문에 각 노드의 물리적 메모리를 모두 합친 것이 실제 저장 가능한 최대 용량이 된다.
자동화된 Fail-over
NDB는 모든 구성 노드가 서로의 상태를 계속 체크하고 있기 때문에 특정 노드에 문제가 발생해도 다른 사용 가능한 노드가 그 역할을 이어받는 형태로 페일 오버가 가능하다.
분산된 데이터 저장소간의 동기 방식(Sync) 복제
NDB에서 데이터 저장소는 분산되어 관리되는데, 각 데이터 저장소는 전체 데이터를 N등분해서 자신이 전담하는 파티션과 백업으로 보조 파티션을 구성한다. 각 데이터 저장소는 분산된 서로의 데이터를 동기화 해야 하는데 NDB는 비동기 방식이 아닌 동기 방식으로 서로의 데이터를 전달한다.
온라인 스키마 변경
NDB는 테이블에 칼럼이나 인덱스를 추가하면서 동시에 Insert 나 Update와 같은 DML 쿼리를 처리할 수 있다. 이를 온라인 스키마 변경이라 하는데 사용하는 방법은 Alter table 이나 Create index 명령에 Online 키워드를 사용하면 된다. Online 키워드를 사용하지 않은 스키마 변경 쿼리(DDL)은 클러스터가 온라인 처리 유무를 판단하고 가능한 경우 온라인 방식으로 처리한다.
NoSql
네트워크 DB
NDB는 내부적으로 데이터를 저장하고 읽기 위해 네트워크를 기반으로 작동한다. 이는 하나의 서버에서 모든 처리가 일어나는 다른 스토리지 엔진과는 상당히 다른 개념이다
3.5.2 NDB 클러스터의 아키텍처
NDB 클러스터 노드의 종류
- 관리노드
관리노드는 실제 NDB가 정상 상태에서 서비스되는 도중에는 거의 하는 일이 없다. 관리노드는 NDB 클러스터의 전체적인 구조에 대한 정보를 다른 노드에게 전파하거나 각 노드의 장애 상황을 전파하는 역할을 담당한다.
- 데이터 노드
데이터 노드는 클러스터에 대한 전반적인 작업을 수행하는 노드다. 대표적으로는 데이터를 저장하는 스토리지를 관리하고 SQL 노드에서 오는 데이터 조작 요청을 모두 처리한다. 또한 SQL 노드가 아닌 API 노드의 요청도 처리한다. 기본적으로 데이터에 관련된 모든 요청을 데이터 노드가 처리한다고 이해하면 된다.
- SQL 노드
NDB에 접속해 데이ㅓ를 읽고 쓰는 방법은 Mysql 서버를 통해 Sql 문법으로 처리할 수도 있지만 자바나 C 같은 프로그래밍 언어를 이용해 클러스터의 데이터를 조작할 수도 있다. 후자의 방법은 NDB API를 이용하는 방법으로 API 노드라고 표현한다. 반면 SQL서버를 이용해 NDB에 접속하는 경우를 SQL 노드라고 한다.
데이터 노드 간의 파티션 관리
NDB 클러스터는 데이터 노드가 손상되어도 서비스가 가능하도록 클러스터 데이터를 파티션해서 각 파티션을 최소 2개 이상의 데이터 노드에 복제해둔다. 또한 원활한 관리를 위해 데이터 노드를 노드 그룹으로 나누는데, 노드 그룹에는 반드시 1개 이상의 데이터 노드가 존재해야 하며, 노드 그룹에 속한 데이터 노드는 항상 동일한 데이터 파티션을 가진다.
3.5.3 클러스터 간의 복제 구성
NDB 클러스터에도 Mysql의 복제를 적용할 수 있는데, 이런 경우는 특별히 클러스터간 복제라고 표현한다.
3.5.6 NDB 클러스터의 용도
처음에 NDB는 이동통신 사용자의 로그인 정보를 저장하는데 있었는데, 가용성이 극대화된, 소위 세션 데이터 전용 데이터베이스를 만드는 것이 목적이었다. 지금도 세션 전용 데이터베이스로 많이 사용되고 있다.
3.6 TOKUDB 스토리지 엔진
3.6.1 프랙탈 트리(Fractal Tree) 인덱스 지원
B-Tree의 경우 계속되는 Insert, Update, Delete 작업으로 인해 인덱스 페이지 내에 사용되지 못하는 공간이 생기는데 이를 단편화라고 한다. 단편화 현상에 의해 동일한 레코드건수를 조회 하더라도 디스크에서 읽어야 할 인덱스의 숫자가 많아질 수 있고, 버퍼 풀과 같은 캐시영역의 공간도 많이 차지하게 된다. 이러한 현상은 범위 검색과 같은 작업에 비효율성을 발생시킨다.
프랙탈 트리 인덱스는 B-Tree의 단점을 보완한 새로운 형태의 인덱싱 알고리즘이며, 이 알고리즘을 사용한 TokuDB는 프랙탈 트리의 알고리즘 개발자가 설립한 회사에서 출시한 스토리지 엔진이다.
3.6.2 대용량 데이터와 빠른 Insert 처리
위와 같은 프랙탈 트리를 사용함으로써 인덱스에 새로운 레코드를 추가하는 작업이 상당히 빨라진다.
3.6.3 트랜잭션 및 잠금 처리
3.6.4 그 이외의 특징
3.6.5 TokuDB의 주 용도
- SNS 기반의 대용량 테이블(동시성을 크게 요하지 않는)
- 실시간 웹페이지 클릭 분석
- 웹 서버나 게임 서버의 로그 분석
- 고성능 웹 크롤링
- 데이터웨어 하우스