DB/MySQL

MySQL 아키텍쳐

로파이 2021. 12. 29. 23:19

MySQL 서버 아키텍쳐 구조

MySQL 구조

 

스토리지 엔진 API

SQL 문장을 분석하고 처리하여 디스크에 데이터를 쓰거나 읽는 등의 중요 역할을 담당한다.

 

핸들러 API

스토리지 엔진에 읽기 혹은 쓰기를 요청하는 핸들러 요청을 의미한다.

 

MySQL 스레드 구조

MySQL 스레딩 구조

MySQL은 스레드를 기반으로 작업을 처리한다. 

 

1. 포그라운드 스레드 (클라이언트 스레드)

서버에 접속한 클라이언트 수만큼 존재하며 사용자가 요청하는 쿼리를 처리한다. 사용자가 연결을 종료하면 해당 포그라운드 스레드는 스레드 캐시로 돌악나다.

 

포그라운드 스레드는 MySQL의 데이터 버퍼나 캐시로부터 데이터를 가져오며 이에 없는 경우 직접 디스크 데이터 혹은 인덱스 파일로 부터 읽어서 작업을 처리한다.

 

MyISAM은 쓰기 작업까지 포그라운드 스레드에서 진행되지만 InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리하고 버퍼로부터 디스크까지 쓰는 작업은 백그라운드 스레드가 처리한다.

 

2. 백그라운드 스레드

다음 작업들이 백그라운드에서 처리된다.

  • 인서트 버퍼를 병합하는 스레드
  • 로그를 디스크로 기록하는 스레드 (로그 스레드)
  • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드 (쓰기 스레드)
  • 데이터를 버퍼로 읽어 오는 스레드
  • 잠금이나 데드락을 모니터링하는 스레드

로그 스레드와 쓰기 스레드가 중요 역할을 담당한다.

innodb_write_io_threads, innodb_read_io_treads 시스템 변수로 읽기/쓰기 스레드 수를 설정할 수 있다.

InnoDB 엔진에서 쓰기 작업을 버퍼링하여 지연 처리한다.

 

메모리 할당 및 사용 구조

1. 글로벌 메모리 영역

클라이언트 수와 무관하게 하나의 메모리 공간에 할당되는 영역이다. 모든 스레드에 의해 공유 된다.

 

2. 로컬 메모리 영역

클라이언트 연결과 일대일 대응되는 메모리 영역이다. 클라이언트마다 할당되어 해당 메모리를 사용하는 스레드는 쿼리를 처리한다. 조인과 정렬 버퍼는 해당 쿼리에 따라 일시적으로 생겼다가 사라지는 버퍼이다.

 

MySQL 쿼리가 실행되는 과정

SQL 구문과 관련된 부분은 모두 MySQL 엔진이 처리하며 이후에 디스크로 부터 읽기/쓰기 작업만 스토리지 엔진이 처리한다. 스토리지 엔진에 작업을 요청하는 것을 핸들러라고 하며 MySQL 엔진이 요청한다.

서버의 상태 변수 중 Handle_로 시작하는 것은 핸들러 요청과 관련된 것들이다.

 

스토리지 엔진이 하는 것은 디스크와 관련된 작업이며 Group By나 Order By 등 쿼리 처리는 항상 MySQL 엔진의 처리 영역인 쿼리 실행기에서 처리된다.

 

쿼리 실행 구조

 

1. 쿼리 파서

사용자 요청으로 들어온 쿼리 문장을 MySQL이 인식할 수 있는 최소 단위로 분리해 트리구조로 만들어내느 작업

 

2. 전처리기

파서 과정에서 만들어진 파서트리를 기반으로 쿼리 문자에 구조적인 문제점이 있는지 확인

 

3. 옵티마이저

사용자 요청으로 들어온 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 역할 담당

 

4. 핸들러 (스토리지 엔진)

MySQL 서버 밑단에서 실행 엔진의 요청에 의해 디스크 읽기/쓰기 작업을 요청한다. 스토리지 엔진이 그 역할을 담당한다.

 

스레드 풀

사용자 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요청이 많다하더라도 MySQL 서버의 CPU가 제한된 개수의 스레드 처리에만 집중할 수 있게 한다.

'DB > MySQL' 카테고리의 다른 글

MySQL 인덱스  (0) 2022.01.09
MySQL 트랜잭션과 잠금  (0) 2022.01.02
MySQL InnoDB 스토리지 엔진 아키텍처  (0) 2021.12.30
MySQL 사용자 및 권한  (0) 2021.12.23
MySQL 시스템 변수  (0) 2021.12.20