포스트

MySQL 엔진 아키텍처

MySQL서버는 MySQL 엔진과 스토리지 엔진으로 구분됨클라이언트에서 요청한 쿼리를 처리하는 부분이다. MySQL서버는 하나의 MySQL엔진만 사용한다.

MySQL 엔진 아키텍처
  • MySQL서버는 MySQL 엔진스토리지 엔진으로 구분됨

MySQL 엔진

  • 클라이언트에서 요청한 쿼리를 처리하는 부분이다.
  • MySQL서버는 하나의 MySQL엔진만 사용한다.

스토리지 엔진

  • 실제 데이터를 디스크 스토리지에 저장하거나, 디스크 스토리지에서 데이터를 읽어오는 엔진이다.
  • 즉, MySQL 엔진이 필요로하는 데이터를 가져오는 엔진이다.
  • MySQL서버는 여러 개의 스토리지 엔진을 동시에 사용할 수 있다.
  • 테이블 정의 시 사용할 스토리지 엔진을 지정할 수 있다. 이를 통해 해당 테이블의 모든 읽기 작업이나 변경 작업은 정의된 스토리지 엔진이 처리할 수 있다.`
    1
    
    mysql> CREATE TABLE test_table (fd1 INT,  fd2 INT) ENGINE=INNODB;
    
  • 스토리지 엔진의 종류는 MyISAMInnoDB가 있다.

핸들러 API

  • MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽어야 할 때, 각 스토리지 엔진에 요청한다.
  • 이를 핸들러 요청이라고 하며, 핸들러 요청에서 사용되는 API를 핸들러 API라고 한다.
  • 스토리지 엔진은 핸들러 API를 통해 MySQL 엔진과 데이터를 주고받는다.

MySQL 스레딩 구조

  • MySQL서버는 프로세스 기반이 아닌, 스레드 기반으로 동작한다.
  • 이때 스레드는 Foreground스레드와 Background스레드로 나뉜다.

Foreground 스레드

  • 실제 클라이언트 사용자가 요청하는 쿼리 문장을 처리하는 스레드이다. 앞단에서 사용자와 통신하기 때문에 Foreground스레드이며, 사용자 스레드라고 불리기도 한다.
  • 사용자 당 하나의 Foreground스레드가 할당되며, 사용자의 커넥션이 종료되면 해당 스레드는 스레드 캐시로 되돌아간다.
  • 이때 스레드 캐시에는 유지할 수 있는 최대 스레드 개수가 정해져 있다.
  • 만약 스레드 캐시에 일정 개수 이상의 대기 스레드가 있으면 스레드 종료 시에 스레드 캐시에 넣지 않고 종료시켜 최대 스레드 개수를 유지한다.
  • 최대 스레드 개수는 thread_cache_size라는 시스템 변수로 관리할 수 있다.

  • 데이터를 MySQL의 버퍼 혹은 캐시에서 가져온다.
  • 버퍼, 캐시에 없는 경우, 직접 디스크 혹은 인덱스 파일에서 데이터를 읽어와 작업을 처리한다.
  • InnoDB 테이블에서는 Foreground스레드는 버퍼, 캐시까지만 처리하고, 나머지 버퍼에서 디스크로의 기록 작업은 Background스레드가 처리한다.

Background 스레드

  • Foreground스레드에서 작업한 로그를 디스크로 기록하거나, 버퍼의 데이터를 디스크로 쓰는 작업을 맡는다.
스토리지 엔진이 InnoDB일 경우
  • 읽기 작업을 제외한 쓰기 작업은 모든 요청마다 디스크에 기록하지 않고 버퍼링해서 일괄 처리한다.
  • 즉, 쓰기작업으로 데이터가 변경되는 경우, 해당 데이터가 디스크에 저장될 때까지 대기하지 않아도 된다.
    스토리지 엔진이 MyISAM일 경우
  • 쓰기 작업, 읽기 작업 모두 모든 요청마다 사용자 스레드에서 처리한다.
  • 데이터가 디스크의 파일로 저장될 때까지 기다려야한다. (버퍼 기능 X)

메모리 할당

  • MySQL에서 사용되는 메모리 공간은 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다.
  • 메모리 영역은 수많은 스레드가 공유해서 사용하는 공간인지에 따라 구분된다.

글로벌 메모리 영역

  • Foreground스레드 (클라이언트 스레드)의 수와 무관하게 하나의 메모리 공간이 할당된다.
  • 필요에 따라 추가로 생성된 글로벌 메모리 영역이라도 모든 스레드에 의해 공유된다.
  • 다음과 같은 글로벌 메모리 영역이 존재한다.
    • 테이블 캐시
    • InnoDB 버퍼 풀
    • InnoDB 어댑티브 해시 인덱스
    • InnoDB 리두 로그 버퍼

로컬 메모리 영역

  • Foreground스레드가 쿼리를 처리하기 위해 사용하는 메모리 여역이다.
  • 세션 메모리 영역, 혹은 클라이언트 메모리 영역이라고도 불린다.
  • Foreground스레드(클라이언트 스레드)별로 독립적으로 할당되어 절대 공유되지 않는다.
  • 각 쿼리의 용도 별로 필요한 공간만이 할당되고, 필요하지 않은 경우에는 메모리공간을 할당조차 하지 않을 수 있다.
  • 다음과 같은 로컬 메모리 영역이 있다.
    • 정렬 버퍼
    • 조인 버퍼
    • 바이너리 로그 캐시
    • 네트워크 버퍼

Real MySQL 8.0 1권 : 개발자와 DBA를 위한 MySQL 실전 가이드를 참고하였습니다.


원문: Velog

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.