[MySQL] MySQL 엔진 아키텍처-1

Fortice·2021년 10월 5일
0

MySQL

목록 보기
1/5
post-custom-banner

Real MySQL 8.0 4.1장 내용 상편

1. MySQL 서버

  • MySQL 엔진 : 머리 역할
  • 스토리지 엔진 : 손과 발
    • 핸들러 API를 만족하면 누구든 스토리지 엔진을 구현하여 서버에 추가해서 사용할 수 있음

MySQL 전체 구조

  • 대부분의 프로그래밍 언어로부터 접근 방법을 모두 지원
    • C, JDBC, ODBC, .NET 표준 드라이버
  • 그림과 같이 MySQL 엔진, 스토리지 엔진으로 나누고 이를 합쳐서 MySQL 서버 로 표현

MySQL 엔진

  • Connection Pool or Connection Handler
    • 클라이언트로부터의 접속 및 쿼리 요청을 처리
  • SQL 파서
    • 쿼리 처리
  • 전처리기
  • 옵티마이저
    • 쿼리 최적화 실행
  • MySQL 엔진은 MySQL 서버에서 하나만 사용 가능

스토리지 엔진

  • DBMS의 두뇌 역할
    • 요청된 SQL 문장을 분석 및 최적화 수행
    • 실제 데이터를 디스크 스토리지에 저장
    • 디스크 스토리지로부터 데이터를 읽어오기
  • 스토리지 엔진은 여러개를 동시에 사용 가능
  • 스토리지 엔진 지정
    • InnoDB 스토리지 엔진을 지정하여 INSERT, UPDATE, DELETE, SELECT 등의 처리를 맡음
    CREATE TABLE table (fd1 INT, fd2 INT) ENGINE=INNODB;
  • 각 엔진은 성능 향상을 위해 키 캐시(MyISAM SE), 버퍼 풀(InnoDB SE) 기능을 내장

핸들러 API

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

  • MySQL 엔진과 스토리지 엔진 간의 데이터를 주고받는 API
  • API 확인법
    SHOW GLOBAL STATUS LIKE 'Handler%';

2. MySQL 스레딩 구조

  • MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동
    • 포그라운드 스레드
    • 백그라운드 스레드
  • 실행중인 스레드 확인
    SELECT thread_id, name, type, processlist_user, processlist_host
    FROM performance_schema_threads ORDER BY type, thread_id;
    • 대부분 백그라운드 스레드
    • 같은 이름의 스레드는 설정에 따라 병렬로 동일 작업을 수행

스레드 풀

위 방식은 전통적인 스레드 모델로, MySQL 엔터프라이즈 에디션의 경우 스레드 풀을 사용할 수 있다. 가장 큰 차이점으로는 포그라운드 스레드의 커넥션 관리가 다르다. 전통적인 스레드 모델은 커넥션 별로 하나의 포그라운드 스레드가 할당되지만, 스레드 풀에서는 하나의 스레드가 여러 개의 커넥션 요청을 전달한다.

자세히 : Real MySQL 8.0 4.1.9절에서 스레드 풀 참조

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

  • 포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재하여, 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리
  • 커넥션 종료 시 스레드 캐시에 되돌아감
    • 스레드 캐시에 일정 수 이상의 스레드가 대기중이면 종료시켜 일정 수의 스레드만 유지
  • 데이터 가져오는 순서
    • 버퍼, 캐시 확인
    • 디스크, 인덱스 파일 확인
    • MyISAM은 포그라운드에서 전부 쓰기를 하지만, InnoDB에서는 포그라운드 스레드에서 버퍼, 캐시에만 쓰기를 하고, 디스크, 인덱스 파일은 백그라운드 스레드에서 쓰기를 한다.
    • MyISAM은 위 방식을 위해 지연된 쓰기를 사용할 수 있다.

백그라운드 스레드

  • MyISAM의 경우에는 별로 해당 사항이 없지만, InnoDB는 여러 작업을 백그라운드로 처리
    • 인서트 버퍼(Insert Buffer)를 병합하는 스레드
    • 로그를 디스크로 기록하는 스레드
    • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
    • 데이터를 버퍼로 읽어 오는 스레드
    • 잠금이나 데드락을 모니터링하는 스레드
  • 중요한 쓰기 스레드, 로그 스레드
    • 5.5 버전부터 읽기/쓰기 스레드를 2개 이상 지정 가능
    • 읽기는 클라이언트 스레드에서 처리하기 때문에 많을 필요가 없으나, 쓰기 스레드는 많은 작업을 백그라운드로 처리하여 2~4개 정도 설정하는게 좋음
    • 쓰기 작업은 지연(버퍼링)되어 처리될 수 있지만 읽기는 불가능
      • InnoDB는 쓰기 작업을 버퍼링하여 일괄처리 하는 기능이 내장되어 디스크의 데이터파일로 저장될 때까지 기다리지 않아도 됨
      • MyISAM은 클라이언트 스레드가 쓰기 작업까지 함꼐 처리해 일반적인 쿼리는 완전히 저장될 때 까지 기다려야함

