[REALMYSQL] MySql 엔진 아키텍쳐

Minseok-Choi·2022년 5월 10일
0

realmysql

목록 보기
1/3

학습자료

  • 백은빈,이성욱 : RealMySql 8.0 1

MySql 엔진 아키텍쳐

  • MySql 서버는 크게 MySql 엔진과 스토리지 엔지으로 구분할 수 있다.

MySql 엔진

  • 클라이언트로 부터의 접속, 쿼리 요청을 처리하는 커넥션 핸들러와, 쿼리 파서, 전처리기, 옵티마이저가 중심이 된다.
  • 표준 SQL 문법을 지원 -> 타 DBMS와 호환 가능

스토리지 엔진

  • 실제 데이터를 디스크 스토리지에 저장하거나 읽어오는 역할을 담당
  • 스토리지 엔진은 여러 개를 동시에 사용할 수 있다.
  • 테이블을 생성할 때 스토리지 엔진을 지정하면, 읽기, 변경 작업은 지정된 스토리지 엔진이 담당한다.
create table test_table (fd1 INT, fd2 INT) engine=innodb;
  • 성능 향상을 위한 기능
    • MyIsam 스토리지 엔진 : 키 캐시
    • InnoDB 스토리지 엔진 : InnoDB 버퍼 풀

핸들러 API

  • MySql 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽을 때, 각 스토리지 엔진에 쓰기, 읽기를 요청한다. 이러한 요청이 핸들러 요청, 이때 사용되는 API가 핸들러 API

MySql 스레딩 구조

  • MySql 서버는 스레드 기반으로 작동한다.

  • 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있다.

  • thread/sql/one_connection 스레드만 실제 사용자의 요청을 처리하는 포그라운드 스레드

  • 백그라운드 스레드 개수는 서버 설정에 따라 가변적이다.

    • 동일한 이름의 스레드가 중복으로 보이는 것은 여러 스레드가 동일 작업으로 병렬 처리하는 경우
  • 스레드풀에서는 커넥션과 포그라운드 스레드가 1:1 관계가 아니라 N:1 관계

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

  • 포그라운드 스레드는 최소 서버에 접속한 클라이언트의 수만큼 존재
  • 커넥션이 종료되면 스레드 캐시로 돌아가는데, 일정 개수 이상의 스레드가 대기 중이면 종료
    • thread_cache_size 시스템 변수로 설정 가능
  • 포그라운드 스레드는 데이터 버퍼나 케시의 데이터, 디스크의 데이터를 읽는 작업을 처리
    • MyIsam 테이블의 경우 디스크 쓰기까지 포그라운드가 담당
    • InnoDB 테이블의 경우 데이터 버퍼나 캐시까지만 포그라운드가 담당, 디스크 기록 작업은 백그라운드 스레드가 처리

백그라운드 스레드

  • InnoDB은 여러가지 작업이 백그라운드 스레드가 담당
    • 인서트 버퍼를 병합하는 스레드
    • 로그를 디스크로 기록하는 스레드
    • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
    • 데이터를 버퍼로 읽어 오는 스레드
    • 잠금이나 데드락을 모니터링 하는 스레드
  • 가장 중요한 것은 로그 스레드와 쓰기 스레드
    • 쓰기 스레드와 읽기 스레드는 2개 이상 지정할 수 있음
  • 쓰기 작업은 지연되어 처리 될 수 있지만, 읽기 작업은 절대 지연될 수 없음
    • InnoDB 쓰기 작업을 버퍼링해서 일괄처리하는 기능을 사용(버퍼 풀에서 모아서 처리)
  • InnoDB에서는 Insert, update, delete 쿼리로 데이터 변경되는 경우 데이터가 디스크에 완전 저장 될때까지 기다리지 않아도 된다.

메모리 할당 및 사용 구조

  • 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다.
  • 글로벌 메모리 영역의 모든 메모리 공간은 mySql 서버가 시작될 때, 운영체제로 부터 할당

글로벌 메모리 영역

  • 시스템 변수로 설정한 만큼 운영체제에서 할당
  • 하나의 메모리 공간, 모든 스레드로부터 공유되는 영역
    • 테이블 캐시
    • InnoDB 버퍼 풀
    • InnoDB 어댑티브 해시 인덱스
    • InnoDB 리두 로그 버퍼

