데이터베이스

MySQL 아키텍처

kimjy 2023. 2. 6. 23:44

MySQL 엔진 아키텍처

  • MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있음
  • MySQL엔진은 클라이언트로부터 접속 및 쿼리요청을 처리하는 커넥션 핸들러 부분과 SQL 파서 & 옵티마이저 등으로 구성
  • 스토리지 엔진은 데이터를 디스크 스토리지에 저장하거나 읽는 등의 작업을 처리
  • 스토리지 엔진은 여러 개를 동시에 사용할 수 있음
  • 핸들러 API는 스토리지 엔진과 MySQL 엔진의 사이에 존재하며, 각 요청을 주고받을 때 사용됨

MySQL 스레딩 구조

  • MySQL 서버는 프로세스 기반이 아닌 스레드 기반
  • 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있음.
  • 동일한 기능을 수행하는 스레드를 여러 개 포크해서 병렬처리도 가능

포그라운드 프로세스

  • 최소 MySQL 서버에 접속된 클라이언트 수만큼 존재
  • 클라이언트 사용자가 요청하는 쿼리 문장을 처리
  • 스레드는 작업을 마치고 커넥션을 종료하면 스레드 캐시로 돌아감.
    • 스레드 캐시에 일정 수의 스레드가 존재할 경우(thread_cache_size 만큼) 스레드를 종료 시킴
  • 데이터를 데이터버퍼나 캐시로부터 가져오고, 버퍼나 캐시에 없는 경웅에는 직접 디스크나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리함
    • 이때 MyISAM은 디스크 접근까지, InnoDB는 데이터버퍼나 캐시 접근까지만 수행

백그라운드 프로세스

  • InnoDB를 사용하면 여러 작업이 백그라운드로 처리됨
    • 인서트 버퍼를 병합하는 스레드
    • 로그를 디스크로 기록하는 스레드
    • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
    • 데이터를 버퍼로 읽어 오는 스레드
    • 잠금이나 데드락을 모니터링하는 스레드

메모리 할당 및 구조

글로벌 메모리

  • 모든 스레드에 의해 공유
  • 아래와 같은 용도로 사용
    • 테이블 캐시
    • InnoDB 버퍼 풀
    • InnoDB 어댑티브 해시 인덱스
    • InnoDB 리두 로그 버퍼

로컬 메모리

  • 클라이언트 스레드별로 독립적으로 할당
  • 아래와 같은 용도로 사용
    • 정렬 버퍼
    • 조인 버퍼
    • 바이너리 로그 캐시
    • 네트워크 버퍼

쿼리 실행 구조

쿼리를 실행하는 구조는 아래와 같은 프로세스로 진행이 됨

1. 쿼리 파서: 요청된 쿼리 문장을 토큰 단위로 분해

2. 전처리기 실행: 쿼리에 오류가 있는 지 확인

3. 옵티마이저 실행: 요청된 쿼리를 최적화, 쿼리를 빠르게 만든다는 것은 다시말하면 옵티마이저를 잘 활용한다고 말할 수 있음.

4. 쿼리 실행: 스토리지 엔진 등을 실행하여 데이터 조작

 

쿼리 캐시

  • 기존에는 빠른 쿼리 처리를 위하여 쿼리 캐시가 도입되었지만, MySQL 8.0부터는 지원하지 않음

스레드 풀

  • MySQL 커뮤니티 에디션은 스레드 풀 기능을 제공하지 않음. 엔터프라이즈 급에서 사용이 가능
  • 스레드 풀은 스레드 개수를 조절함. 따라서 요청이 많아지더라도 스레드 개수를 조절하여 잦은 context switch가 발생하지 않도록 함
  • 다만 스레드 풀에 의해 스레드가 생성되지 않으면 connection에서 지연이 발생하므로, 서비스의 특성에 맞게 조절해야 함

'데이터베이스' 카테고리의 다른 글

InnoDB 스토리지 엔진 아키텍처  (0) 2023.02.21