CS/데이터베이스

MySQL의 기본 -4

잼문 2025. 6. 1. 23:56

InnoDB 버퍼 풀과 리두 로그의 역할

InnoDB의 버퍼 풀(Buffer Pool)은 데이터 캐시와 쓰기 버퍼링이라는 두 가지 핵심 역할을 담당합니다.
즉, 자주 사용되는 데이터와 인덱스 정보를 메모리에 미리 올려두고(캐시), INSERT, UPDATE, DELETE와 같은 변경 작업도 디스크에 즉시 기록하지 않고 일정 시간 메모리(버퍼 풀)에서 지연·집계 후 한꺼번에 기록함으로써 전체 데이터베이스 서버의 성능을 크게 향상시킵니다.

버퍼 풀의 데이터 상태: 클린 페이지와 더티 페이지

버퍼 풀에는 클린 페이지(Clean Page, 디스크와 동일한 데이터)와 더티 페이지(Dirty Page, 메모리에서만 변경된 상태로 디스크와 불일치) 가 함께 존재합니다.

더티 페이지는 디스크에 기록되지 않은 변경사항을 임시로 보관하고 있으며, 무한정 버퍼 풀에 머무를 수 없으므로 특정 시점(Checkpoint, 플러시, 버퍼 풀 압박 등)마다 디스크 파일로 동기화(Flush)되어야 합니다.

리두 로그(Redo Log)의 구조와 순환 방식

InnoDB의 리두 로그는 하나 이상의 고정 크기 파일을 연결해 순환(Circular) 구조로 관리합니다. 즉, 로그 파일 크기가 한계에 도달하면 가장 오래된 로그부터 새로운 엔트리로 덮어쓰는 방식입니다.

LSN(Log Sequence Number)은 리두 로그에 기록되는 모든 엔트리의 위치와 순서를 나타내는 값으로, 실제 파일은 순환되지만 LSN 값은 무한히 증가합니다.

리두 로그 파일의 일부 공간은 아직 복구/플러시를 위해 “재사용 불가” 상태로 남아있을 수 있습니다. 이 구간이 바로 활성 리두 로그(Active Redo Log)이며, 여기는 안전하게 덮어쓸 수 없으니 체크포인트와의 동기화가 반드시 필요합니다.

체크포인트(Checkpoint)의 역할

InnoDB 스토리지 엔진은 주기적으로 체크포인트(Checkpoint) 이벤트를 발생시켜 버퍼 풀에 있는 더티 페이지를 디스크 파일에 동기화(Flush)하고, 이때까지의 리두 로그 영역을 “재사용 가능” 상태로 변경합니다.

이 과정이 없다면 리두 로그 파일이 가득 차거나 시스템 장애 시 데이터 손실 위험이 커지므로 체크포인트는 데이터베이스 신뢰성과 성능 모두에 매우 중요한 역할을 합니다.

실무적 포인트

버퍼 풀과 리두 로그의 협업 구조 덕분에 InnoDB는 높은 트랜잭션 처리량과 데이터 안정성을 동시에 달성할 수 있습니다.

버퍼 풀 크기, 리두 로그 파일의 크기(innodb_log_file_size), 체크포인트 정책(innodb_flush_log_at_trx_commit 등)을 서비스 특성에 맞게 튜닝하는 것이 시스템 전체의 성능과 장애 복구 시나리오에 큰 영향을 미칩니다.

전체적인 줄글로 정리

InnoDB의 버퍼 풀(Buffer Pool)은 데이터베이스 성능의 핵심 역할을 맡고 있습니다. 이 공간은 디스크에 저장된 데이터와 인덱스 정보를 메모리에 미리 캐싱해 두고, 동시에 데이터 변경이 일어날 때는 그 결과를 즉시 디스크에 기록하지 않고 메모리에서 일시적으로 모아두는 쓰기 버퍼링 역할도 수행합니다.

이 과정에서 버퍼 풀에는 디스크와 동일한 상태의 클린 페이지(Clean Page)와, 변경된 내용이 메모리에만 반영된 더티 페이지(Dirty Page)가 함께 존재하게 됩니다. 더티 페이지는 언젠가는 디스크로 동기화(Flush)되어야 하며, 이는 체크포인트(Checkpoint) 시점이나 버퍼 풀 압박 등 다양한 조건에서 발생합니다.

한편, InnoDB의 리두 로그(Redo Log)는 데이터 무결성과 장애 복구를 위해 반드시 필요한 구조입니다. 리두 로그는 하나 이상의 고정 크기 파일을 원형(순환) 구조로 연결해 사용하며, 로그 파일 크기가 한계에 다다르면 가장 오래된 엔트리부터 새로운 엔트리로 순차적으로 덮어씁니다. 이때 각 로그 엔트리는 LSN(Log Sequence Number)이라는 고유한 번호로 식별되며, LSN은 파일이 순환되더라도 값이 계속 증가합니다.

특정 시점까지는 여전히 복구나 플러시를 위해 삭제할 수 없는 영역이 남아 있는데, 이를 활성 리두 로그(Active Redo Log)라고 부르며, 이 구간은 반드시 체크포인트와의 동기화가 이루어진 뒤에야 재사용이 가능합니다.

InnoDB는 일정 주기마다 체크포인트 이벤트를 발생시켜, 버퍼 풀 내 더티 페이지를 디스크에 기록하고, 리두 로그의 일부를 재사용 가능 상태로 전환합니다. 이러한 구조 덕분에 InnoDB는 높은 트랜잭션 처리량과 뛰어난 데이터 안정성을 모두 달성할 수 있습니다. 결국, 버퍼 풀과 리두 로그, 그리고 체크포인트 정책(예: innodb_log_file_size, innodb_flush_log_at_trx_commit 등)을 시스템과 서비스 특성에 맞게 적절히 튜닝하는 것이 전체 데이터베이스 성능과 장애 복구 신뢰도를 좌우하는 중요한 포인트가 됩니다.