본문 바로가기

MariaDB, MySQL

MARIADB 5.5 ARCHITECTURE v1.0

MARIADB 5.5 ARCHITECTURE v1.0

 

Date

Ver

Etc.

13.06.04

1.0

 

 

 

 

 

 

 

 

 

1.    MariaDB Architecture



(http://docs.oracle.com/cd/E19957-01/mysql-refman-5.5/storage-engines.html )

 

MariaDB Architecture MySQL 과 동일하다.

상단의 그림은 MySQL 5.5 Architecture 이다.

 

2.    Architecture Components

 

 

응용프로그램

Connectors

Management Service & Utilities

MariaDB Server

MariaDB Engine

MySQL 엔진

커넥션 핸들러

SQL 인터페이스

SQL 파서

SQL 옵티마이저

캐시 & 버퍼

Storage Engine

MyISAM, InnoDB,

 

OS & H/W

디스크 파일 시스템, 데이터 및 로그 파일

 

구성 요소 중 MySQL 과 대비되는 MariaDB 의 특이사항은 다음과 같다

 

l  Storage Engine

NDB 를 지원하지 않음 (https://kb.askmonty.org/en/mariadb-storage-engines/ )

NDB 에 대해서 지원하지 않음 (disabled) 으로 명시되어 있는걸 보아 다른 엔진 사용에 대해 제약은 없는 듯 하다.

 

확실하게 사용가능한 (공식페이지에 소개되어 있는) 스토리지 엔진은 MyISAM, XtraDB / InnoDB 가 있다.

(주로 사용하는 Storage Engine 이다.)

 

다른 MySQL 기반과 구분되는 특징은 Cassandra Storage Engine 으로 사용할 수 있다는 것이다.

이는 MariaDB 10.0.1 부터 지원한다. (https://kb.askmonty.org/en/cassandra-storage-engine/ )

 

 

3.    Storage Engine

실질적으로 사용하게 되는 Storage Engine 은 아래와 같다.

l  MyISAM

Memory

Key Cache

O/S cache

OS system cache / buffer

Disk

Index file

Data file

 

MyISAM Key cache Index 만을 대상으로 하며, 테이블의 페이지는 그 대상이 아니다.

 

Storage Engine 에는 I/O 를 해결하기 위한 캐시나 버퍼링 기능이 없기에 이를 OS 에 의존한다.

운영체제의 캐시는 남는 메모리를 사용하는데 MyISAM 이 해당 영역을 사용할 수 있다는 것을 감안해야 한다.

 

l  InnoDB (XtraDB)

 

MariaDB XtraDB 를 사용한다.

XtraDB Storage Engine 의 하나로 InnoDB 와 거의 동일하다.

PERCONA 에서 개발 된 Storage Engine 으로 MySQL InnoDB PERCONA 에서 개발한

XtraDB 의 백업도구 XtraBackup 을 가지고 백업/복구가 가능할 정도로 InnoDB XtraDB 는 유사하다.

 

MariaDB PERCONA XtraDB 를 사용하며 기본적으로 enabled 상태이다.

AskMonty (공식페이지) 를 보면 PERCONA 의 지원 Storage InnoDB/XtraDB 라 표시한 정도를 보면

유사를 넘어 동일하다고 봐도 무관할 정도이다.

 

InnoDB 의 아키텍쳐는 다음과 같다.

 

Memory

InnoDB 버퍼 풀

언두레코드

인서트버퍼

페이지버퍼

로그버퍼

Disk

테이블스페이스

시스템테이블스페이스

유저테이블스페이스

리두로그

언두로그

 

크게 메모리에 해당하는 부분과 디스크에 해당하는 부분이 있다.

MyISAM Storage 와 대비되는 부분으로는 OS 의 캐시에 의존하지 않는다는 것이다.

 

InnoDB 는 독자적으로 캐싱을 위한 메모리 영역을 가져간다.

 

각 요소들에 대한 부가 설명은 다음과 같다.

 

 

언두레코드 : 이를통해 MVCC 를 지원한다. MariaDB read-committed read-uncommitted 를 지원하는데

 read-committed 의 경우 커밋되지 않은 타 세션의 데이터는 조회할 수 없다. 때문에 이 변경된 페이지가 아니라

 변경 이전 버전의 페이지를 읽어야 하는데 이를 UNDO 를 사용해 구현한다.

 

 이와 같이 동일 페이지에 대해 여러 버전을 가지고 컨트롤하기 때문에 Multi Version Concurrency Control 이라 표현한다.

 

인서트버퍼 : 변경해야 할 인덱스 페이지가 메모리상에 없는 경우 임시공간에 저장했다가 한번에 처리한다.

사용자에게 결과를 전달하기 전에 반드시 중복 여부를 체크해야 하는 유니크 인덱스는 인덱스 버퍼를 사용할 수 없다.

이 기능을 통해 I/O 를 효율적으로 사용한다.

 

페이지버퍼 : 페이지(오라클의 블록에 해당) 를 캐싱한다 ( 인덱스, 테이블 )

 

로그버퍼 : ORACLE redo 에 해당한다.

 

테이블스페이스 : InnoDB 의 시스템 테이블스페이스는 공용테이블 스페이스에 위치한다.

 유저 테이블스페이스의 경우는 file_per_ table 파라미터의 사용에 따라 공용으로 쓸 수도 있고,

 테이블마다 각기 사용할 수도 있다.

 

리두로그와 언두로그는 로그버퍼, 언두레코드가 기록된다.

리두로그 파일의 경우 그룹 지정이 되는데 각 그룹은 하나의 멤버로 구성되어 있다.

 

 

InnoDB 스토리지의 특징

-      InnoDB 의 모든 테이블은 pk 를 기준으로 정렬된 상태로 저장된다. (오라클의 IOT 를 생각)

-      MVCC (Multi Version Concurrency Control) 를 이용해 LOCK 없이 읽기 작업이 가능

-      FK 지원

-      Deadlock 감지 (Rollback 부하가 가장 작은 세션을 강제종료한다.)

 

4.    Primary Index and Secondary Index on InnoDB

 



Ref.C 에서 발췌

 

InnoDB 에서의 Index Primary Index Secondary Index 로 나뉘어진다.

Primary Index 는 테이블 생성할 때 지정하게 되어 있으며, 만약 지정하지 않는 경우

MariaDB 가 적합하다고 생각하는 컬럼을 Primary Index 컬럼으로 지정하여 생성하게 된다.

 

Secondary Index Primary Index 외에 생성하는 모든 Index 에 해당된다.

 

Secondary Index 에는 인덱싱 된 컬럼의 값 외에 Primary Index 의 키 컬럼 값을 포함한다.

이 값을 가지고 Primary Index 를 탐색하여 값을 찾게 된다.

 

이러한 특징 때문에 Primary Index 키컬럼은 싱글컬럼의 짧은 길이의 데이터 타입을 사용한다.

반면 Primary Index 로 결합인덱스를 사용하고 긴 길이의 데이터 타입을 사용하게 되면

Secondary Index 의 특징 때문에 인덱스 자체 크기가 커지고 이로인해 I/O 가 다량 발생하게 된다.

 

 

5.    References

A.     Real MySQL | 위키북스

B.     MariaDB | https://kb.askmonty.org/en/

C.     XtraDB / InnoDB internals in drawing | http://www.mysqlperformanceblog.com/2010/04/26/xtradb-innodb-internals-in-drawing/

D.     Index-Organized Tables and Clustered Indexes | http://use-the-index-luke.com/sql/clustering/index-organized-clustered-index