3. 메모리 할당 및 사용 구조

  • 글로벌 메모리 영역
    • MySQL 서버 시작 시 운영체제로부터 할당
  • 로컬 메모리 영역
  • 글로벌/로컬 메모리 영역은 많은 스레드가 공유해서 사용하는 공간인지 여부에 따라 구분

글로벌 메모리 영역

  • 일반적으로 클라이언트 스레드 수와 무관하게 하나의 메모리 공간만 할당
  • 모든 스레드에 의해 공유
  • 종류
    • 테이블 캐시
    • InnoDB 버퍼 풀
    • InnoDB 어댑티브 해시 인덱스
    • InnoDB 리두 로그 버퍼

로컬 메모리 영역

  • 세션 메모리 영역이라고도 표현
  • 클라이언트 스레드가 쿼리를 처리하는 데 사용하는 메모리 영역
  • 클라이언트 스레드별로 독립적으로 할당되어 절대 공유되지 않음
  • 쿼리의 용도별로 필요에 따라 공간이 할당
  • 글로벌에 비해 설정에 주의하지 않기 때문에 Sort 시 최악의 경우 메모리 부족으로 멈출수도 있음
  • 종류
    • 정렬 버퍼(Sort buffer)
    • 조인 버퍼
    • 바이너리 로그 캐시
    • 네트워크 버퍼

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

  • 사용자 인증 방식, 검색 엔진, 스토리지 엔진 등을 플러그인 형태로 개발해서 사용할 수 있다.
  • 사용자가 직접 스토리지 엔진을 개발하여 사용할 수 있지만, DBMS의 기능 중 스토리지 엔진의 기능인 데이터 읽기/쓰기 부분만 처리하게 된다.
    • GROUP BY, ORDER BY 등 복잡한 쿼리도 MySQL 엔진에서 처리하므로 실제로 데이터 읽기/쓰기 기능은 작아보이겠지만, 처리 방식이 얼마나 많이 달라질 수 있는지 알 수 있게 될것이다.
  • 쿼리 작업은 여러 하위 작업으로 나뉘는데, 이 작업에서 MySQL 엔진 영역과 스토리지 엔진 영역의 차이를 아는 것이 중요하다.

Handler

앞으로 많이 보게 될 Handler란 MySQL 엔진이 스토리지 엔진을 조정하기 위한 객체이다. MySQL 내부에서 Handler_로 시작하는 상태 변수는 Handler호출한 횟수이다.

  • MySQL에서 지원하는 스토리지 엔진 확인하기
    SHOW ENGINES;
    • Support 값 의미
      • YES: MySQL 서버에 해당하는 스토리지 엔진이 포함되어 있고, 사용 가능으로 활성화된 상태
      • DEFAULT: YES와 동일하지만 필수 스토리지 엔진임 (이 엔진이 없으면 MySQL이 시작되지 않을 수 있음)
      • NO: 현재 MySQL 서버에 포함되지 않았음(활성화하려면 서버를 다시 빌드해야함)
      • DISABLED: 현재 MySQL 서버에는 포함됐지만 파라미터에 의해 비활성화된 상태
  • 플러그인
      SHOW PLUGINS;
    • NO의 경우 활성화를 위해 리빌드 해야하지만, 플러그인 형태의 라이브러리를 끼워넣어 스토리지 엔진을 사용할 수 있고, 업그레이드도 가능하다.
    • 용도
      • 인증
      • 전문 검색 파서
      • 쿼리 재작성
      • 비밀번호 검증
      • 커넥션 제어

5. 컴포넌트

  • 기존의 플러그인 아키텍처를 대체하기 위해 컴포넌트 아키텍처 지원
  • 컴포넌트로 보완한 플러그인의 단점
    • 플러그인은 오직 MySQL 서버와 인터페이스할 수 있고, 플러그인끼리는 통신할 수 없음
    • 플러그인은 MySQL 서버의 변수나 함수를 직접 호출하기 때문에 안전하지 않음(캡슐화 안 함)
    • 플러그인은 상호 의존 관계를 설정할 수 없어서 초기화가 어려움
  • 컴포넌트 설치 및 확인
    # 비밀번호 검증 컴포넌트 설치
    INSTALL COMPONENT 'file://component_validate_password';
    # 컴포넌트 확인
    SELECT * FROM mysql.component;
    • 설치 시 추가로 시스템 변수를 설정할 필요가 있는지 메뉴얼 확인 필요
profile
서버 공부합니다.
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 10월 7일

아니.. 형 검색하니깐 형꺼가 나왔어

1개의 답글