DataBase/MySQL

Real MySQL 아키텍처

레알윙 2022. 3. 12. 14:25
반응형

MySQL 엔진 아키텍처 

MySQL 서버의 전체 구조 - Real MySQL 77 쪽 그림

각 부분에 대한 하는 역활

커넥션 핸들러

  • 클라이언트로부터 접속 및 쿼리 요청을 처리

MySQL 엔진

  • SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당되는 처리 수행

스토리지 엔진

  • 디스크 스토리지에 저장하거나 디스크 스토리지부터 데이터를 읽어오는 부분

핸들러 API

  • MySQL 엔진에서 데이터를 읽어나 쓰거나 할 때는 각 스토리지엔진에 쓰기 또는 읽기를 요청을 하는데 이러한 요청을 핸들러(handler)요청이라 한다.
    • 여기서 사용되는 API를 핸들러 API

 

 

MySQL 스레딩 구조

MySQL의 스레딩 모델 - Real MySQL 80쪽 그림

스레딩 구조 설명

  • MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동
  • 포그라운드 스레드백그라운드 스레드로 구분
  • 동일한 이름의 스레드가 2개 이상 보이는 것은 MySQL 서버의 설정 내용에 의해 여러 스레드가 동일 작업을 병렬로 작업

 

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

  • 스레드의 갯수는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재
  • 각 클라이언트 사용자가 요청하는 쿼리문장을 처리
  • 커텍션을 종료되면 커텍션을 담당하던 스레드는 다시 스레드 캐시(thread cache)로 되돌아간다.
  • 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 스레드를 종료시켜 일정 개수의 스레드만 스레드 캐시에 존재
  • 포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져온다.
  • 버터나 캐시가 없는 경우 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리
    • MyISAM도 지연된 쓰기가 있지만 일반적인 방식은 아니다.
  • InnoDB 테이블은 데이터나 버퍼나 캐시까지만 포그라운드 스레드가 처리하고, 나머지 버퍼로부터 디스크까지 기록하는 작업은 백그라운드 스레드가 처리
MySQL 서버에 접속하게 되면 MySQL 서버는 클라이언트의 요청을 처리해 줄 스레드를 생성해 그 클라이언트에게 할당, 이 스레드는 DBMS의 앞단에서 사용자(클라이언트)와 통신하기 때문에 포그라운드 스레드라 불리며, 사용자가 요청한 작업을 처리하기 때문에 사용자 쓰레드라고 불린다.

 

백그라운드 스레드

InnoDB에서 백그라운드로 처리되는 스레드

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

위의 스레드에서 가장 중요한 스레드로그 스레드와 버퍼의 데이터를 디스크로 내려쓰는 작업을 쓰는 쓰기 스레드이다.

 

  • 사용자의 요청을 처리하는 도중 데이터의 쓰기 작업은 지연(버퍼링)되어 처리될 수 있지만 데이터의 읽기 작업은 절대 지연될 수 없다.
    • 일반적인 DBMS에는 대부분 쓰기 작업을 버퍼링해서 읽괄 처리하는 기능이 탑재
      • MyISAM은 그렇지 않고, 사용자 스레드가 쓰기 작업까지 함게 처리하도록 설계
    • InnoDB에서는 INSERT, UPDATE, DELETE 쿼리로 데이터가 변경되는 경우 데이터가 디스크의 데이터 파일로 완전히 저장될 때까지 기다리지 않아도 된다. (때문에 조회는 지연이 안됨)
      • MyISAM에서 일반적인 쿼리는 쓰기 버퍼링 기능을 사용할 수 없다.

 

메모리 할당 및 사용구조

MySQL의 메모리 사용 및 할당 구조 - Real MySQL 84쪽 그림

글로벌 메모리 영역

글로벌 메로리 영역의 대표적인 영역

  • 테이블 캐시
  • InnoDB 버퍼 풀
  • InnoDB 어댑티브 해시 인덱스
  • InnoDB 리두 로그 버퍼

 

로컬 메모리 영역( = 세션 메모리 영역)

  • MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용되는 메모리 영역
    • 대표적으로 커넥션 버퍼와 정렬(소트) 버퍼 등이 존재
  • MySQL 서버에서는 클라이언트 커넥션어로부터의 요청을 처리하기 위해 스레드를 하나씩 할당하게 되는데, 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라리언트 메모리 영역이라고 한다.
  • 클라이언트와 MySQL 서버와의 커넥션을 세션이라고하기 때문에 로컬 메모리 영역세션 메모리 영역이라고 한다.
  • 로컬 메로리는 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용하지 않는다.
  • 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않는 경우에는 MySQL이 메모리 공간을 할당조차도 하지 않을 수 있다.
    • 대포적으로 소트 버퍼와 조인 버퍼와같은 공간
    • 커넥션 버퍼와 결과 버퍼
      • 커넥션이 계속 열려있는동안 계속 할당된 공간
    • 소트 버퍼와 조인버퍼
      • 쿼리를 실행하는 순간에만 할당되었다가 해체하는 공간

 

 

플러그인 스토리지 엔진 모델

MySQL 플러그인 모델 - Real MySQL 86 쪽
MySQL 엔진과 스토리지 엔진의 처리 영역 - Real MySQL 86 쪽

데이터 읽기/쓰기 작업은 1건의 레코드 단위( 예를 들어, 특정 인덱스의 레코드 1건 읽기 또는 마지막으로 읽은 레코드의 다음 또는 이전 레코드 읽기와 같이)로 처리된다.

 

 

 

 

 

 

 

 

 

 

 

참고

Real MySQL 8.0.1

 

 

 

 

반응형