daehwan2da / Database

MySQL, NoSQL (cassandra, mongo..)
0 stars 0 forks source link

MySQL Architecture #1

Open daehwan2da opened 1 year ago

daehwan2da commented 1 year ago

MySQL engine

client 와의 network I/O 를 담당한다.

Storage engine

Disk I/O 를 담당한다.

InnoDB

MySQL Threading architecture

process 가 아닌 thread 기반 동작

foreground

접속된 client 의 수 (session) 만큼 존재하며, 각 클라이언트의 요청 쿼리를 수행한다. 사용자의 connection 이 끝나면 Thread Cache (Thread Pool) 로 재 적재.

background

사용자의 요청을 처리하는 도중 데이터의 쓰기 작업은 지연처리 (버퍼링) 되어질 수 있지만, 읽기 작업은 지연될 수 없다. (동기적?)

daehwan2da commented 1 year ago

메모리 할당 및 사용 구조

global 영역과 local (session) 영역으로 구분해 할당되어진다.

global

local (session)

client thread 의 쿼리 작업에 필요한 메모리 공간으로, 각 요청 쓰레드마다 독립적으로 할당받아진다. (공유되어지지 않는다.)

daehwan2da commented 1 year ago

Transaction 지원 metadata

MySQL 5.0 에서는 파일 기반의 메타데이터 생성 및 변경 작업에 대한 transaction 은 제공되어지지 않았기 때문에 파일 생성 또는 변경 도중 MySQL 서버가 비정상적으로 종료되면 일관되지 않은 상태로 남는 문제가 있었다.

daehwan2da commented 1 year ago

InnoDB Storage Engine Architecture

mysql storage engine 중 유일하게 레코드 기반의 잠금을 제공

primary key 에 의한 clustering

pk 순서대로 disk 에 저장되어지며, primary key 가 clustering index 이기 때문에 primary key 를 이용한 range scan 은 상당히 빠르게 처리되어진다.

(MyISAM 의 경우 clustering key 를 지원하지 않아서, primary key 와 secondary index 는 구조적으로 아무런 차이가 없다.)

MVCC (Multi Version Concurrency Control)

record level 의 transaction 을 지원하기 위한 기능으로, 잠금을 사용하지 않는 일관된 읽기를 제공한다.

multi version 은, 하나의 record 에 대해 여러 개의 version 이 동시에 관리되어지는 경우를 의미한다.
- isolation level 에 대한 이해 필요

## READ_COMMITED 인 innoDB 테이블의 데이터 변경 처리 과정

### 한 건의 record 를 insert 하고 update 과정의 절차
[1] INSERT, COMMIT
  - insert 문이 실행된 경우 db 상태
    - (inno db) buffer pool 에 record 가 적재되어지고, disk 에 write 되어진다.

[2] UPDATE
  - update 문이 실행된 경우 db 상태
    - commit 여부와 관계 없이 buffer pool 의 record 가 update 되어지고, undo log 에 update 전 데이터가 buffer 되어진다.
    - disk 에는 값의 변경이 반영되어졌을수도 있고, 아닐 수도 있다.
      - Inno DB 가 ACID 를 보장하기 때문에 일반적으로 inno DB 의 buffer pool 과 file 의 상태는 동일한 상태라고 봐도 무방하다

(아직 COMMIT 을 요청한 상태는 아님)

[3] SELECT 를 통해 record 조회 
  - mysql server 의 시스템 변수인 transaction_isolation 에 설정된 isolation level 에 따라 달라진다.
  - READ_COMMITED 상태이므로, buffer 의 값이 아닌, undo 영역의 데이터를 반환한다.

Non-locking Consistent Read

격리 수준이 SERIALIZABLE 이 아닌 READ_UNCOMMITED, READ_COMMITED, REPEATABLE_READ 의 경우는 insert 와 연결되지 않은 select 작업에 대해 다른 transaction 의 변경 작업 없이 잠금 대기 없이 바로 실행되어진다.


InnoDB Buffer Pool

disk 의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간

Buffer pool 의 구조

innodb_page_size 의 값을 바탕으로 쪼개어 inno db storage engine 이 데이터를 필요로 할 때 읽어서 저장\

LRU list

Flush list

disk 로 동기화되지 않은 데이터를 가진 data page (dirty page) 의 변경 시점 기준의 페이지 목록

Free list

innoDB buffer pool 에서 비어 있는 페이지들의 목록, 사용자의 쿼리가 disk 로 부터 i/o 가 발생해 적재되어야하는 경우 사용됨 (cache miss)