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