본문 바로가기
다른 DBMS/MySQL&MariaDB

InnoDB Doublewrite Buffer

by 취미툰 2021. 1. 14.
반응형

 

▶ doublewrite buffer란?

InnoDB의 데이터 파일에 쓰기 전에 버퍼 풀로부터 flush된 페이지를 쓰는 저장영역입니다. 

만약, 페이지 쓰기 도중 갑작스런 mysqld 프로세스의 정지나 OS 이슈 등일때  Crash Recovery 를 시도하고 InnoDB는 doublewrite buffer로부터 페이지의 복사본을 찾아 복구를 수행할 수 있습니다.

 

비록 데이터는 doublewrite buffer에 두번 쓰여지지만, I/O 오버헤드나 I/O작업이 두배나 필요하지는 않습니다.

데이터는 doublewrite buffer에 OS에서 단일 fsync()라고 불리는 기능으로 큰 덩어리(large chunk) 순서로 쓰여집니다.

(innodb_flush_method가 O_DIRECT_NO_FSYNC로 설정된 경우는 제외)

 

8.0.20 이전에는 InnoDB System Tablespace에 위치하고 있엇습니다. 8.0.20부터는 doublewrite files이 따로 존재하고 그곳에 저장합니다.

 ls -al *dblwr
-rw-r-----. 1 mysql mysql  196608 Jan 12 02:49 #ib_16384_0.dblwr
-rw-r-----. 1 mysql mysql 8585216 Jan 12 01:49 #ib_16384_1.dblwr

 

doublewrite buffer 구성을 위한 변수입니다.

 

innodb_doublewrite=[ON(default)/OFF]

doublewrite buffer를 활성화 할 수 있게 관리해주는 파라미터입니다. 

비활성화를 하기 위해서는 innodb_doublewrite=0 으로 셋팅하거나 서버 시작시 --skip-innodb-doublewrite 옵션을 추가하여 시작합니다. 

 

Mysql이 OS상에서 atomic write를 지원하는 Fusion-io 디바이스에 위치하고 있다면, 자동으로 doublewrite 기능은 비활성화되고 atomic wtire가 대신 사용됩니다.

해당 기능의 이점을 Full로 받기 위해서는 innodb_flush_method=O_DIRECT로 설정하는것을 권장합니다.

 

innodb_doublewrite_dir=[경로명]

8.0.20부터 소개된 파라미터입니다. doublewrite파일의 위치를 정의합니다. 만약 파라미터에 경로가 구체적으로 설정되어 있지 않으면 innodb_data_home_dir경로에 생성됩니다. default로는 경로명이 설정되어 있지 않습니다.

 

스키마와의 충돌을 피하기 위해 접두사 '#'가 자동으로 붙습니다. 그러나 디렉토리이름에 명시적으로 '.','#','/'가 접두사가 지정되면 디렉토리이름에 접두사 '#'는 붙지 않습니다. 

 

이상적으로 doublewrite buffer는 사용가능한 가장 빠른 저장매체(예를 들어 SSD)에 저장하면 좋습니다.

 

innodb_doublewrite_files=숫자[2(default)]

doublewrite 파일의 수를 정의합니다. default로 2개의 파일이 각 버퍼 풀 인스턴스마다 생성됩니다. 

doublewrite 파일의 flush list 은 버퍼풀의 flush리스트로부터 flush된 페이지 저장용입니다.  doublewrite 파일의 flush listdefault 사이즈는 InnoDB 페이지 사이즈 * doublewrite page bytes 입니다.

 

doublewrite 파일의 LRU 리스트는 버퍼 풀의 LRU 리스트로부터 flush된 페이지 저장용입니다. 그것은 또한 단일 페이지 flush를 위한 슬롯을 포함합니다. default 사이즈는 InnoDB 페이지 크기 * (doublewrite 페이지 + (512/버퍼 풀 인스턴스의 수))입니다. 여기서 512는 단일 페이지 flush용으로 설정된 총 슬롯 수입니다.

 

최소 2개의 doublewrite 파일이 있습니다. 최대는 버퍼 풀 인스턴스 수의 두배입니다.

버퍼 풀 인스턴스는 innodb_buffer_pool_instance 파라미터의 값으로 확인할 수 있습니다.

 

mysql> show variables like 'innodb_buffer_pool_instances'; 
+------------------------------+-------+ 
| Variable_name                | Value | 
+------------------------------+-------+ 
| innodb_buffer_pool_instances | 1     | 
+------------------------------+-------+ 
1 row in set (0.00 sec) 

파일의 이름은 #ib_페이지사이즈_넘버링.dblwr의 형식으로 생성됩니다. InnoDB 페이지사이즈가 16KB이고 하나의 버퍼풀일 때 파일의 이름을 아래와 같습니다.

 

 ls -al *dblwr
-rw-r-----. 1 mysql mysql  196608 Jan 12 02:49 #ib_16384_0.dblwr
-rw-r-----. 1 mysql mysql 8585216 Jan 12 01:49 #ib_16384_1.dblwr

innodb_doublewrite_pages=숫자[4(default)]

8.0.20부터 소개되었고 쓰레드 당 doublewrite 페이지의 최대 수를 관리하는 파라미터입니다.

해당 값이 설정되어 있지 않으면 innodb_write_io_threads 파라미터의 값으로 셋팅됩니다.

 

mysql> show variables like 'innodb_write_io_threads'; 
+-------------------------+-------+ 
| Variable_name           | Value | 
+-------------------------+-------+ 
| innodb_write_io_threads | 4     | 
+-------------------------+-------+ 
1 row in set (0.00 sec) 

 

innodb_doublewrite_batch_size=0(default)

8.0.20부터 소개되었고 배치에서의 doublewrite 페이지의 수를 관리합니다. 

 

8.0.23부터 InnoDB는 암호화된 테이블스페이스에 속하는 doublewrite 파일 페이지를 자동으로 암호화합니다.

마찬가지로 page-compressed 테이블스페이스에 속하는 doublewrite 파일은 압축합니다.

결과적으로 doublewrite 파일은 다음을 포함할 수 있습니다.

암호화되지 않은 페이지 + 압축되지 않은 페이지

암호화된 페이지

압축된 페이지

암호회된 페이지 + 압축된 페이지

 

 

 

반응형

'다른 DBMS > MySQL&MariaDB' 카테고리의 다른 글

InnoDB Undo Log  (0) 2021.01.16
InnoDB Redo Log  (0) 2021.01.15
InnoDB On-Disk Structures  (0) 2021.01.13
InnoDB IN-MEMORY Structures  (0) 2021.01.12
Mysql 로그 종류  (0) 2021.01.09

댓글