Redis는 메모리 기반 데이터 저장소로 응답 속도가 빠른 편에 속하기 때문에 캐시 서버로 많은 분들이 이용하고 계십니다.
데이터베이스의 부하를 줄이고 서비스 성능을 더 좋게 해주기 때문이에요!
하지만 무조건 좋은 건 아니에요. Redis를 사용하고 있다고 해서 성능 문제가 다 좋아지는 거는 아니고, 운영 하고 있는 서버에서는 여러가지 문제가 발생할 수 있답니다!
캐시 미스
캐시에 데이터가 인식이 되지 않을 경우에는 데이터베이스에 직접 접근하게 돼요.
인식이 되지 않아서 데이터베이스에 계속 접근하게 되면 데이터베이스에 부하가 많이 생길 수 있어요.
부하가 생기는 것을 방지하기 위해서 필요한 것들입니다!
- 초기 데이터 워밍
- 맞는 TTL 설정
- 자주 조회되는 데이터를 우선 캐싱
캐시 스탬피드
캐시가 동시에 만료되는 경우도 있는데요. 만약 동시에 만료가 되면 많은 요청이 한번에 데이터베이스에 몰리는 현상이에요.
트래픽이 많은 서비스에서 데이터베이스가 몰리면 서버에 오류가 생길 수 있어요…
- TTL에 랜덤 값을 추가하여 만료 시점을 분산한다.
- 분산 락을 통해서 동시에 요청을 제어한다.
- 클라이언트 재시도 횟수 제한을 둔다.
위 3가지를 잘 알고 있어야 나중에 문제가 생겼을 때 빠르게 해결할 수 있어요.
캐시 스탬피드는 실무에 나갔을 때 정말 자주 발생하기 때문에 꼭 알고 계세요! 만약 실무 나갔을 때 스탬피드 생기면 정말 골치 아프거든요..
캐시 데이터가 달라졌다면?
캐시와 데이터베이스에 데이터가 일치하지 않는 문제도 많이 생겨요.
데이터베이스는 업데이트가 잘 됐지만, 캐시는 업데이트가 갱신 되지 않는 경우가 생길 수도 있는데요.
그러면 전에 쓰던 데이터를 쓰게 돼서 캐시와 데이터베이스가 맞지 않는거에요!
- Write-through, Write-back 사용하기
- 데이터 변경 시 캐시 무효화
- TTL 기반 자동으로 만료 설정해놓기
데이터가 맞지 않으면 나중에 고치기 정말 귀찮으니까 위에 방법으로 데이터를 미리 맞춰놓는 걸 추천드립니다!
메모리가 꽉 찼을 때 Redis는 어떻게 작동할까?
Redis는 메모리 기반여서 저장 공간이 넉넉하지 않아요.
만약 Redis 메모리가 가득 차면 데이터가 자동으로 날라가요.
- LRU
- LFU
- TTL 기반 삭제
대표적으로는 LRU, LFU, TTL 기반 삭제가 있으니 메모리가 다 찼을 때 해결하기 위해서 잘 알아두시는 게 좋아요.
만약 LRU, LFU, TTL 기반 삭제 중 하나라도 하지 않으면 나중에 메모리가 찼을 때 정말 중요한 데이터가 삭제되는 끔찍한 일이 발생합니다..
오류 났을 때는 어떻게 해야할까?
Redis 자체에서 오류가 발생하면 서버가 비상사태가 됩니다!!
특히 캐시 의존도가 높은 구조에서 Redis 자체 오류가 발생하면 정말 큰 문제가 발생해버려요.
- Redis 클러스터 또는 복제 구성해놓기
- 캐시 장애 시 데이터베이스 폴백 처리
- 타임아웃 및 예외 처리 로직 구현하기
위 3가지 방법 꼭 숙지해서 자체적으로 오류가 났을 때 꼭 대응해보시길 바랍니다.
캐시는 보조 시스템이라는 건 잊어버리시면 절대 금물!
마무리
Redis 캐시는 성능을 좋게 만드는데 정말 좋지만 처음에 설정을 잘못해놓으면 역효과가 나요.
성능 좋게 하고 캐시 서버로 쓰려고 설정했는데 시스템이 불안정해져서 오류나고 그러면 정말 속상하잖아요..
오늘은 오류가 발생했을 때랑 메모리 꽉 찼을 때, 캐시랑 데이터베이스가 안 맞을 때를 알아봤습니다!
궁금한 부분이 해결됐으면 좋겠어요! 다음에도 유익한 정보 가져오겠습니다. 감사합니다.