미스터 역마살
Mysql InnoDB 본문
InnoDB란?
Innodb는 Mysql에서 사용하는 데이터베이스 엔진이다. 트랜잭션 세이프 스토리지 엔진으로서 대용량 데이터를 처리 할 때 많은 장점을 가지고 있다. 또한 Innodb는 오라클과 비슷한 기능들을 제공 하고 있다. (commit, rollback, 장애복구, row-level locking, 외래키 등)
InnoDB 아키텍처
InnoDB는 크게 메모리 영역, CPU 영역, 디스크 스토리지 영역으로 구분할 수 있다.
메모리, 파일 영역
1. Innodb buffer pool
Innodb스토리지 엔진에서 가장 핵심적인 부분으로 디스크의 데이터 파일이나 정보를 메모리에 캐시해두는 공간이다. 오라클의 데이터 버퍼캐시 같은 역할은 한다고 생각하면 될듯 하다. SELECT시 버퍼캐시에 해당 페이지가 없다면 ibdata를 뒤져서 버퍼풀에 기록하고 결과값을 반환한다.
insert구문이 발생 시 해당 데이터가 캐시 안되어있으면 캐시도 생성하고 물리적인 파일에도 내용 기술한다.
변경된 데이터를 모아서 처리하기 때문에 랜덤한 디스크 작업의 횟수를 줄일수 있다. 더티페이지는 주기적 또는 특정 조건이 되면 체크포인트가 발생하는데 이때 wirte thread가 필요한 만큼의 데이터 페이이지만 디스크로 기록 한다. 체크포인트가 발생한다고 해서 버퍼풀의 모든 더티페이지가 디스크로 기록되는것은 아니다.
버퍼풀은 쓰기 작업을 지연시켜 일괄적으로 처리할 수 있게 해주는 버퍼 역할도 같이 한다.일반적으로 innodb_buffer_pool_size는 전체 장착된 물리 메모리의 50~80 수준의 크기를 잡는것이 좋다.
2. Undo 로그
언두 영역은 데이터가 변경 되었을 때 (Update, Delete) 변경되기 이전의 데이터를 보관하는 곳이다.
Update 문을 실행하면 실제 데이터 파일에는 변경된 데이터가 저장 된다. 그리고 변경되지 이전의 데이터를 언두 영역에 백업시켜 놓는다. 이 상태에서 commit을 하게 되면 현재 상태가 그대로 유지되고, rollback을 시키면 언두 영역의 백업된 데이터를 다시 데이터 파일로 복구 시킨다.
언두의 데이터는 크게 두가지 용도로 사용되는데, 첫번째는 롤백을 위한 용도이며, 두번째는 높은 동시성을 제공하는데 사용 된다.
3. Insert buffer
데이터가 Insert, update 될때 데이터 파일만 변경되는 것이 아니라 인덱스 또한변경되어야 한다. 그러나 인덱스 업데이트 작업은 디스크의 많은 자원을 소모하게 되는데 그 때 필요한 것이 Insert buffer이다. 인덱스 변경이 필요할 때 인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트를 수행하고 그렇지 않다면 이를 즉시 실행하지 않고 임시공간에 저장해 두고 바로 사용자에게 결과를 반환하는 형태로 성틍을 향상 시키게 되는데 이때 사용하는 임시 메모리 공간이 인서트 버퍼이다.인서트 버퍼에 임시로 저장되는 인덱스 레코드 조각은 이후 백그라운드 인서트 버퍼 머지 스레드에 의해 병합 된다.
4. Redo 로그 및 로그 버퍼
쿼리로 데이터를 변경 할 때 순차적으로 변경된 내용을 기록하는 파일을 리두로그 라고 한다.
대용량 작업에서 리두 로그 기록 작업이 큰 문제가 되는데 이러한 부분을 보완하기 위해 최대한 ACID 속성을 보정하는 수준에서 버퍼링하게 된다. 로그 버퍼는 이러한 리두 로그 버퍼링에 사용되는 공간이다. 이 크기를 innodb_log_buffer_size로 조정할 수 있는데, 4~16M로 설정하는것이 좋다.
설정값이 클수록 디스크 사용량이 줄어서 성능이 향상되지만, 시스템 다운 시 손실되는 트랜잭션 양도 증가 한다. 반면에 크기가 작으면 로그 버퍼를 로그파일에 쓰기 위한 부하가 많이 발생될 수도 있다.
5. 테이블 스페이스
디스크 스토리지 영역 중 테이블 스페이스는 시스템 테이블 스페이스와 유저 테이블 스페이스로 크게 두가지로 나뉜다. 시스템 테이블 스페이스는 ibdata1에 해당되고 유저 테이블 스페이스는 테이블명.ibd에 속한다.
유저 테이블 스페이스에는 인덱스 파일과 데이터 파일이 속해 있고, 시스템 테이블에는 dictonary(테이블 정보등) 및 undo등 적지 않은 내용들이 속해 있다.
처음 아무것도 설정하지 않았다면 유저 테이블 스페이스는 존재하지 않는다.
my.cnf에서 "innodb_file_per_table"을 설정해야만 유저테이블스페이스가 생성되고, 이를 좋다 나쁘다 이야기를 간간히 하시는것 같은데, 운영편의상 무조건 하는게 좋다고 권고한다.
운영 중간에 innodb_file_per_table을 설정하면 ibdata1이 이미 존재하던 데이터와 꼬이는(복원 등 하는 사례 아닌 이상은 안 꼬임) 현상이 발생되므로 처음 설치 시 설정해놓고 시작하는것을 권고 한다.
InnoDB의 장점
우수한 성능
다수의 사용자가 동시접속을 할 수 있고, 대용량 데이터 처리를 할 수 있다. 데이터 테이블과 인덱스를 테이블 스페이스에 저장 하고 테이블 스페이스는 파일과 파티션으로 구성되어 있다. 따라서 성능이 우수하다.
데이터 무결성 보장
InnoDB설계시 데이터 무결성에 중점을 두었기 때문에 데이터 무결성이 좋다.
장애 복구 기능
단순하게 장애 복구를 하지않고 논리적으로 장애 복구를 수행한다.
InnoDB의 단점
Deadlock 발생
NODE간 데이터 체크로 인해서 Deadlock이 발생할 가능성이 존재함
많은 자원 소모
대용량 처리를 하게 된다면, 순간적으로 많은 자원을 소모 한다.
데이터 복구의 어려움
단순하게 파일 백업으로 복구를 하는게 아니라 특정한 방법을 사용하여 복구를 수행함
MyISAM vs InnoDB
InnoDB가 유리한 경우
- 대용량 데이터를 컨트롤 하는 경우
- 트랜잭션 관리가 필요한 경우
- 복구가 필요할 경우
- 정렬등의 구문이 들어가는 경우
- IUD등이 빈번하게 발생하는 경우(Row-Level locking때문)
MyISAM이 유리한 경우
- 읽기 위주의 작업만 필요한 경우
- 전문 검색이 필요한 경우
- 트랜잭션이나 복구등이 필요 없을 경우
- 한번에 대량 데이터를 입력하는 배치성 테이블