로컬 메모리 영역(세션 메모리 영역)

  • 클라이언트 스레드가 쿼리를 처리하는 데 사용하는 메모리 영역
  • 스레드 별로 독립적으로 할당, 절대 공유되지 않음
  • 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않은 경우 아예 할당되지 않은 경우도 있음
    • 정렬 버퍼(sort buffer)
    • 조인 버퍼
    • 바이너리 로그 캐시
    • 네트워크 버퍼

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

  • mysql의 독특한 구조
  • 스토리지엔진 뿐만 아니라 검색어 파서, 인증에 필요한 것 까지 플러그인으로 구현되어 제공
  • 스토리지 엔진에 따라서 데이터 읽기/쓰기 작업 처리 방식이 많이 달라짐
  • 8.0 부터는 플러그인 아키텍처의 담점을 보완해서 컴포넌트 아키텍처도 지원

쿼리 실행 구조

1. 쿼리 파서

  • 사용자 요청으로 들어온 쿼리 문장을 토큰으로 분리해서 트리 형태의 구조로 변경
  • 쿼리 문법의 오류를 발견 및 오류 메시지 전달

2. 전처리기

  • 파서 트리를 기반으로 쿼리의 구조적 문제점을 파악
  • 토큰을 테이블, 컬럼, 내장 함수와 같은개체를 매핑하여 개체 존재 여부, 접근 권한등을 체크

3. 옵티마이저

  • DBMS의 두뇌(경영진)
  • 쿼리를 어떻게 가장 효율적으로 처리할지 결정하는 역할
  • 옵티마이저가 더 나은 선택을 할 수 있게 유도하는 방법이 중요하다.

4. 실행 엔진

  • 실행 엔진은 (중간 관리자)의 역할을 담당
  • 핸들러 (실무진)에게 요청하고 응답 결과를 또 다른 핸들러에게 요청해서 최종 결과를 넘기는 역할

5. 핸들러(스토리지 엔진)

  • 데이터를 디스크로 저장하고 디스크로 부터 읽어오는 역할
  • 핸들러 == 스토리지엔진

쿼리 캐시

  • 빠른 응답을 필요로하는 웹 기반 응용 프로그램에서 매우 중요한 역할
  • 실행결과를 메모리에 캐시하고, 같은 쿼리라면 디스크를 접근하지 않아서 빠른 성능
    • 하지만, 테이블 데이터가 변경될 때, 캐시 삭제로 인해서 mySql 서버가 발전되면서 성능 저하 이슈 및 버그의 원인이 되었음
  • 결국 8.0 버전에서 삭제되었음

스레드 풀

  • 엔터프라이즈 에디션에서만 스레드 풀 기능을 지원
  • Percona Server의 스레드 풀은 플러그인 형태로 구현되어 있어서 커뮤니티 에디션에서도 플러그인 라이브러리를 설치해서 사용할 수 있음
  • 스레드 풀은 동시에 실행 중인 스레드들을 CPU가 최대한 잘 처리할 수 있는 수준으로 줄여서 빠르게 처리하게 하는 기능
  • Percona Server의 스레드 풀은 CPU 코어 개수만큼 스레드 그룹을 생성, 옵션으로 조정할 수 있음
  • 스레드 그룹의 모든 스레드가 일을 처리하고 있다면, 스레드 풀은 새로운 스레드를 추가할지, 기다릴지 판단해야함
    • 스레드 풀의 타이머 스레드는 주기적으로 스레드 그룹의 상태를 체크한다.
    • thread_pool_stall_limit 시스템 변수에 정의도 밀리초를 기준으로 처리하지 못했다면 스레드를 추가
    • 민감한 서비스라면 limit를 낮추는 편, 하지만 0에 너무 가까우면 안됨
  • Pecona Server의 스레드 풀 플러그인은 선순위 큐와 후선위 큐를 이요해서 특정 트랜잭션, 쿼리를 우선적으로 처리할수 있음

트랜잭션 메타 데이터

  • 데이터베이스 서버에서 테이블의 구조 정보와 스토어드 프로그램 등의 정보를 데이터 딕셔너리 또는 메타데이터라고 함
  • 5.7 버전까지는 테이블 구조를 FRM 파일에 저장, 스토어드 프로그램은 파일 기반으로 관리
  • 파일 기반 메타데이터는 트랜잭션을 지원하지 않아서 서버가 비정상적으로 종료되면 데이터베이스, 테이블이 깨지는 경우 발생
  • 8.0 버전부터는 InnoDB의 테이블에 저장하도록 개선
    • 시스템 테이블이라고 불리며, InnoDB 스토리지 엔진을 사용하도록 개선
    • mysql DB는 mysql.ibd라는 이름의 테이블스페이스에저장
  • MyISAM, CSV 등과 같은 스토리지 엔진의 메타 데이터는 SDI 파일을 사용
profile
차곡차곡

0개의 댓글