CS/Data Base

[MySQL] 간단하게 보는 mysql 의 아키텍처 - 1

hojak99 2020. 4. 29. 23:03

mysql 이 어떻게 돌아가고 어떤 구조로 돼 있는지 공부해야지 해야지 하다가 이제서야 공부하고 글을 작성해 보려고 한다.
다른 블로그에도 지금 작성하는 내용과 같거나, 비슷한 내용이 작성 돼 있는 곳이 많기 때문에 살짝 의식의 흐름대로 작성한다.

이 글은 [REAL MySQL] 이라는 책을 기반으로 작성한다.


MySQL 의 전체 구조

우선 책에도 나와있지만, 간단히 MySQL 전체적인 구조를 한 번 보는게 좋을 것 같다.

MySQL 서버의 전체 구조

 

우선 앞으로 설명할 것들은 MySQL 을 크게 구분할 수 있는 [MySQL 엔진], [스토리지 엔진] 부분이다.

### MySQL 엔진
접속 및 쿼리 요청 처리하는 커넥션 핸들러, SQL 파서, 전처러리기, 쿼리 최적화를 위한 옵티마이저로 이루어져 있다.
또, InnoDB 의 버퍼 풀, MyISAM 의 키 캐시 저장소 같은 보조 저장소 기능이 포함 돼 있다.

> MyISAM 을 뭐라 읽는지 검색 해 보았는데 마이아이삼 이렇게 읽는 듯하다. 외국인 유투버도 저렇게 발음했음

 

### 스토리지 엔진
데이터를 디스크 스토리지에 저장, 읽어오는 부분은 스토리지 엔진이 담당한다.
여기서 한 가지 알아야 하는 부분은 MySQL 엔진은 하나이지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.

### 핸들러 API
MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽어야 할 때는 각 스토리지 엔진에게 쓰기 또는 읽기를 요청하는데 이러한 요청을 핸들러 요청이라고 한다. 이 때 사용되는 API 들이 핸들러 API 라고 한다.

아래 사진처럼 핸들러 API 가 지금까지 몇 번 수행 되었는지 알 수 있다.
write 가 굉장히 많군

Handler API 사용량

 


Mysql 스레딩 구조

우선 알아야 할 점은 MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동한다는 것이다.

그렇기 때문에 크게 포그라운드, 백그라운드 스레드를 사용하며 구분할 수 있다.

### 포그라운드 스레드
최소한 접속된 클라이언트의 수만큼 존재하며, 사용자가 요청하는 쿼리 문장을 처리한다. 커넥션 종료 시 다시 스레드 풀로 들어가는 듯하다.

또, 포그라운드 스레드는 데이터를 데이터 버퍼나 캐시로부터 갖고오고 버퍼나 캐시에 데이터가 없으면 직접 디스크의 데이터, 인덱스 파일로부터 데이터를 읽어와 처리한다.

### 백그라운드 스레드
InnoDB 에서는 다음과 같은 스레드가 존재한다.

- 인서트 버퍼를 병합하는 스레드
- 로그를 디스크로 기록하는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크록 기록하는 스레드
- 데이터를 버퍼로 읽어들이는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
- 모든 스레드를 총괄하는 메인 스레드

 


나머지 내용은 2에서 작성하도록 함.

반응형