ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Real MySQL 아키텍처
    DataBase/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

     

     

     

     

    반응형

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

    MySQL Explain 보는 법  (0) 2022.07.31
    Real MySQL 인덱스  (0) 2022.05.08
    Real MySQL 격리수준(Isolation Level)  (0) 2022.05.01
    Real MySQL 트랜잭션  (0) 2022.04.30
Designed by Tistory.