Mysql/MySQL 아키텍처 심층 분석
Redo, Undo, Doublewrite Buffer 이해
DEVLIB
2025. 4. 18. 15:56
728x90
InnoDB Redo / Undo / Doublewrite Buffer 심층 이해
1. Redo Log
무엇인가?
Redo = "변경된 것을 다시 적용"하기 위한 로그
트랜잭션 커밋 이후에도,
서버 장애가 발생했을 때 데이터를 복구할 수 있도록 변경 기록을 보존하는 메커니즘입니다.
주요 역할
- Crash Recovery: 장애 발생 시, 아직 디스크에 저장되지 않은 변경 사항을 복구
- Durability (ACID의 D)
구조
- Redo Log Buffer (메모리)
- 변경사항이 버퍼에 임시 저장됨
- Redo Log Files (ib_logfile0, ib_logfile1, ...)
- 버퍼에서 주기적으로 디스크에 플러시
- LSN (Log Sequence Number): Redo 기록의 절대 위치
Redo 작성/플러시 흐름
1. 데이터 변경 → Redo Buffer 기록
2. 트랜잭션 커밋
3. Redo Buffer 플러시 (fsync 디스크 기록)
4. 실제 데이터 페이지(Buffer Pool)는 나중에 Write 가능 (Lazy Write)
※ innodb_flush_log_at_trx_commit 값에 따라 플러시 타이밍 조정 가능
2. Undo Log
무엇인가?
Undo = "변경을 취소하거나 과거 상태로 복원"하기 위한 기록
트랜잭션 중간에 문제가 발생하거나, MVCC 기반으로
이전 버전 데이터를 제공해야 할 때 사용합니다.
주요 역할
- 트랜잭션 롤백 지원
- MVCC (Multi-Version Concurrency Control) 지원
- Isolation Level (Repeatable Read 등) 보장
구조
- Undo Segment: Undo 레코드를 묶은 논리적 단위
- Undo Page: 16KB 단위로 Undo 데이터 저장
- Undo Tablespace: Undo 저장용 별도 공간 (undo_001.ibd, undo_002.ibd 등)
Undo 작성/사용 흐름
1. 데이터 변경 전, 현재 데이터를 Undo에 저장
2. 다른 트랜잭션이 과거 Snapshot을 조회할 때 Undo 사용
3. 트랜잭션 롤백 시 Undo를 읽어서 원복
4. 필요 없어진 Undo는 Purge Thread가 정리
3. Doublewrite Buffer
무엇인가?
Doublewrite Buffer = "데이터 파일 손상을 막기 위한 이중 기록 공간"
디스크에 데이터 페이지를 저장할 때,
페이지 손상(Torn Page) 현상을 방지하기 위해 도입된 기술입니다.
주요 역할
- 디스크 쓰기 중간에 장애가 발생해도 데이터 손상 방지
- 장애 복구 시, 완전한 페이지만 복구 대상으로 인정
구조
- Buffer Pool 안에 Doublewrite Buffer 존재
- 약 2MB 크기
- 변경된 데이터 페이지를 먼저 여기에 기록한 후
- 그다음 실제 데이터 파일에 기록
Doublewrite 쓰기 흐름
1. Dirty Page를 Doublewrite Buffer에 먼저 저장
2. Doublewrite Buffer를 디스크에 플러시
3. 그 이후, 실제 데이터 파일(.ibd)에 저장
Redo, Undo, Doublewrite Buffer 상호 관계
요소 |
주목적 | 저장 시점 | 장애 복구 시 사용 여부 |
Redo Log | 변경 사항 재적용 (Durability) | 변경 즉시 버퍼에 기록 | Redo Apply |
Undo Log | 롤백 및 MVCC 지원 (Consistency, Isolation) | 변경 전 상태 저장 | Rollback 필요 시 |
Doublewrite Buffer | 디스크 손상 방지 | Dirty Page Flush 시 사용 | (손상 여부 확인) |
복구(Recovery) 전체 흐름 요약
Crash Recovery Start
↓
1. Redo Log 분석 → 아직 디스크에 적용되지 않은 변경사항 반영 (Redo Apply)
↓
2. Undo Log 분석 → 완료되지 않은 트랜잭션 롤백 (Undo Rollback)
↓
3. Doublewrite 영역 확인 → 손상된 페이지 복구
↓
Recovery 완료
실전 운영/튜닝 포인트
항목 | 튜닝 전략 |
Redo Log 크기 | 충분히 크게 설정 (innodb_log_file_size) |
Redo Buffer 크기 | 대량 커밋 빈도가 높으면 증가 (innodb_log_buffer_size) |
Undo Cleanup 최적화 | Long Transaction 관리 → History List 최소화 |
Doublewrite 최적화 | 일반적으로 활성화 유지 권장 (안정성 확보) |
Checkpoint 주기 | innodb_io_capacity 설정으로 제어 가능 |
핵심 파라미터 요약
변수명 | 설명 |
innodb_log_file_size | Redo Log 파일 크기 |
innodb_log_buffer_size | Redo Log Buffer 크기 |
innodb_undo_log_truncate | Undo 자동 축소 여부 |
innodb_doublewrite | Doublewrite 기능 활성화 여부 |
innodb_flush_log_at_trx_commit | 트랜잭션 커밋 시 Redo 플러시 정책 |
LIST