본문 바로가기

CS/데이터베이스

MySQL의 기본 -11

체크포인트(Check point)란?

체크포인트(Checkpoint)는 InnoDB가 데이터 무결성을 보장하고, 장애 발생 시 복구 시간을 단축하기 위해 사용하는 핵심 메커니즘이다. MySQL(InnoDB)은 데이터를 디스크에 영구 저장할 때 WAL(Write-Ahead Logging) 방식을 따른다. 

이는 데이터 변경 내용을 먼저 로그에 기록한 뒤 나중에 실제 데이터를 디스크에 반영하는 기법으로, 데이터 무결성과 복구를 효율적으로 지원한다. 체크포인트는 특정 시점에서 버퍼 풀(Buffer Pool)에 있는 변경된 데이터를 디스크로 플러시(Flush)하는 작업을 수행한다.

체크포인트가 필요한 이유는 크게 두 가지다. 

첫째, 시스템 장애 발생 시 복구 시간을 단축하기 위함이다. InnoDB는 데이터를 즉시 디스크에 쓰지 않고 버퍼 풀에서 변경 작업을 수행하며, 그 내용은 REDO 로그에 기록된다. 시스템이 갑자기 종료되면 REDO 로그를 이용해 데이터를 복구하는데, REDO 로그가 너무 많으면 복구에 시간이 오래 걸린다. 따라서 체크포인트는 특정 시점까지의 변경 내용을 디스크에 저장해 REDO 로그 크기를 줄이고 복구 시간을 단축한다. 

둘째, REDO 로그 공간 관리를 위해서다. REDO 로그는 한정된 크기를 가지므로, 체크포인트를 통해 일정 범위의 로그를 지우고 공간을 확보한다.

체크포인트에는 여러 종류가 있지만, InnoDB에서는 ‘퍼지 체크포인트(Fuzzy Checkpoint)’를 사용한다. 퍼지 체크포인트는 변경된 데이터 중 일부만을 디스크로 플러시하는 방식으로, REDO 로그가 가득 차기 전에 지속적으로 더티 페이지를 디스크에 기록하며 안정적인 관리를 유지한다.

동시성 증가를 위해 여러 개의 버퍼 풀 사용

버퍼 풀(Buffer Pool)을 여러 개 생성한다고 해서 특정 쿼리가 한 버퍼 풀만 사용하는 것은 아니다. 버퍼 풀은 페이지 단위로 데이터를 관리하기 때문에, 특정 테이블이나 쿼리가 특정 버퍼 풀만 사용하는 것이 아니라 여러 버퍼 풀에 걸쳐 데이터를 읽고 쓸 수 있다.

버퍼 풀을 여러 개로 나누는 주된 이유는 경합(Contention)을 줄이고 성능을 향상시키기 위해서다. InnoDB는 다중 스레드 환경에서 많은 쿼리가 동시에 실행될 때 버퍼 풀 내 락 경합(Latch Contention)이 발생할 수 있다. 

버퍼 풀을 여러 개로 분할하면 각 스레드가 서로 다른 버퍼 풀을 사용할 확률이 높아져 경합이 줄어든다. 또한, 특정 핫 페이지(자주 사용되는 데이터)가 한 버퍼 풀에 몰리는 현상을 방지하고 데이터 액세스를 분산시켜 I/O 병목 현상을 완화한다.

버퍼 풀 분할은 innodb_buffer_pool_instances 변수로 설정할 수 있으며, 이때 버퍼 풀은 여러 개의 독립된 풀로 나뉜다. 각 버퍼 풀은 자체 LRU 리스트와 Free 리스트를 관리한다. 페이지가 어느 버퍼 풀에 할당될지는 페이지 주소 등을 해시(Hash) 알고리즘으로 결정하며, 페이지가 한 번 특정 버퍼 풀에 할당되면 그 버퍼 풀에서만 관리된다. 이처럼 여러 버퍼 풀을 활용한 분할 전략은 InnoDB의 동시성 및 성능을 개선하는 중요한 기법이다.

Midpoint Insertion Strategy란?

Midpoint Insertion Strategy(중간 삽입 전략)는 InnoDB의 버퍼 풀 내 LRU(Least Recently Used) 리스트에서 새로운 페이지를 단순히 앞부분에 삽입하지 않고, 리스트의 중간 지점에 삽입하는 방법을 의미한다.

기본적인 LRU 전략은 버퍼 풀 내 데이터를 관리할 때, 가장 오래 사용하지 않은 페이지를 제거하고 새로 로드된 페이지를 리스트 앞쪽에 위치시키는 방식이다. 그러나 이 방식에는 단점이 있다. 예를 들어, 단 한 번만 사용되는 페이지도 리스트 앞쪽으로 올라와 버퍼 풀의 귀중한 공간을 차지하게 되고, 실제로 자주 사용되는 페이지가 밀려나는 현상, 즉 버퍼 풀 오염(Buffer Pool Pollution)이 발생할 수 있다.

Midpoint Insertion Strategy의 원리

이 문제를 해결하기 위해 InnoDB는 LRU 리스트를 두 개의 영역, 즉 Active 영역과 Inactive 영역으로 나눈다. 전체 LRU 리스트 중 약 62.5%인 5/8은 Active 영역으로, 자주 사용되는 페이지들이 자리하며 나머지 37.5%인 3/8은 Inactive 영역으로 최근에 로드된 페이지들이 위치한다. 새로운 페이지는 LRU 리스트의 가장 앞이 아닌 이 중간 지점, 즉 Active와 Inactive 영역의 경계 지점에 삽입된다.

새로 삽입된 페이지가 다시 참조되면 그 페이지는 LRU 리스트의 맨 앞으로 이동하여 Active 영역에 남아 있게 되고, 그렇지 않으면 시간이 지남에 따라 Inactive 영역에서 제거된다.

Midpoint Insertion Strategy의 장점

이 전략의 장점은 여러 가지다. 먼저, 특정 쿼리가 한 번만 사용하는 데이터, 예를 들어 테이블 전체 스캔 결과가 버퍼 풀의 앞부분을 차지하는 문제를 방지한다. 또한, 진짜 자주 사용되는 데이터는 Active 영역에 지속해서 남아 있어 캐시 효율이 높아진다. 마지막으로, 이러한 관리 방식은 버퍼 풀 메모리를 더욱 효율적으로 활용할 수 있도록 돕는다.

따라서 Midpoint Insertion Strategy는 InnoDB가 버퍼 풀의 데이터를 더 정교하게 관리하여 성능 저하 없이 효율적인 메모리 사용을 가능하게 하는 핵심 기법이다.

'CS > 데이터베이스' 카테고리의 다른 글

MySQL의 기본 -13  (0) 2025.06.02
MySQL의 기본 -12  (0) 2025.06.02
MySQL의 기본 -10  (0) 2025.06.02
MySQL의 기본 -9  (0) 2025.06.02
MySQL의 기본 -7  (0) 2025.06.02