본문 바로가기
Today I Learned 2024. 12. 18.

(24.12.18) MVCC 매커니즘

 

최근 몸살과 장염으로 컨디션이 안좋은 가운데에서도,

 

저번에 학습했던 DB 격리수준의 연장선으로

 Read  Lock을 걸지 않고도 동시성 제어를 하는 매커니즘으로 MVCC에 대해서 한번 정리하면서

DB의 CS 지식에 대해서 간단히 찾아보고 정리하고자 했다.


MVCC, Multi-Version Concurrency Control

  • 데이터베이스에서 락을 최소화 하면서, 동시성 제어를 위한 메커니즘
    • MySQL의 InnoDB 엔진에서 사용하는 주요 기법 (아래 다시 정리)
  • 읽기 작업 read 과 쓰기 작업 write 이 충돌하지 않도록 데이터를 변경할 때 데이터의 복사본(버전)을 생성하여 관리하는 방식
  • 레코드 단위로 여러 데이터 버전을 관리하며, 데이터 읽기 시 락을 최소화하여 동시성을 높이는 구조
    • 읽기 작업을 Lock을 거는 설정하지 않도록 방식
    • 트랜잭션은 참조할 데이터 버전을 선택을 해서 읽을 수 있도록 할 수 있음
  • 트랜잭션 시작 시점의 데이터를 기반으로 스냅샷을 제공하며, 트랜잭션 간 간섭을 최소화하는 구조

MVCC 활용과 원리

  • Undo Log를 활용해 이전 데이터 버전을 저장
    • 읽기 작업은 트랜잭션이 커밋 되지 않았을 경우, 다른 트랜잭션은 Undo Log를 참조하여 일관된 데이터를 제공하는 구조
    • 트랜잭션이 데이터를 수정할 때마다 Undo Log에 저장
    • → 변경된 후에는 다른 새로운 버전이 생성되는 형태
    • 스냅샷을 구현을 할때 기반이 되는 기초
      • 레코드는 데이터의 버전 관리의 역할에 국한되지만, 스냅샷은 트랜잭션의 격리와
  • 스냅샷 Snapshot 기반의 작업
    • MySQL(InnoDB)에서 사용되며 Repeatable Read 격리 수준에서 스냅샷 읽기를 통해 동일 트랜잭션 내 일관성을 보장하는 역할
    • 버전단위가 아닌 트랜잭션이 시작하는 시점의 상태를 의미
      • 이 때, MVCC는 레코드의 버전을 확인 후, 가장 최근 유효 버전을 반환
    • Snapshot을 사용하는 Repeatable Read 격리수준에 따라서 변경이 가능

Redo log 와 Undo Log

Redo log

  • MySQL에서의 데이터 ‘지속성’ 을 보장하기 위한 로그
  • Transaction 커밋 전 변경 사항을 기록, 비정상적인 종료에도 데이터를 복구가 가능
    • ‘복구’ 에 초점이 맞춰있음
  • WAL(Write Ahead Log) 방식
    • 데이터가 실제로 디스크에 기록되기 전(커밋 전)에 Redo Log에 먼저 기록하는 방식
    • 커밋 시 → 디스크와 동기화 하여 영속성을 보장하는 방식, 데이터의 보존을 목적
  • 구성
    • Redo Log Buffer: 메모리 내 버퍼로, Redo Log가 임시로 저장되는 공간
    • Redo Log Files: 디스크에 저장된 실제 로그 파일로, 로그가 순차적으로 일정 주기마다 기록됨(Circular Writing 구조)

Undo log

  • 트랜잭션이 롤백될 때 데이터를 원래 상태로 복구하기 위한 로그
    • ‘원자성’ 보장 로그
  • MVCC에서 데이터 변경 전에 저장, Transaction의 롤백일 때 이전 상태 복원을 위해 사용
    • 이전 버전을 저장했다가 불러오는 형태
  • 구성 요소
    • Undo Segments: Undo Log가 저장되는 내부 구조로, InnoDB(MySQL에서 사용하는 방식)에서 관리
    • Undo Tablespace: Undo Log가 디스크에 기록되는 영역

MySQL의 InnoDB

  • ACID 준수 지원
    • Isolation (고립성): 트랜잭션 간 간섭 방지(MVCC 활용)
    • Durability (지속성): Redo Log를 활용해 커밋된 데이터가 장애 발생 시에도 복구 가능
  • 행 단위 잠금(Row-Level Locking)
    • 특정 행만 잠그기 때문에 동시성(Concurrency) 처리에 유리
    • 테이블 단위 잠금보다 충돌 가능성을 낮추어 높은 처리량 제공
      • 작은 단위인 행을 잠가서 다른 Trasaction이 동시에 해당 행에 접근해서 변경을 하는 것을 막는 것 (INSERT UPDATE DELETE 충돌 방지)
      • MyISAM 과 MEMORY 형식은 테이블 잠금만을 채택
  • MVCC 사용 유용
    • 트랜잭션 간 동시성을 보장하기 위해 동일 데이터를 읽는 트랜잭션에 대해 스냅샷 기반 읽기를 제공.
      • 읽기 작업 시 잠금 불필요, 쓰기 작업만 잠금 발생
    • Undo Log를 활용해 데이터의 이전 버전 관리 가능
  • InnoDB의 Redo Log와 Undo Log 모두 지원
    • Undo Log 역시 ****MVCC에서 스냅샷 읽기를 위해 이전 데이터 버전 저장용

장애 복구 기능

  • 장애 발생 시 Redo Log와 Doublewrite Buffer를 통해 데이터 복구
  • Redo Log
    • Transaction 자체에서 커밋된 Transaction의 복구를 담당
    • InnoDB 로그파일을 사용
  • Doublewrite Buffer
    • 데이터 손상에 대한 복구를 목적
    • 데이터 페이지를 두 번 쓰는 메커니즘

InnoDB의 장점 정리

  • 안정성과 일관성
    • 트랜잭션 지원과 ACID 준수를 통해 데이터 무결성과 안정성 제공
  • 높은 동시성
    • 행 단위 잠금과 MVCC를 통한 뛰어난 동시성 처리.
  • 장애 복구
    • Redo Log와 Doublewrite Buffer를 활용해 신뢰성 높은 복구

컨디션이 좋지 않지만, 쓰면서 한번더 읽어보고 외우기도 하면서 학습을 계속 이어갈 수 있도록 했다.