참고: 가상 면접 사례로 배우는 대규모 시스템 설계 기초, 알렉스 쉬
캐시, Cache
매 요청마다 데이터베이스와 트랜잭션이 일어나면, 비효율적이고 자원 낭비가 발생한다. 이를 방지하기 위해 자주 사용되거나 비싼 연산 결과는 데이터베이스보다 가까운 캐시라는 저장소에 저장해두고, 사용할 수 있다.
캐시 계층, Cache tier
서버와 데이터베이스 중간 위치에 캐시 계층을 둘 수 있다. 또한, 서비스의 규모에 따라 캐시 계층을 확장할 수 있다. 캐시 계층을 두게 되면 아래와 같은 이점을 얻을 수 있다.
- 성능 개선
- 데이터베이스 부하 감소
캐시의 동작 순서(읽기 주도형 캐시 전략, read-through caching strategy)
- 웹 서버 ➡️ 캐시 : 클라이언트 요청에 대한 데이터 요청
- 캐시 ➡️ 웹 서버 : 만약, 캐시 안에 데이터가 있으면 해당 데이터 전송
- 캐시 ↔️ 데이터베이스 : 만약, 캐시 안에 데이터가 없으면, 데이터베이스에 요청 후 캐시에 임시 저장
- 캐시 ➡️ 웹 서버 : 데이터베이스에서 받은 데이터 전송
캐시 사용 시 유의사항
캐시를 사용하기 적합한 상황
- 데이터 갱신이 자주 일어나지 않음 + 참조는 빈번함
캐시에 두기 적합한 데이터
- 캐시는 휘발성 메모리이다. 즉, 캐시 서버가 재시작되면 내부 데이터들은 모두 사라진다.
- 따라서, 영속적인 데이터 외의 데이터들을 보관해야한다.
캐시의 만료 정책 만들기
- 캐시 데이터들을 얼마나 보관할 지에 대한 만료 정책을 세워야 한다.
- 만약, 만료 정책이 너무 짧으면, 캐시 계층의 존재의미가 옅어질 수 있다. (너무 자주 데이터베이스에 요청해야할 수도 있으므로)
- 그렇다고 만료 정책이 너무 길면, 데이터베이스의 원본 데이터와 캐시 데이터 간 일관성이 꺠질 수 있다.
캐시와 데이터베이스 간 일관성
- 데이터베이스의 원본 데이터를 갱신하는 연산과 캐시를 갱신하는 연산이 단일 트랜잭션으로 처리되지 않는 경우 이 일관성은 깨질 수 있다. (만약, 데이터베이스의 데이터를 갱신하면, 관련된 캐시의 데이터도 동시에 갱신)
- 아래는 캐시와 데이터베이스의 일관성을 유지하기 위한 전략의 예시이다
- 쓰기 작업 시 캐시 무효화
- 데이터베이스에 쓰기 작업 후, 관련 캐시를 무효화하거나 업데이트한다.
- 데이터베이스 트랜잭션 완료 후 캐시 업데이트
- 데이터베이스 트랜잭션이 성공적으로 커밋 된 경우만 캐시를 업데이트 혹은 무효화한다.
- 만약, 데이터베이스 트랜잭션이 롤백될 경우, 캐시는 변경하지 않음.
- 쓰기 주도형 캐싱 전략(write-through caching strategy)
- 데이터베이스에 쓰기 작업(write oprration)을 할 떄마다, 캐시에도 함께 쓰기 작업을 수행한다.
- 쓰기 작업의 성능 저하
- read-through + write-around
- read-througjht: 캐시 미스시, 데이터베이스에서 읽어와 저장함.
- Write-Around: 쓰기 작업은 데이터베이스에만 수행하고, 캐시는 업데이트하지 않음.
- 즉, 쓰기 작업은 데이터베이스에만 직접 수행하고, 읽기 작업은 캐시를 통해 수행한다.
- 쓰기 작업 시 캐시 무효화
단일 장애 지점 피하기
- 단일 장애 지점(Single Point of Failure, SPOF): 전체 시스템의 동작을 중단시켜버릴 수 있는 어떤 특정 지점
- 캐시 서버가 한 대인 경우, 캐시 서버가 중단되면 데이터베이스와 통신이 어려워져 해당 캐시 서버가 SPOF가 될 가능성이 있다.
- 따라서, 이런 SPOF를 피하기 위해 캐시 서버를 여러 지역에 걸쳐 분산시켜야 한다.
캐시 메모리의 크기
- 만약, 캐시 메모리가 너무 작을 경우 : 캐시 내 데이터들이 자주 밀려나서, 성능 저하가 발생할 수 있다.
- 따라서, 캐시 메모리는 최대한 여유 있게 할당 하는 것이 좋다. 여유있게 할당하면, 캐시에 보관해야할 데이터가 갑자기 늘어날 때의 문제도 방지할 수 있다.
적합한 데이터 방출 정책 정하기
- 캐시 메모리가 가득 찰 경우, 기존 데이터들을 방출해야 한다. 이떄, 적합한 캐시 데이터 방출 정책을 정해야한다.
- 가장 많이 쓰이는 것은 LRU 이다. 그 외, LFU, FIFO 등도 고려해 볼 수 있다.