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

Helm Chart를 통해서 mater가 1개 replica가 3개인 Redis 클러스터를 설치해서 서비스에 쓰고 있는데

아래와 같이 지속적인 타임아웃 오류가 발생하였다.

[defaultJsonException] Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:292)
org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:514)
org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:193)
org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144)
org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:210)
org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190)

소켓 타임아웃이었기 떄문에 처음에는 단순히 service port 설정이나

네트워크 문제로 발생하는 것으로 생각하였는데,

redis sentinel 환경에서도 master-slave가 자주 뒤바뀌던 현상이 있었어서 뭔가 이상했다.

redis 문제일 것이라 생각못하고 helm values 설정파일을 계속 검토하던 와중, redis 로그를 확인해보니

아래와 같은 로그가 Master/Slave 가리지 않고 계속 찍히는걸 발견할 수 있었다.

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(Append Only File) 방식으로 백업디스크에 데이터를 쓰고 있었는데,

기본옵션인 everysec 으로 설정된경우 1초마다 AOF파일에 기록한다.

따라서 위의 오류는 디스크의 낮은 성능 등으로 AOF sync에 지연이 발생하여

레디스 성능이 저하되고 Timeout까지 지속적으로 발생하는 문제였다.

별도의 pm서버가 아닌 vm클러스터의 일부 네임스페이스에 레디스를 깔아서 쓰고있었고,

레디스에 할당된 스토리지 또한 helm에서 30Gb정도의 pv,pvc로 구성된 것이었기 때문에

성능 부족이 있을 수 있겠다 생각했다.

redis-cli 에 접속하여

config set appendfsync no

명령어를 날려주면 AOF가 30초마다 동작하게 된다.

replica에도 접속하여 똑같이 적용해주어야한다.

위와 같은 성능문제는 해결되겠지만 당연히 30초 동안의 데이터 유실이 생길 수 있다.

You may also like...

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.