Mysql/MySQL 아키텍처 심층 분석
InnoDB Storage Engine 상세
DEVLIB
2025. 4. 18. 15:48
728x90
InnoDB Storage Engine 심층 분석
InnoDB는 MySQL의 기본 스토리지 엔진입니다.
ACID 트랜잭션과 Crash Recovery, 외래키(Foreign Key) 지원이 특징이며,
대규모 트래픽 시스템에서도 견디도록 설계되어 있습니다.
1. InnoDB 아키텍처 개요
+---------------------------+
| Connection Threads |
+---------------------------+
| Query Processing Layer |
+---------------------------+
| InnoDB Storage Engine |
| ├── Buffer Pool |
| ├── Transaction System |
| ├── Locking System |
| ├── Insert/Change Buffer |
| ├── Doublewrite Buffer |
| ├── Adaptive Hash Index |
| └── Background Threads |
+---------------------------+
| Storage Layer (Data Files)|
+---------------------------+
2. InnoDB의 주요 컴포넌트
2.1 Buffer Pool
- 메모리 상에서 데이터 페이지, 인덱스 페이지, Undo 로그 등을 캐싱
- 디스크 IO를 줄여 성능 최적화
- 내부적으로 LRU 관리, Flush 관리 수행
- 세부 설명은 앞에서 다뤘던 것처럼 Instance/Chunk 구조 존재
2.2 Transaction System
- ACID 보장 (Atomicity, Consistency, Isolation, Durability)
- Undo Logs 이용: 롤백, MVCC 구현
- Redo Logs 이용: 시스템 장애 시 복구 가능
- 트랜잭션 Isolation Levels:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ (MySQL 기본값)
- SERIALIZABLE
MySQL InnoDB는 MVCC (Multi-Version Concurrency Control) 로 동시성을 극대화합니다.
2.3 Locking System
- Record Lock: 특정 레코드에 대한 Lock
- Gap Lock: 레코드 사이의 간격(Gap)에 Lock 설정 (Phantom Read 방지)
- Next-Key Lock: Record Lock + Gap Lock 조합
- Intent Lock: 테이블 수준 의도 Lock
- Auto-Increment Lock: 자동 증가 컬럼 관리용
Deadlock 감지 및 자동 해결 기능 탑재
2.4 Insert Buffer (Change Buffer)
- 보조 인덱스(Secondary Index) 수정 작업을 메모리에 임시 저장
- 디스크 Random IO를 줄여서 Write 성능 향상
- 백그라운드 스레드가 비동기적으로 Merge 수행
주요 포인트
- Primary Key는 Insert Buffer 적용 X
- Secondary Index만 적용 O
- 설정: innodb_change_buffering
2.5 Doublewrite Buffer
데이터 손상 방지 메커니즘
- InnoDB는 데이터를 디스크에 쓸 때 두 번 기록
- 먼저 Doublewrite Buffer에 기록
- 이후 실제 데이터 파일(.ibd)로 기록
- 서버 장애 발생 시, Doublewrite 영역을 통해 복구 가능
장점:
- Torn Page 방지 (Partial Write 발생해도 복구 가능)
단점:
- 추가 디스크 쓰기 오버헤드 발생 (하지만 안정성 이득이 더 큼)
2.6 Adaptive Hash Index (AHI)
- 자주 조회되는 페이지를 감지해 메모리 내 해시 인덱스를 자동 생성
- 테이블 스캔 대신 해시 검색으로 성능 대폭 향상 가능
- 자동으로 생성/삭제 관리
- 설정: innodb_adaptive_hash_index
주의:
- Lock 경합(Contestion) 이슈가 있을 경우 AHI를 비활성화하는 경우도 있음
2.7 Background Threads
- Page Cleaner Thread: Dirty Page를 디스크에 플러시
- Purge Thread: 오래된 Undo 레코드 정리
- IO Thread: 디스크 읽기/쓰기 비동기 처리
- Lock Monitor Thread (디버깅용)
Background Thread 최적화는 대규모 트래픽 시스템에서는 필수입니다.
3. InnoDB 데이터 저장 구조
항목 | 설명 |
Tablespace | 테이블/인덱스를 저장하는 물리적 공간 (.ibd 파일) |
Segment | Index, Data, Undo 데이터로 세분화된 관리 단위 |
Extent | 64개의 연속된 페이지 묶음 (1MB) |
Page | 데이터 저장의 기본 단위 (16KB 기본) |
Record | Page 안에 저장되는 실제 데이터 레코드 |
요약 흐름:
Tablespace
└── Segment
└── Extent
└── Page
└── Record
InnoDB 특화 기능 요약
기능 | 설명 |
MVCC | 비잠금 읽기(Non-locking Read) 지원 |
Foreign Key Constraints | 데이터 무결성 보장 |
Crash Recovery | 장애 발생 시 Redo Log, Doublewrite Buffer로 자동 복구 |
Hot Online DDL | 일부 DDL 작업 중에도 시스템 사용 가능 (8.0 이상 강화) |
운영 관점 주요 파라미터 요약
변수 | 설명 |
innodb_buffer_pool_size | Buffer Pool 크기 |
innodb_log_file_size | Redo Log 파일 크기 |
innodb_flush_log_at_trx_commit | 트랜잭션 커밋시 Redo 플러시 정책 |
innodb_change_buffering | Change Buffer 사용 여부 |
innodb_adaptive_hash_index | AHI 기능 활성화 여부 |
LIST