InnoDB 버퍼 풀

버퍼풀의 설정과 구조

책너두 6기 10일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.108 ~ p.119

내용정리

04 아키텍처

4.2.7 InnoDB 버퍼 풀

  • InnoDB 스토리지 엔진에서 가장 핵심적인 부분
  • 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간
  • 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼 역할
4.2.7.1 버퍼 풀의 크기 설정
  • 운영체제와 각 클라이언트 스레드가 사용할 메모리도 충분히 고려해서 설정
  • 시스템 변수 innodb_buffer_pool_size로 동적 설정 가능
  • 운영체제의 전체 메모리 공간이 8GB 미만이라면 50% 정도만 InnoDB 버퍼 풀로 설정
  • 나머지 메모리 공간은 MySQL 서버와 운영체제, 그리고 다른 프로그램을 위한 공간으로 설정 권장
    • 전체 메모리가 그 이상이면 버퍼 풀의 크기를 점차 증가시키며 최적점을 찾을 것
4.2.7.2 버퍼 풀의 구조
  • 버퍼 풀이라는 거대한 메모리 공간을 페이지 크기(innodb_page_size시스템 변수로 설정)의 조각으로 쪼갠다
  • InnoDB 스토리지 엔진이 데이터를 필요로 할 때 해당 페이지를 읽어 각 조각에 저장한다
  • 페이지 크기 조각 관리를 위한 LRU 리스트, 플러시 리스트, 프리 리스트라는 3개 자료구조를 관리한다.
    • LRU(Least Recently Used) : 디스크로부터 한 번 읽어온 페이지를 최대한 오랫동안 메모리에 유지해서 읽기를 최소화
    • 플러시(Flush) : 디스크로 동기화되지 않은 데이터를 가진 데이터 페이지(더티 페이지)의 목록 관리
    • 프리(Free) : InnoDB 버퍼 풀에서 실제 사용자 데이터로 채워지지 않은 비어 있는 페이지들의 목록
4.2.7.3 버퍼 풀과 리두 로그

InnoDB의 버퍼 풀은 디스크에서 읽은 상태로 전혀 변경되지 않은 클린 페이지(Clean Page)와 함께 insert,update,delete 명령으로 변경된 데이터를 가진 더티 페이지(Dirty Page)도 가지고 있다. 더티 페이지는 언젠가 디스크로 기록되야 하며 버퍼 풀에 무한정 머무를 수 있지 않다.

리두 로그는 1개 이상의 고정 크기 파일을 연결해서 순환 고리처럼 사용한다. 데이터 변경이 발생하면 리두 로그 파일의 로그 엔트리는 다시 새로운 것으로 덮어 쓰인다. 전체 리두 로그 파일에서 재사용 가능한 곳과 불가능한 곳을 구분해서 관리하는데 후자를 활성 리두 로그(Active Redo Log)라고 한다.

리두 로그 파일의 공간은 순환되서 재사용되지만 로그 포지션은 증가하는데 이를 LSN(Log Sequence Number)라고 한다. InnoDB 스토리지 엔진은 주기적으로 체크포인트 이벤트를 통해 리두 로그와 버퍼 풀의 데이터 페이지를 디스크로 동기화한다. 가장 최근 체크포인트 지점의 LSN이 활성 리두 로그 공간의 시작점이 된다. 최근 체크포인트의 LSN과 마지막 리두 로그 엔트리의 LSN의 차이를 체크포인트 에이지(Checkpoint Age)라고 한다. 이는 활성 리두 로그 공간의 크기를 일컫는 것이다.

버퍼 풀의 더티 페이지는 특정 리두 로그 엔트리와 관계가 있다. 체크포인트가 발생하면 LSN 보다 작은 리두 로그 엔트리와 관련된 더티 페이지는 디스크로 동기화되야 한다. 이 LSN보다 작은 LSN값을 가진 로그 엔트리도 디스크로 동기화 되야 한다.

4.2.7.4 버퍼 풀 플러스(Buffer Pool Flush)
4.2.7.4.1 플러시 리스트 플러시

플러시 리스트에서 오래전에 변경된 데이터 페이지 순서대로 디스크에 동기화 하는 작업을 수행하기 위해 호출하는 함수.

관련된 시스템 변수

  • innodb_page_cleaners
  • innodb_max_dirty_pages_pct_lwm
  • inoodb_max_dirty_pages_pct
  • inoodb_io_capacity
  • inoodb_io_capacity_max
  • innodb_flush_neighbors
  • inoodb_adaptive_flushing
  • inoodb_adaptive_flushing_lwm
4.2.7.4.2 LRU 리스트 플러시

LRU 리스트에서 사용 빈도가 낮은 데이터 페이지들을 제거해서 새로운 페이지들을 읽어올 공간을 만드는 함수.

4.2.7.5 버퍼 풀 상태 백업 및 복구

show status like 'Innodb_buffer_pool_dump_status'\G

구문을 통해 버퍼 풀 복구 과정의 진행도를 알 수 있다.

set global innodb_buffer_pool_load_abort=ON;

위 구문으로 버퍼 풀 복구를 멈출 수 있다.

4.2.7.6 버퍼 풀의 적재 내용 확인

information_schema 데이터베이스에 innodb_cached_indexes 테이블의 인덱스별로 데이터 페이지가 얼마나 InnoDB 버퍼 풀에 적재돼 있는지 확인할 수 있다.

응용하면 테이블 전체(인덱스 포함) 페이지 중에서 어느 정도 비율이 InnoDB 버퍼 풀에 적재돼 있는지 확인할 수도 있다.

읽고나서

버퍼풀에 대해 배웠다. 이걸 꼭 다 알고 외워야 하는지, 이해하고 넘어간 뒤 나중에 다시 찾아봐서 충분히 사용할 수 있을 정도로 유지해야할지 잘 모르겠다.. 지금까지 내가 느낀 개발 공부는 후자였는데;