책너두 6기 7일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.76 ~ p.85

내용정리

04 아키텍처

MySQL 서버 : 사람의 머리 역할(MySQL 엔진) + 손발 역할(스토리지 엔진)로 구분

스토리지 엔진은 핸들러 API를 만족하면 누구든지 구현해서 MySQL 서버에 추가해서 사용할 수 있음.

MySQL 서버에서 기본으로 제공 : InnoDB 스토리지 엔진, MyISAM 스토리지 엔진

4.1 MySQL 엔진 아키텍처

MySQL 서버는 다른 DBMS에 비해 독특하다.

4.1.1 MySQL의 전체 구조

이미지

4.1.1.1 MySQL 엔진

클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다.

4.1.1.2 스토리지 엔진

실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담한다. MySQL 서버에서 MySQL 서버에서 MySQL 엔진은 하나지만 스트리지 엔진은 여러 개를 동시에 사용할 수 있다. 다음과 같이 스토리지 엔진을 지정할 수 있다.

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

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

각 스토리지 엔진은 키 캐시(MyISAM 스토리지 엔진)나 InnoDB 버퍼 풀(InnoDB 스토리지 엔진)과 같은 기능을 내장하고 있다.

4.1.1.3 핸들러 API

핸들러 요청 : MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽어야 할 때 각 스토리지 엔진에 하는 요청

여기서 핸들러 API를 사용한다. InnoDB 스토리지 엔진도 핸들러 API를 이용해 MySQL 엔진과 데이터를 주고받음. 이 핸들러 API의 데이터 작업들을 보는 구문은 다음과 같다.

show global status like 'handler%';

4.1.2 MySQL 스레딩 구조

MYSQL 서버 : 스레드 기반(프로세스 기반 X), 포그라운드(Foreground) 스레드와 백그라운드(Background) 스레드로 구분 가능. 다음 구문으로 MySQL 서버에서 실행중인 스레드의 목록을 확인할 수 있다. performance_schema 데이터베이스의 threads 테이블을 보면 된다.

select thread_id, name, type, processlist_user, processlist_host
from performance_schema.threads order by type, thread_id;

백그라운드 스레드의 개수는 MySQL 서버의 설정내용에 따라 가변적이다. 동일한 이름의 스레드가 2개 이상 보이는 것은 서버의 설정 내용에 의해 여러 스레드가 병렬적으로 처리하는 경우

MySQL 엔터프라이즈 에디션과 Percona MySQL 서버에서는 스레드 풀(Thread Pool) 모델을 사용할 수도 있다. 차이점은 포그라운드 스레드와 커넥션의 관계다. 기존 모델은 커넥션별로 포그라운드 스레드가 하나씩 생성되고 할당되지만 스레드 풀에서는 커넥션과 포그라운드 스레드는 1:1관계가 아니라 하나의 스레드가 여러 개의 커넥션 요청을 전담한다.

4.1.2.1 포그라운드 스레드(클라이언트 스레드,사용자 스레드)

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

4.1.2.2 백그라운드 스레드

InnoDB에선 여러 가지 작업이 백그라운드로 처리된다.

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

가장 중요한 것은 로그 스레드(Log thread)와 버퍼의 데이터를 디스크로 내려쓰는 작업을 처리하는 쓰기 스레드(Write thread)다. 이 스레드의 갯수는 innodb_write_to_threadsinnodb_read_io_threads시스템 변수로 스레드의 개수를 설정할 수 있다. 쓰기 스레드는 일반적인 내장 디스크를 사용할 때는 2~4 정도, DAS나 SAN과 같은 스토리지를 사용할 때는 충분히 설정하는 것이 좋다.

데이터의 쓰기 작업은 버퍼링되어 처리될 수 있지만 쓰기 작업은 절대 지연될 수 없다.

읽고나서

서버구조 알아두자.