MySQL Server Architecture

Data Workflow

MySQL Server Thread-Based Architecture

Memory Area

MySQL Server Architecture

mysql architecture

MySQL은 클라이언트-서버 아키텍처를 따름

MySQL Client

MySQL Server

SQL Layer (Server Layer)

NoSQL

비정형(unstructured) 또는 반정형(semi-structured) 데이터에 자주 사용되는 스키마 없는 데이터 저장소를 관리함

SQL Interface

사용자가 SQL 쿼리를 사용하여 관계형 데이터베이스를 상호작용하도록 표준 인터페이스를 정의함

Query Parser

SQL 쿼리 분석을 통해 구조와 구문 파악, 추가 처리를 위해 구성 요소(트리 형태)로 분해하는 역할

기본 문법 오류 발생 시 Client에게 오류 메시지 반환

Preprocessor

쿼리 파서가 만든 파서 트리 점검

각 토큰을 테이블 이름이나 컬럼 이름, 또는 내장 함수와 같은 객체를 매핑해 해당 객체의 존재 여부 및 접근 권한 확인

존재하지 않거나 접근할 수 없는 토큰은 걸러짐

Query Optimizer

주어진 쿼리에 대한 실행 계획 평가 후 성능적으로 가장 효율적인 실행 계획을 선택하여 데이터베이스 작업 성능 향상

Cache & Buffers

자주 접근하는 데이터 또는 쿼리 결과를 메모리에 저장하여 성능 향상

Query Executor

실행 계획에 따라 Handler에게 실행 요청 위임

핸들러에게 받은 결과를 Client에게 반환하거나 또 다른 Handler 요청의 입력으로 연결

Storage Layer - Pluggable Storage Engine Architecture

MySQL의 각 Storage Engine은 실질적으로 디스크에 데이터 저장, 검색 및 관리를 수행하는 컴포넌트임

실제 구현 디테일을 사용자(개발자/DBA)로부터 분리하여 SQL Interface와 전반적인 데이터베이스 기능은 유지하면서 특정 성능 및 확장성 요구사항을 충족함

여러 스토리지 엔진을 선택해서 사용할 수 있는 “pluggable storage engine architecture”이라고 하는데

이 구조 덕분에 개발자나 DBA가 요구사항(data warehousing, transaction processing, high availability 등)에 따라 특정 엔진을 사용하기 위해 별도로 변경해야 될 작업없이 일관적인 API를 사용하면서 내부적인 동작 방식을 바꿀 수 있음

Handler

Storage Engine은 MySQL의 Handler 인터페이스를 구현하여 다양한 데이터 작업을 수행하는 실질적인 역할을 함

각 엔진은 자체적인 방식으로 데이터를 관리하며 Handler API를 통해 MySQL Server와 상호작용을 하는데, 테이블마다 사용할 엔진을 선택할 수 있음

Other Components

Replication

Query Cache

쿼리 결과를 메모리에 캐시하고 동일 SQL 쿼리가 실행되면 캐시된 결과를 반환하는 요소

다만 테이블의 데이터가 변경되면 캐시된 것들은 모두 삭제해야 했으므로 성능 저하를 유발하여 8.0 버전부터 삭제됨

Transaction Supporting Metadata

메타데이터 또는 데이터 딕셔너리: 테이블 구조 정보나 스토어드 프로그램

시스템 테이블: MySQL 서버가 작동하는 데 기본적으로 필요한 테이블

메타데이터는 파일 기반이므로 MySQL 5.7 버전까지 트랜잭션 지원이 되지 않았음

8.0 버전부터 트랜잭션을 지원하기 위해 메타데이터와 시스템 테이블 모두 mysql DB의 InnoDB를 사용한 테이블에 저장함

mysql DB는 mysql.idb에 저장되고 Server의 각 Database의 테이블 별로 idb 파일이 존재함

window 기준 idb 데이터 접근 경로

table idb

Plugin Architecture

스프링의 PSA처럼 MySQL은 다형성을 활용하여 특정 모듈을 원하는 대로 갈아끼울 수 있음

이러한 모듈을 Plugin이라고 부르며 여러 종류의 플러그인을 MySQL Server에 런타임에 로드/언로드 가능

각 플러그인은 타입에 따라 기능 제공 Types of Plugins

MySQL Server Plugin

Component: Advanced Plugin

플러그인의 단점을 보완한 아키텍처

MySQL Components

Data Workflow

MySQL에서의 데이터 작업은 크게 SQL 레이어와 Storage Engine 레이어로 나뉨

전체적인 데이터 처리 과정은 다음과 같음

1. Client - Server 커넥션 연결

2. SQL Layer에서 SQL문 파싱 및 최적화

3. 실행 계획에 따라 Handler API를 호출

4. Storage Engine의 Handler API를 통한 데이터 작업

5. 결과 반환

MySQL Server Thread-Based Architecture

참고

3 key concepts

Connection Handling Thread

MySQL은 클라이언트가 Server에 연결되면 커넥션 별로 스레드를 새로 생성하거나 스레드 캐시로부터 하나를 할당함

스레드 캐시는 스레드 생성 오버헤드를 줄이기 위해 스레드를 보관하는 캐시 역할을 함

클라이언트에 할당된 스레드는 다음의 처리를 수행함

Main Threads

Thread States

Query Execution Threads

InnoDB Internal Threads

Resource Management Threads

Memory Area

모든 스레드에 의해 공유되는 글로벌 메모리 영역과 세션 당 생성되는 로컬 메모리 영역으로 구분

글로벌 메모리 영역

로컬 메모리 영역