Loading...
MySQL 9.5 Reference Manual 9.5의 17.6.4 Doublewrite Buffer의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
doublewrite buffer는 buffer pool에서 플러시된 page를 InnoDB data file의 올바른 위치에 기록하기 전에 InnoDB가 page를 기록하는 스토리지 영역입니다. page write 중간에 운영 체제, 스토리지 서브시스템, 또는 예기치 않은 mysqld process 종료가 발생하더라도, InnoDB는 크래시 복구 동안 doublewrite buffer에서 해당 page의 정상적인 복사본을 찾을 수 있습니다.
데이터가 두 번 기록되지만, doublewrite buffer는 두 배의 I/O 오버헤드나 두 배의 I/O 연산을 필요로 하지 않습니다. 데이터는 큰 연속 청크로 doublewrite buffer에 기록되며, (단, innodb_flush_method가 O_DIRECT_NO_FSYNC로 설정된 경우는 제외하고) 운영 체제에 대해 단 한 번의 fsync() 호출만 수행됩니다.
doublewrite buffer 스토리지 영역은 doublewrite file에 위치합니다.
다음 variable들이 doublewrite buffer 구성을 위해 제공됩니다:
innodb_doublewrite variable은 doublewrite buffer가 활성화되어 있는지를 제어합니다. 대부분의 경우 기본적으로 활성화되어 있습니다. doublewrite buffer를 비활성화하려면, innodb_doublewrite를 OFF로 설정하십시오. 예를 들어 벤치마크를 수행할 때와 같이, 데이터 무결성보다 성능이 더 중요하다면 doublewrite buffer를 비활성화하는 것을 고려하십시오.
innodb_doublewrite는 DETECT_AND_RECOVER 및 DETECT_ONLY 설정을 지원합니다.
DETECT_AND_RECOVER 설정은 ON 설정과 동일합니다. 이 설정에서는 doublewrite buffer가 완전히 활성화되고, 데이터베이스 page 내용이 doublewrite buffer에 기록되며 복구 시 불완전한 page write를 수정하기 위해 doublewrite buffer에서 접근됩니다.
DETECT_ONLY 설정에서는 메타데이터만 doublewrite buffer에 기록됩니다. 데이터베이스 page 내용은 doublewrite buffer에 기록되지 않으며, 복구는 불완전한 page write를 수정하기 위해 doublewrite buffer를 사용하지 않습니다. 이 경량 설정은 오직 불완전한 page write를 감지하기 위한 용도입니다.
MySQL은 doublewrite buffer를 활성화하는 innodb_doublewrite 설정을 ON, DETECT_AND_RECOVER, DETECT_ONLY 사이에서 동적으로 변경하는 것을 지원합니다. MySQL은 doublewrite buffer를 활성화하는 설정과 OFF 사이, 또는 그 반대 방향으로의 동적 변경은 지원하지 않습니다.
doublewrite buffer가 어토믹 write를 지원하는 Fusion-io device에 위치한 경우, doublewrite buffer는 자동으로 비활성화되고 data file write는 대신 Fusion-io 어토믹 write를 사용하여 수행됩니다. 그러나 innodb_doublewrite 설정은 글로벌이라는 점에 유의해야 합니다. doublewrite buffer가 비활성화되면, Fusion-io 하드웨어에 존재하지 않는 data file을 포함하여 모든 data file에 대해 비활성화됩니다. 이 기능은 Fusion-io 하드웨어에서만 지원되며, Linux의 Fusion-io NVMFS에 대해서만 활성화됩니다. 이 기능을 최대한 활용하려면, O_DIRECT로 설정된 innodb_flush_method를 사용하는 것이 권장됩니다.
innodb_doublewrite_dir variable은 InnoDB가 doublewrite file을 생성하는 디렉터리를 정의합니다. 디렉터리가 지정되지 않은 경우, doublewrite file은 innodb_data_home_dir 디렉터리에 생성되며, 이 디렉터리는 명시되지 않은 경우 data 디렉터리가 기본값입니다.
schema 이름과의 충돌을 피하기 위해 hash 기호 '#'가 지정된 디렉터리 이름 앞에 자동으로 prefix로 붙습니다. 하지만 디렉터리 이름에 '.', '#', 또는 '/' prefix를 명시적으로 지정한 경우에는 hash 기호 '#'가 디렉터리 이름 앞에 붙지 않습니다.
이상적으로, doublewrite 디렉터리는 사용 가능한 것 중 가장 빠른 스토리지 미디어에 위치해야 합니다.
innodb_doublewrite_files variable은 doublewrite file의 개수를 정의하며, 기본값은 2입니다. 기본적으로, 각 buffer pool 인스턴스마다 두 개의 doublewrite file이 생성됩니다. 하나는 flush list doublewrite file이고, 다른 하나는 LRU list doublewrite file입니다.
flush list doublewrite file은 buffer pool flush list에서 플러시된 page를 위한 것입니다. flush list doublewrite file의 기본 크기는 InnoDB page 크기 * doublewrite page byte 수입니다.
LRU list doublewrite file은 buffer pool LRU list에서 플러시된 page를 위한 것입니다. 또한 single page 플러시를 위한 slot도 포함합니다. LRU list doublewrite file의 기본 크기는 InnoDB page 크기 * (doublewrite page 수 + (512 / buffer pool 인스턴스 수))이며, 여기서 512는 single page 플러시를 위해 예약된 전체 slot 수입니다.
최소한 두 개의 doublewrite file이 존재합니다. doublewrite file의 최대 개수는 buffer pool 인스턴스 수의 두 배입니다. (buffer pool 인스턴스 수는 innodb_buffer_pool_instances variable에 의해 제어됩니다.)
doublewrite file 이름은 다음 형식을 갖습니다: #ib_page_size_file_number.dblwr (DETECT_ONLY 설정에서는 .bdblwr) 예를 들어, 다음 doublewrite file은 page 크기가 16KB이고 buffer pool이 하나인 MySQL 인스턴스에 대해 생성됩니다:
1#ib_16384_0.dblwr 2#ib_16384_1.dblwr
innodb_doublewrite_files variable은 고급 성능 튜닝을 위한 것입니다. 기본 설정은 대부분의 사용자에게 적합합니다.
innodb_doublewrite_pages variable은 thread당 doublewrite page의 최대 개수를 제어합니다. 이 variable은 고급 성능 튜닝을 위한 것입니다. 기본값은 대부분의 사용자에게 적합합니다.
InnoDB는 암호화된 테이블스페이스에 속하는 doublewrite file page를 자동으로 암호화합니다(참고: Section 17.13, “InnoDB Data-at-Rest Encryption”). 마찬가지로 page-compressed 테이블스페이스에 속하는 doublewrite file page는 압축됩니다. 결과적으로 doublewrite file에는 암호화되지 않고 압축되지 않은 page, 암호화된 page, 압축된 page, 그리고 암호화 및 압축이 모두 적용된 page를 포함하여 서로 다른 page type이 포함될 수 있습니다.
17.6.3 Tablespaces
17.6.5 Redo Log