[RealMySql] 04 - 아키텍처(1)

심원보·2022년 3월 12일
0

RealMySQL

목록 보기
1/2

아키텍처

MySQl 서버

  • MySQL 엔진
  • 스토리지 엔진

4.1 MySQL 엔진 아키텍처

4.1.1 MySQL의 전체 구조

4.1.1.1 MySQL 엔진

  • 커넥션 핸들러 : 클라이언트 접속및 쿼리요청 처리
  • SQL파서및 전처리기
  • 옵티마이저 : 쿼리의 최적화된 실행 담당

4.1.1.2 스토리지 엔진

실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로 부터 데이터를 읽어오는 부분을 담당

Mysql> CREATE TABLE test_table(fd1 INT, fd2 INT) ENGINE=INNODB;

test_table은 InnoDB 스토리지 엔진을 사용하도록 정의

4.1.1.3 핸들러 API

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

핸들러 레코드 작업 확인 명령어

Mysql> SHOW GLOBAL STATUS LIKE 'Handler%'

4.1.2 MySQL 스레딩 구조

MySQL 서버는 스레드 기반으로 작동, 포그라운드(Foreground)스레드와 백그라운드(Background)스레드로 구분 performance_schema 데이터베이스의 threads 테이블을 통해 확인

Mysql> SELECT thread_id, name, type, processlist_user, processlist_host
	   FROM performance_schema.threads
	   ORDER BY TYPE, THREAD_ID

4.1.2.1 포그라운드 스레드(클라이언트 스레드)

  포그라운드 스레드는 최소한 MySQL서버에 접속된 클라이언트의 수만큼 존재, 각 클라이언트 사용자가 요청하는 쿼리 문장 처리, 작업을 마치고 커넥션이 종료되면 다시 스레드 캐시(Thread cache)로 되돌아간다. 스래드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수로 설정

포그라운드 스레드는 데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져오며, 버퍼나 캐시에 없는 경우에는 직접 디스크의 데이터나 인덱스 파일로 부터 데이터를 읽어와서 작업을 처리

4.1.2.2 백그라운드 스레드

  • 인서트 버퍼(Insert Buffer)를 병합하는 스레드
  • 로그를 디스크로 기록하는 스레드
  • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
  • 데이터를 버퍼로 읽어 오는 스레드
  • 잠금이나 데드락을 모니터링 하는 스레드

4.1.3 메모리 할당 및 사용 구조

  • 글로벌 메모리 영역 : MySQL서버가 시작되면서 운영체제로부터 할당
  • 세션(커넥션) 메모리 영역

4.1.3.1 글로벌 메모리 영역

  • 클라이언트의 스레드 수와 무관하게 하나의 메모리 공간만 할당
  • 모든 스레드에 의해 공유

4.1.3.2 로컬 메모리 영역

  • 세션 메모리 영역이라고 표현
  • 클라이언트 스레드가 쿼리 처리를 하는 데 사용하는 메모리 영역
  • 각 클라이언트 스레드별로 독립적으로 할당, 공유 X

4.1.4 플러그인 스토리지 엔진 모델

MySQL의 독특한 구조 - 플러그인 모델

MySQL 엔진이 각 스토리지 엔진에게 데이터를 읽어오거나 저장하도록 명령하려면 반드시 핸들러 를 통해야 한다.


4.1.5 컴포넌트

  MySQL서버 플러그인의 단점들을 보완해서 구현됨


4.1.6 쿼리 실행 구조

4.1.6.1 쿼리 파서

  • 쿼리 문장을 토큰(MySQL이 인식할수 있는 최소 단위의 어휘나 기호) 으로 분리, 트리 형태의 구조로 만드는 역할을 수행
  • 기본 문법 오류 발견및 오류메세지 전달

4.1.6.2 전처리기

  • 파서트리를 기반으로 쿼리 문장의 구조적 문제점 확인,
  • 토큰을 테이블 이름이나 칼럼 이름, 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인

4.1.6.3 옵티마이저

  • 사용자의 요청의 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 역할 담당,
  • DBMS의 두뇌

4.1.6.4 실행엔진

  • 옵티마이저가 두뇌라면 실행엔진과 핸들러는 손과 발에 비유
  • 각 핸들러에게 요청해서 받은 결과를 다른 핸드러 요청의 입력으로 연결하는 역할 수행

4.1.6.5 핸들러(스토리지 엔진)

  • MySQL 실행 엔진의 요청에 따라 데이터를 디스크로 저장하고 디스크로부터 읽어 오는 역할 담당

4.1.7 복제

MySQL 서버에서 복제(Replication)는 중요한 역할을 담당


4.1.8 쿼리 캐시

  SQL의 실행 결과를 매모리에 캐시하고, 동일 SQL쿼리가 실행되면 테이블을 읽지 않고 즉시 결과를 반환


4.1.9 스레드 풀

  내부적으로 사용자의 요청을 처리하는 스레드 개수를 줄여서 동시 처리 되는 요청이 많다 하더라도
MySQL 서버의 CPU가 제한된 개수의 스레드 처리에만 집중할수 있기 해서 서버의 자원 소모를 줄이는 것이 목적
실제 서비스에서 눈에 띄는 성능 향상을 보여준 경우는 드물다.

profile
Programmer?

0개의 댓글