본문 바로가기
🌱 Computer Science/Database

[Mysql 아키텍쳐1] 커넥션풀/Mysql엔진/스토리지엔진

by 카프리썬_ 2020. 1. 19.
728x90
728x90

내부적으로 어떻게 작동는지 이해하기

출처 RealMysql 서적을 기반으로 이해한 내용 정리

2020.01.19 - [Mysql 아키텍쳐1] 커넥션풀/Mysql엔진/스토리지엔진

2020.01.20 - [Mysql아키텍쳐2] 스레드구조/IO매커니즘/InnoDB 내부구조

2020.01.22 - [Mysql아키텍쳐3] InnoDB특징/MyISAM특징

1. 전체구조

1) 기본적으로 client-server구조

다수의 Client들이 하나의 DB 서버에 연결되는 구조

-> 클라이언트별 Connection 처리 -> 스레드증가 -> 멀티스레드 방식

이때 클라이언트가 접속해서 DB연결할 때 Connection Pool사용 

 

왜 커넥션 풀을 사용해야하지? 

한명의 클라이언트가 수행하는 DB커넥션도 많은데

클라이언트가 접속할때마다 DB커넥션도 만들고, DB접속도 계속하는게 오버헤드발생

즉, 들어오는 클라이언트가 요청하는 쿼리가 필요할때마다 DB에 접속하는 커넥션을 만들면 비용큼

만약, 커넥션 풀이 없다면?

ex) 한명의 접속자가 웹사이트에 접속해서, 게시판 확인/게시글 수정/ 게시글 등록하는 이벤트를 한다면

이 한명의 클라이언트에 4번의 DB접속 발생  1.데이터불러오고 2. 데이터읽고 3. 데이터업데이트하고 4. 데이터등록하고

이게 100명의 클라이언트라면...? 

이렇게 한명인데도 불구하고 DB에 접속할 일도 많은데 여러명이면 계속 이 번거로운 작업을 계속 해야겠죠?

 

 

*Connection Pool

동시에 접속자가 가질 수 있는 커넥션을 한곳에 모아두고 관리하는 곳

어떻게 처리하는데?

Connection 객체를 미리 만들어 Connection Pool에 생성 해두고

만약에 이미 풀에 있는 Client가 연결을 요청할 경우 풀에서 가지고 와서 Connection을 수행

즉,그래서 DB랑 연결된 커넥션을 미리 만들어서 풀속에 저장해두고 있다가 필요할때 커넥션을 주고, 안쓰면 반환하고 

언제 커넥션을 주고,반환하지?

예를 들어 누군가 접속했을때 

case1. 자신이 관리하는 풀에 커넥션이 남아 있음 -> 커넥션을 제공함
case2. 남아있는 커넥션이 없음(풀이 가득찬 상태) -> 들어온 커넥션은 대기상태

뭐가 효율적?

풀 속에 미리 커넥션이 만들어져 있기 때문에 연결시간/닫는시간이 소비되지 않음 ->어플리케이션 실행속도 빨라짐

커넥션을 재사용해서 커넥션 수가 너무 많아지지 않음 ->동시접속자 수 몰려도 다운되지 않음

 

 

 

2) Mysql엔진

클라이언트로부터 접속 및 쿼리요청을 처리하는 부분

-쿼리캐시 : 실행된 쿼리결과를 저장하는 캐시저장소

던진 SQL이랑 같은 값을 미리 저장두고, SQL이 들어오면 바로 결과값을 전달함

왜 쿼리 캐시를 쓰는거? 쿼리의 답속도가 빨라짐 

하지만 db에 접근하는 클라이언트가 많아질 때 문제가 잇어서 AWS의 오로라에선 이를 개선함

어떤문제인데?
먼저 접속하는 사람만 캐시를 잡소, 다른 클라이언트들은 락이 걸리는 문제

그래서 쿼리가 들어오면 쿼리캐시에서 병목현상이 일어날 수 있음

- 쿼리파서 : MySQL이 인식할 수 있도록 쿼리분해

- SQL 옵티마이저 : 어떻게 쿼리를 효율적으로 처리할지 결정

- SQL 실행엔진 : 실행계획에 따라 수행할 일을 스토리지엔진에게 전달

 

*핸들러API

MYSQL엔진-> 스토리지 엔진에게 데이터 읽기/쓰기 요청

이때 사용되는 API를 핸들러 API

핸들러 API내에 데이터 작업이 얼마나 수행되어 있는지 확인하는 방법 
Show global status like 'Handler%';

3) Storage엔진

MySQL엔진으로부터 요청받은 데이터의 쓰기/읽기 작업 처리하는 부분

어디에서 데이터를 가지고 오는데? 실제로 데이터들은 파일형식으로 저장되어 있음

그래서 이걸 어떻게 가지고오느냐에 따라(?) 스토리지 엔진을 선택해서 사용가능 (디폴트는 이노비디)

InnoDB, MyISQM같은 여러개의 스토리지 엔진 있음

스토리지 엔진 확인하는 명령어
SHOW Engines;

Mysql 서버에서 Mysql엔진은 하나지만 스토리지 엔진은 여러개를 동시에 사용할 수 있음

테이블이 사용할 스토리지 엔진을 지정하면, 이후 해당 테이블의 모든 작업은 스토리지 엔진이 처리

 

 

 

728x90
반응형