kimyu0218
  • [mysql] InnoDB 스토리지 엔진 훑어보기
    2025년 03월 25일 22시 00분 45초에 업로드 된 글입니다.
    작성자: @kimyu0218

    MySQL 서버는 사람의 머리 역할인 MySQL 엔진과 손발 역할의 스토리지 엔진으로 구분된다.

    • MySQL 엔진 : 클라이언트의 접속과 요청을 처리하고, 파서와 전처리기, 옵티마이저로 SQL 실행을 최적화한다
    • 스토리지 엔진 : 데이터를 디스크에 저장하고, 디스크로부터 데이터를 조회한다

    InnoDB는 스토리지 엔진의 구현체 중 하나로, 가장 많이 사용되는 스토리지 엔진이다.

    InnoDB 아키텍처

    지금부터 InnoDB의 주요 구성요소에 대해 알아보자.

     
    버퍼 풀은 InnoDB의 가장 핵심적인 부분으로, 일종의 메모리다.

    1. 디스크의 데이터를 메모리에 캐싱한다.
    2. 쓰기 작업을 지연시켜 추후 일괄 처리한다.

    캐싱과 쓰기 지연을 통해 불필요한 디스크 IO를 줄이고 빠르게 응답한다.

    버퍼 풀은 메모리를 페이지 단위로 작게 쪼개어 관리한다. 디스크에서 조회한 데이터를 페이지에 나누어 저장하고, 이로 인해 사용 중인 페이지와 사용하지 않는 페이지가 생긴다.

    버퍼 풀은 페이지를 관리하기 위해 세 가지 자료 구조를 사용한다.

    1. LRU 리스트 : 사용 중인 페이지 관리
    2. 플러시 리스트 : 더티 페이지 관리
    3. 프리 리스트 : 사용하지 않는 페이지 관리

    LRU 리스트와 프리 리스트는 각각 사용 중인 페이지와 사용하지 않는 페이지를 관리한다. 앞서 말했듯이 버퍼 풀은 쓰기 지연을 제공하는데, 플러시 리스트에서 수정/삭제 작업에 의해 기존 데이터와 달라진 더티 페이지를 관리한다.

    LRU 리스트는 기존의 LRU 알고리즘과 달리, MRU 알고리즘을 함께 사용한다. 최근 사용된 페이지는 MRU 알고리즘, 최근에 사용되지 않은 페이지는 LRU 알고리즘에 의해 관리된다. (오랫동안 사용되지 않은 페이지가 교체된다는 점에서 LRU 알고리즘이 맞지만, 새롭게 사용된 페이지가 중간 지점에 삽입되면서 두 부분으로 구분한다) 이는 디스크로부터 읽어온 페이지를 오랫동안 메모리에 유지하여 디스크 IO를 최소화하기 위함이다.

    변경 사항을 로그 버퍼에 기록했다가 리두 로그 파일에 플러시한다

    데이터가 수정되면 InnoDB는 곧바로 디스크에 쓰는 대신(쓰기 지연), 변경 사항을 리두 로그에 기록하고, 버퍼 풀 페이지를 수정한다. 플러시 리스트는 이러한 더티 페이지 목록을 관리하고, 적절한 시점에 디스크에 영구적으로 반영한다.

    리두 로그는 하나 이상의 파일에 연결하여 연결 리스트처럼 사용되며, 각 엔트리는 더티 페이지와 매핑된다. 하지만 데이터 변경이 계속 발생하면 엔트리는 새로운 더티 페이지로 덮어 쓰인다. InnoDB는 리두 로그에서 사용할 수 있는 공간을 구분하기 위해 LSN(Log Sequence Number)을 이용한다.

    재사용되는 리두 로그 파일과 달리 LSN은 계속 증가한다. 마지막 리두 로그의 LSN과 마지막으로 동기화 된 LSN의 차이가 활성 리두 로그 공간(재사용할 수 없는 공간)의 크기다.

    버퍼 풀에는 체인지 버퍼라는 공간도 있는데, 이는 인덱스를 쓰기 지연하기 위한 영역이다.

    댓글