InnoDB의 redo log는 여러 파일로 구성되어 있지만, 내부적으로 이를 모아서 하나의 연속된 공간으로 사용한다.
InnoDB Redo Log size = innodb_log_file_size * innodb_log_files_in_group
* mysql 5.7 ver에서는 redo log를 최대 2TB까지 설정할 수 있다.
1) innodb_log_file_size
- 각 로그파일의 size를 결정하는 시스템 변수
- 버퍼 풀의 크기가 아무리 크더라도 redo log의 크기가 작으면 자주 checkpoint가 발생하기 때문에 버퍼 풀을 제대로 이용할 수 없게 된다. 따라서 버퍼 풀의 크기를 변경하는 경우, redo log file의 크기도 함께 변경해야 한다.
- 일반적으로 innodb_buffer_pool_size 변수값의 절반 정도로 설정한다.
2) innodb_log_files_in_group
- 로그 파일의 개수를 결정하는 시스템 변수
- redo log의 공간이 클수록 버퍼 풀에 더 많은 dirty page가 들어갈 수 있게 되고 dbs의 성능이 향상된다.
=> 그러나 로그 파일의 사이즈를 너무 키우면 flush에 부하가 걸리고, 한 번에 여러 dml을 관리하므로 control이 어렵다. 로그 파일 개수를 너무 늘리면 그만큼 차지하는 디스크 공간이 커지기 때문에 적절하게 조절하는 것이 중요하다.
InnoDB는 Redo log가 가득 찼을 때나 주기적으로 버퍼 풀에 기록된 내용(dirty page)을 disk에 반영하는데, 이러한 동작을 checkpoint라 한다. redo log도 파일이기 때문에 매 commit마다 redo log에 로그 버퍼의 내용을 반영한다면 잦은 disk 접근으로 인한 성능저하가 발생할 수 있다.
InnoDB에서는 이러한 문제를 해결하기 위해 log buffer에 트랜잭션의 내용을 기록하다가 commit이 발생하면 redo log에 기록하는 것이 아니라, checkpoint가 발생하면 한꺼번에 redo log에 트랜잭션의 변경 내용을 기록하는 group commit을 수행한다.
트랜잭션 commit 전에 WAL(Write Ahead Logging) 프로토콜에 의해 redo log는 flush를 진행한다. 이 때, 한 번 commit당 디스크에 적용하는 것보다 성능 향상을 위해 group commit을 => innodb_flush_method 변수 설정
-
O_DSYNC: 로그 파일은 O_SYNC로 열지만 flush는 수행하지 않는 모드. data write 후 동기화 때 fsync() 호출 (default mode)
-
O_DIRECT: 데이터 파일을 O_DIRECT로 열고(내부적으로 fsync 호출됨), data write 후 동기화 때 fsync() 호출 =>direct로 disk에 write 명령어 날림. disk_cache_size 고려하지 않는 옵션. redo log는 file cache에 존재하지 않게 됨=> 대부분 이방법 사용
-
O_DIRECT_NO_FSYNC: o_direct의 이중 fsync를 피하기 위해 설정하는 모드
-
O_direct_all: data file까지 direct로 write => mariaDB에 존재했음(지금은 없어졌을거임)
checkpoint age(MariaDB)
checkpoint age = (마지막 Redo Log 슬롯 LSN) - (최근 checkpoint 발생한 시점 LSN) = 현재 Redo Log file에서 재사용 가능한 여유공간
플러시해야 할 더티 페이지의 수 = ((innodb_io_capacity_max / innodb_io_capacity) * (lsn_age_factor * sqrt(lsn_age_factor))) / 7.5;
-
checkpoint age가 redo_log_size에 가까울수록 redo log에 여유공간이 없으므로, innoDB에서는 fuzzy checkpointing을 통해 더 자주 flush작업을 진행함
-
normal mode( ~75%)
-
async mode(75~88%)
-
sync mode(88%~ )
-
sync, async: error
-
innodb_io_capacity: innoDB에서 가능한 전체 I/O 수용량 = IOPS( I/O Operations per second)
-
default 200, 100 이상의 숫자 설정 가능(20,000 초과하지 않는 것을 권장) - ssd 1000
-
innodb_flush_sync: checkpoint 발생 시 대량의 I/O가 발생하는 동안 innodb_io_capacity값을 무시하는 변수. 기본적으로 활성화되어있음
※ checkpoint age는 mariaDB에서도 현재 없어진 상태이다(10.1버전 이전까지만 존재한다).
아직 완벽하게 대체되는 변수가 없기 때문에 mySQL에서는 아래와 같은 방법으로 계산하여 checkpoint age를 찾는다.
출처: mariadb.com/kb/en/innodb-redo-log/#determining-the-checkpoint-age-in-innodb
InnoDB Redo Log
The redo log is used by InnoDB during crash recovery.
mariadb.com
'MySQL' 카테고리의 다른 글
Year 2038 Problem (0) | 2021.02.26 |
---|---|
[data type]CHAR형의 pad_char_to_full_length 옵션과 VARCHAR형 비교 (0) | 2021.02.26 |
[InnoDB] In-memory buffer의 종류 (0) | 2021.02.19 |
06. 트랜잭션에 대한 격리 수준(isolation level) (0) | 2020.06.23 |
05. InnoDB 트랜잭션 처리 및 로그(Undo/Redo) 관리 (0) | 2020.06.23 |