학습자료
- 백은빈,이성욱 : 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 파일을 사용