-
Real MySQL 아키텍처DataBase/MySQL 2022. 3. 12. 14:25반응형
MySQL 엔진 아키텍처
각 부분에 대한 하는 역활
커넥션 핸들러
- 클라이언트로부터 접속 및 쿼리 요청을 처리
MySQL 엔진
- SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당되는 처리 수행
스토리지 엔진
- 디스크 스토리지에 저장하거나 디스크 스토리지부터 데이터를 읽어오는 부분
핸들러 API
- MySQL 엔진에서 데이터를 읽어나 쓰거나 할 때는 각 스토리지엔진에 쓰기 또는 읽기를 요청을 하는데 이러한 요청을 핸들러(handler)요청이라 한다.
- 여기서 사용되는 API를 핸들러 API
MySQL 스레딩 구조
스레딩 구조 설명
- MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동
- 포그라운드 스레드나 백그라운드 스레드로 구분
- 동일한 이름의 스레드가 2개 이상 보이는 것은 MySQL 서버의 설정 내용에 의해 여러 스레드가 동일 작업을 병렬로 작업
포그라운드 스레드(클라이언트 스레드)
- 스레드의 갯수는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재
- 각 클라이언트 사용자가 요청하는 쿼리문장을 처리
- 커텍션을 종료되면 커텍션을 담당하던 스레드는 다시 스레드 캐시(thread cache)로 되돌아간다.
- 스레드 캐시에 일정 개수 이상의 대기 중인 스레드가 있으면 스레드 캐시에 넣지 않고 스레드를 종료시켜 일정 개수의 스레드만 스레드 캐시에 존재
- 포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져온다.
- 버터나 캐시가 없는 경우 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 읽어와서 작업을 처리
- MyISAM도 지연된 쓰기가 있지만 일반적인 방식은 아니다.
- InnoDB 테이블은 데이터나 버퍼나 캐시까지만 포그라운드 스레드가 처리하고, 나머지 버퍼로부터 디스크까지 기록하는 작업은 백그라운드 스레드가 처리
MySQL 서버에 접속하게 되면 MySQL 서버는 클라이언트의 요청을 처리해 줄 스레드를 생성해 그 클라이언트에게 할당, 이 스레드는 DBMS의 앞단에서 사용자(클라이언트)와 통신하기 때문에 포그라운드 스레드라 불리며, 사용자가 요청한 작업을 처리하기 때문에 사용자 쓰레드라고 불린다.
백그라운드 스레드
InnoDB에서 백그라운드로 처리되는 스레드
- 인서느 버퍼(insert Bufer)를 병합하는 스레드
- 로그를 디스크로 기록하는 스레드
- InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
- 데이터를 버퍼로 읽어 오는 스레드
- 잠금이나 데드락을 모니터링하는 스레드
위의 스레드에서 가장 중요한 스레드는 로그 스레드와 버퍼의 데이터를 디스크로 내려쓰는 작업을 쓰는 쓰기 스레드이다.
- 사용자의 요청을 처리하는 도중 데이터의 쓰기 작업은 지연(버퍼링)되어 처리될 수 있지만 데이터의 읽기 작업은 절대 지연될 수 없다.
- 일반적인 DBMS에는 대부분 쓰기 작업을 버퍼링해서 읽괄 처리하는 기능이 탑재
- MyISAM은 그렇지 않고, 사용자 스레드가 쓰기 작업까지 함게 처리하도록 설계
- InnoDB에서는 INSERT, UPDATE, DELETE 쿼리로 데이터가 변경되는 경우 데이터가 디스크의 데이터 파일로 완전히 저장될 때까지 기다리지 않아도 된다. (때문에 조회는 지연이 안됨)
- MyISAM에서 일반적인 쿼리는 쓰기 버퍼링 기능을 사용할 수 없다.
- 일반적인 DBMS에는 대부분 쓰기 작업을 버퍼링해서 읽괄 처리하는 기능이 탑재
메모리 할당 및 사용구조
글로벌 메모리 영역
글로벌 메로리 영역의 대표적인 영역
- 테이블 캐시
- InnoDB 버퍼 풀
- InnoDB 어댑티브 해시 인덱스
- InnoDB 리두 로그 버퍼
로컬 메모리 영역( = 세션 메모리 영역)
- MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용되는 메모리 영역
- 대표적으로 커넥션 버퍼와 정렬(소트) 버퍼 등이 존재
- MySQL 서버에서는 클라이언트 커넥션어로부터의 요청을 처리하기 위해 스레드를 하나씩 할당하게 되는데, 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라리언트 메모리 영역이라고 한다.
- 클라이언트와 MySQL 서버와의 커넥션을 세션이라고하기 때문에 로컬 메모리 영역을 세션 메모리 영역이라고 한다.
- 로컬 메로리는 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용하지 않는다.
- 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않는 경우에는 MySQL이 메모리 공간을 할당조차도 하지 않을 수 있다.
- 대포적으로 소트 버퍼와 조인 버퍼와같은 공간
- 커넥션 버퍼와 결과 버퍼
- 커넥션이 계속 열려있는동안 계속 할당된 공간
- 소트 버퍼와 조인버퍼
- 쿼리를 실행하는 순간에만 할당되었다가 해체하는 공간
플러그인 스토리지 엔진 모델
데이터 읽기/쓰기 작업은 1건의 레코드 단위( 예를 들어, 특정 인덱스의 레코드 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