MySQL Double Write Buffer

znftm97·2022년 4월 5일
0

Database

목록 보기
2/3

0. 이 글을 쓰는 이유

InnoDB 스토리지 엔진의 architecture를 활용한 기능중에 하나로, InnoDB 스토리지 엔진에 대한 이해도를 높이기 위한 좋은 주제라고 생각한다.

1. 시작하기 전에

1-1. 페이지, 블록

  • 아래 사진에서처럼 하나의 세그먼트는 여러 익스텐트를 가지고, 각 익스텐트는 여러개의 블록으로 이루어져 있다.

  • 여기서 블록은 사용자가 입력한 데이터(레코드)가 실제로 저장되는 공간으로 데이터를 읽고 쓰는 단위이다. 즉 DB에서 하나의 row 이다.

  • 오라클에서는 블록이라는 단위로 부르고, MySQL에서는 페이지라는 단위로 부른다.

  • 그리고 INSERT, UPDATE, DELETE 명령으로 변경된 데이터를 가지고 있는 페이지를
    더티페이지 라고 한다.


2. Double Write Buffer

2-1. 탄생 배경 - 왜?

InnoDB 스토리지 엔진의 Redo log는 공간의 낭비를 막기 위해 페이지의 변경된 내용만 기록하는데 더티 페이지를 디스크 파일로 플러시 할 때 일부만 기록되는 문제가 발생하면 해당 페이지의 내용은 복구할 수 없을 수도 있다.

이런 현상을 파셜 페이지(Partial-page) 또는 톤 페이지(Torn-page) 라고 하는데
이는 하드웨어의 오작동이나 시스템의 비정상 종료등으로 발생할 수 있다.

이런 현상을 막기 위해 Double-Write 기법을 이용한다.

2-2. 동작 방식

  • InnoDb에서 A~E 까지 더티페이지를 디스크로 플러시 한다고 가정해보자.

정상적인 경우

  1. 더티 페이지를 모두 묶어서 한번에 Double Write Buffer에 기록한다.

  2. 각 더티 페이지를 실제로 디스크에 반영한다.

디스크에 데이터 기록 중 장애 발생한 경우

  1. 더티 페이지를 모두 묶어서 한번에 DoubleWrite 버퍼에 기록한다.

  2. C 더티 페이지를 실제로 디스크에 반영하던 중 DB서버가 종료되었다.

  3. DB서버를 재시작한다.

  4. InnoDB 스토리지 엔진은 재시작될 때 항상 Double Write Buffer의 내용과 실제 디스크에 기록된 데이터들을 모두 비교해 다른 내용을 담고있는 페이지가 있다면 Double Write Buffer의내용을 실제 디스크에 반영한다.

2-3. 기타

  • innodb_doublewrite 변수로 해당 기능을 사용할지 여부를 정한다.

  • 해당 기능은 기본적으로 활성화 되어 있다.

  • 자동으로 복구되지 않더라도, 더티 페이지들이 서버 내 특정 경로에 저장되어 있으므로
    수동으로 복구도 가능하다.


출처

profile
자기주도형 개발자

0개의 댓글