Database/Redis

[Redis] Asynchronous AOF fsync is taking too long (disk is busy?). 오류

꽁담 2021. 3. 7. 14:22

 

 

레디스 AOF 시 오류 발생

 

레디스 aof 시 아래와 같은 오류가 발생했습니다.

이 에러는 AOF 쓰기작업을 하는데 디스크에 쓰는 속도가 느려 레디스가 느려질 수 있다는 의미입니다.

Asynchronous AOF fsync is taking too long (disk is busy?).
Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.

 

AOF 와 관련된 레디스 옵션 (일부)

appendonly

aof 쓰기를 활성화 하는 여부입니다.

 

appendfsync

always : 명령어가 수행될 때마다 aof 파일로 디스크 쓰기를 진행합니다.

everysec : 1초에 한번씩 aof 파일로 디스크 쓰기를 진행합니다.

no : aof 파일로 디스크 쓰는것을 OS 에서 진행합니다.

1
2
3
4
5
"appendonly"     # AOF 진행
"yes"
 
"appendfsync"    # AOF 파일로 쓰는 주기 (1초)  always | everysec | no
"everysec"
cs

 

중요 포인트

 

everysec 와 always 는 레디스 fsync 명령어로 처리되며, 이 작업이 완료될때까지 다른 명령어들은 대기하게 됩니다.

no 는 OS 에서 하기 때문에 레디스 명령어로 처리되지 않아서 aof 에 쓰는동안에도 다른 명령어가 수행 가능합니다.

그렇지만 OS 에서 쓰기 동작은 30초에 한번씩 수행될 가능성이 있기 때문에 이 부분을 고려해야 합니다.

 

 

이 오류로 인해 파생되는 문제

1. 클라이언트에서 레디스 접속이 느려져 Timeout 으로 커넥션 실패할 수 있습니다.

레디스 접속 시 레디스에서 응답을 못해주기 때문입니다.

 

2. 다른 레디스 명령어들의 처리가 fsync 가 완료될때까지 늦어집니다.

 

3. 센티넬 모니터링을 하고있는경우 sdown 과 odown 알람발생 혹은 Failover 까지도 진행될 수 있습니다.

센티넬-레디스는 PING-PONG 으로 헬스체크를 하는데 PONG 응답이 늦게오면

센티넬에서는 레디스가 다운되었다고 판단하여 sdown - odown 으로 가기 때문입니다.

 

 

결론

AOF 기능을 써야하는경우 가능하다면 appendfsync 를 NO 옵션으로 설정합니다.

혹은 Timeout 과 관련된 설정을 더 늘리는 방법도 있습니다.