2024. 2. 3. 23:43ㆍDatabase
Doublewrite Buffer
MySQL이 비정상적으로 종료되었을 때,
버퍼 풀에서 플러시되었으나 데이터 파일에 일부만 기록된 데이터들이 생길 수 있다.
(이들을 Partial-page 혹은 Ton-page 라고 한다.)
InnoDB는 이러한 오작동으로 인한 데이터 손실을 방지하기 위해,
버퍼 풀의 더티 페이지를 데이터 파일에 쓰기 전에 한곳에 모아서 저장한 후(백업용도),
버퍼 풀의 더티 페이지를 데이터 파일로 쓰기 시작한다.
이때 데이터 파일에 쓰기 전 모아서 저장되는 영역을 Doublewrite Buffer라 한다.
즉 Doublewrite Buffer는 버퍼 풀에서 플러시된 데이터 페이지를 실제 데이터 파일에 쓰기 전에 저장하는 영역이다.
✔️ 작동 방식
위는 버퍼 풀에 존재하는 더티 페이지(A ~ E)를 디스크로 플러시하는 예시이다.
InnoDB는 더티 페이지를 실제 데이터 페이지에 작성하기 전에,
더티 페이지들을 묶어서 Doublewrite Buffer에 기록한다.
이후 버퍼 풀의 더티 페이지를 개별로 데이터 파일에 기록한다.
해당 과정이 정상적으로 진행되면 Doublewrite Buffer의 내용은 필요가 없어지지만,
서버가 비정상 종료되어 데이터 파일로 기록되지 못한 더티 페이지가 존재하는 경우
MySQL 서버 재시작 시 Doublewrite Buffer의 내용을 Data File에 반영한다.
(이를 위해 MySQL 서버 재시작 시 항상 Doublewrite Buffer의 내용과 데이터 파일의 페이지들을 모두 비교하여 다른 부분을 찾는다.)
Doublewrite Buffer의 활성화 여부는 innodb_doublewrite를 통해 설정할 수 있다.
Doublewrite Buffer는 HDD처럼 자기 원판이 회전하는 저장 시스템에서는,
어차피 한 번의 순차 디스크 쓰기를 하는 것이므로 큰 부담이 되지 않는다.
그러나 SSD처럼 랜덤 IO나 순차 IO의 비용이 비슷한 저장 시스템에서는 부담스러울 수 있다.
그럼에도 데이터의 무결성이 중요하다면 활성화하는 것을 권장한다.
만약 성능을 위햐 InnoDB 리두 로그 동기화 설정(innodb_flush_log_at_trx_commit)을 1이 아닌 값을 설정했다면,
Doublewrite Buffer도 비활성화하는 것이 좋다.
참고
'Database' 카테고리의 다른 글
InnoDB 알아보기 (On-Disk Structures - Tablespace) (0) | 2024.02.02 |
---|---|
InnoDB 알아보기 (In-Memory Structures - Log Buffer) (0) | 2024.01.31 |
InnoDB 알아보기 (In-Memory Structures - Adaptive Hash Index) (1) | 2024.01.31 |
InnoDB 알아보기 (In-Memory Structures - Change Buffer) (0) | 2024.01.29 |
InnoDB 알아보기 (In-Memory Structures - Buffer Pool) (0) | 2024.01.29 |