MySQL 아키텍처 (기본)

mimdong·2022년 8월 16일
0

아키텍처 관점에서 MySQL 서버는 다음과 같이 구분된다.
MySQL 서버 : MySQL 엔진(머리) + 스토리지 엔진(손과발)

  • MySQL 엔진 : 클라이언트로부터의 접속 및 쿼리 요청 처리
  • 스토리지 엔진 : 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽음
    예) InnoDB 스토리지 엔진, MyISAM 스토리지 엔진

MySQL 스레딩 구조
작동 방법 : 프로세스 기반이 아니라 스레드 기반으로 작동

  • 포그라운드(Foreground) 스레드 :
    - 클라이언트 스레드
    - MySQL 서버에 접속된 클라이언트의 수만큼 존재
    • 각 클라이언트 사용자가 요청하는 쿼리 문장 처리
    • 클라이언트 사용자가 작업을 마치고 커넥션을 종료하면 해당 커넥션을 담당하던 스레드는 다시 스레드 캐시로 되돌아감(혹은 스레드 캐시에 일정 개수 이상의 대기중인 스레드가 있는 경우 스레드 종료)
    • InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리
  • 백그라운드(BackGround) 스레드 :
    - InnoDB 경우, 백그라운드에서 처리하는 작업 리스트
    - 인서트 버퍼(Insert Buffer)를 병합하는 스레드
    - 로그를 디스크로 기록하는 스레드
    - InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
    - 데이터를 버퍼로 읽어오는 스레드
    - 잠금이나 데드락을 모니터링하는 스레드

[참고] 데이터 읽기/쓰기 스레드

  • InnoDB 백그라운드 스레드의 수는, innodb_write_io_threads 및 innodb_read_io_threads 에 의해 제어
  • 튜닝 포인트 확인 필요
    <innodb_write_io_threads>
    - 내장 디스크를 사용할 때는 2~4, DAS나 SAN 스토리지 사용할 때는 디스크를 최적으로 사용할 수 있는 만큼 충분히 설정
    <innodb_read_io_threads>
    - 데이터를 읽는 작업은 주로 포그라운드 스레드에서 처리되므로 많이 설정할 필요가 없다. (이유) 데이터 쓰기 작업은 지연(버퍼링)되어 처리될 수 있으나 읽기 작업은 절대 지연될 수 없음
    - SHOW ENGINE INNODB STATUS 출력에서 읽기 요청 보류 중인 64개 이상의 innodb_read_io_threads가 표시되면 값을 증가시켜 성능을 향상시킬 수 있다.

메모리 할당 및 사용 구조
MySQL 메모리 공간 : 글로벌 메모리 영역 + 로컬 메모리 영역

  • 글로벌 메모리 영역
    - MySQL 서버가 시작되면서 운영체제로부터 할당 받는다. (어떤 시스템변수로 제어?)
    • 클라이언트 스레드 수와 무관하게 하나의 메모리 공간만 할당
    • 필요에 따라 2개 이상의 메모리 공간을 할당받을 수 있으나 스레드 수와 무관하며 생성된 글로벌 영역은 모든 스레드에 의해 공유
      - 대표 글로벌 메모리 영역
      • 테이블 캐시
        • InnoDB 버퍼 풀
        • InnoDB 어댑티브 해시 인덱스
        • InnoDB 리두 로그 버퍼
  • 로컬 메모리 영역
    - 세션 메모리 영역 : MySQL 서버 상에 존재하는 클라이언트 스레드가 쿼리를 처리하는 데 사용하는 메모리 영역
    • 클라이언트 메모리 영역 : 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되지 않는다.
    • 대표 로컬 메모리 영역
      • 정렬 버퍼
        • 조인 버퍼
        • 바이너리 로그 캐시
        • 네트워크 버퍼
profile
기록이 필요한 사람 입니다.

0개의 댓글