Cache 데이터 관리 기법 파악하기:

  • Expiration:
    • 캐시 데이터가 만료되서 캐시 데이터에서 비우도록 하는 방법이다. 대표적인 방법으로는 일정 시간이 지나면 만료되거나, 캐시가 일정 사이즈에 도달하면 만료되도록 하는 방법이 있다.
    • 간단하게 구현될 수 있지만 Latency 가 증가할 수 있다. (캐시에 데이터가 없을 때 Cache-aside 패턴을 통해 조회하므로 (1. Cache 조회, 2. Database 조회, 3. Cache 설정))
  • Refresh:
    • 캐시된 데이터가 만료되기 전에 갱신되어 최신 상태를 유지하는 기법임. 어떠한 시그널을 받으면 해당 데이터 또는 전체 데이터를 갱신하도록 하는 방법이다.
    • Expiration 기법과 같이 사용하는 것도 가능하다.

 

 

Cache 사용 패턴 파악하기:

  • Cache Aside Pattern:
    • 이 방법은 우리가 알고있는 대표적인 캐시 사용 패턴임. 캐시에 먼저 조회해보고, 없으면 데이터베이스에 조회하기
    • 여러가지 단점들이 있긴함:
      • 일관성 문제가 발생할 수 있다.
      • 캐시에 데이터가 없을 떄 최대 3번의 RTT 가 발생할 수 있다. (Cache 조회, Database 조회, Cache 설정)
      • Cache Stampede 현상도 발생할 수 있다.
  • Read-through + Write-through (or Write behind) Pattern:
    • 이 방밥은 캐시에 쓰기만 하면 캐시가 알아서 데이터베이스와 데이터를 동기화 해주는 패턴임. 그러니 어플리케이션은 Cache 만 바라보고 데이터를 쓰거나 가져오는 요청을 보내면 된다. Cache 에 쓰면 자동으로 DB 에 써지게 되니.
    • 캐시가 Single Point Of Failure (SPOF) 가 될 수 있으므로 고가용성을 지원하도록 해야한다.
    • Write 성능을 개선하기 위해서 배치 식으로 데이터를 전달하도록 하는 Write behind 패턴도 같이 적용할 수 있다.
      • 잠점:
        • Cache Stempede 현상도 해결할 수 있음. 같은 Object 에 대한 변경은 한번에 하나의 Request 만 가도록 하는 것. (Request coalescing 방법)
        • 캐시에 먼저 쓰니까 데이터 최신성도 보장됨.
    • 단점:
      • 대신에 DB 에 써지는 것까지 어플리케이션은 기다려야 함. 성능에 부정적인 영향을 줄 수도 있음.
      • 캐시 사이즈가 커야함. 캐시에 데이터 스토어의 데이터를 많은 부분 보관할 수 있어야 해서.
      • 아직 대중적인 솔루션은 없음.

 

 

Cache Stampede 문제 회피하기:

  • Cache Stampede 는 특정 키가 만료될 때 대규모 클라이언트에서 해당 키를 조회할 때 발생할 수 있는 문제이다. 먼저 Cache 를 조회해보는데, 캐시에 키가 없어서 곧바로 데이터베이스에 대규모로 조회하면서 데이터베이스의 안정성을 떨어뜨리는 문제이다.
  • 해결 방법은 다양하다:
      1. Recomputation 과정 (= 만료된 캐시 키를 데이터베이스에서 조회해서 다시 캐시에 채우는 연산) 에 Locking 을 이용하는 방법:
        • 캐시에서 데이터가 만료되었다는 걸 알면 Locking 을 걸어둬서, 다른 클라이언트들이 데이터베이스에 조회하지 않도록 하는 방법이다.
        • Lock 을 가진 데이터가 Recompuation 연산을 수행하고, Lock 을 가지지 못한 클라이언트는 일정 시간을 기다렸다가 다시 캐시에 조회하도록 하는 방법임.
        • Lock 을 가지지 못한 클라이언트는 꼭 기다릴 필요는 없음. 그냥 Not Found 로 리턴하거나, 오래된 버전의 데이터를 받아오는 방법이 있다면 이를 이용하는 Fallback 접근 방식을 취해도 된다.
      1. External Process 에서 Recomputation 과정을 수행하는 것:
        • Locking 매커니즘에 대한 구현을 하지 않아도 되므로, 보다 간단한 솔루션이다.
        • 외부 프로세스에서 캐시에 데이터를 채우도록 하는 매커니즘임.
        • 이 방법으로는 캐시 키가 만료되기 전에 먼저 수행하도록 하는 Proactively 방식과, 캐시 키가 없을 때 새롭게 채우도록 하는 Reactive 방식이 있음.
      1. Probabilistic early expiration
        • 캐시에서 데이터를 조회하는 클라이언트는 확률적으로 캐시 키가 만료되기전에 Recomputation 과정을 수행하도록 하는 기법이다.
        • 이 확률은 캐시 키가 만료에 가까울 때 증가한다.
        • 캐시에서는 만료시간 전에 갱신될 확률을 같이 저장한다.

 

 

Cache Penetration 문제 회피하기:

  • Cache Penetration 는 존재하지도 않는 키를 캐시에서 조회하고, 실패해서, 데이터베이스에도 추가적으로 조회하면서 데이터베이스 안정성을 떨어뜨리는 문제임.
  • 해결 방법은 다양하다:
      1. implement a placeholder for non-existing keys:
      • 존재하지 않는 데이터의 경우에도 캐시에 NULL 값으로 세팅해놓는 방법이다.
      • 이렇게 적용한다면 계속해서 추가적인 데이터베이스로의 부하는 일어나지 않을 것.
      • 다만 캐시 리소스를 많이 차지할 수도 있는 문제가 발생할 수 있음.
      1. Bloomfilter 를 사용하는 것.
      • Bloomfilter 를 데이터베이스 앞단에 별도의 컴포넌트로 사용한다면 존재하지 않는 데이터를 명확하게 구별할 수 있다.
      • 다만 Bloomfilter 특성상 존재하지 않는 데이터는 명확히 구별하지만 존재하는 데이터라고 판단한 경우에도 존재하지 않는 데이터가 있을수도 있음.

 

 

Cache Crash 와 Cache Avalanche 문제 회피하기:

  • Cache Crash 는 캐시 시스템이 장애가 나서 캐시를 이용할 수 없는 문제를 말한다. 이 경우에도 모든 부하는 데이터베이스로 가기 때문에 안정성이 떨어지는 문제가 발생할 수 있음.
  • Cache Avalanche 문제는 캐시 시스템이 재시작하거나, 캐시 데이터가 비어있는 상태에서 일어날 수 있는 문제를 말한다. 이 경우에도 Cache Stampede 현상처럼 모든 키가 miss 가 나서 부하가 데이터베이스로 가기 때문에 안정성이 떨어지는 문제가 발생할 수 있음.
  • 이런 문제에서 시스템의 안정성을 올리는 대표적인 솔루션은 다음과 같다.
    • Circuit Breaker: 과부하 상태일 때 트래픽을 더 받아서 서버가 무너지도록 하지 않고, 일시적으로 들어오는 요청을 차단해서 안정성을 회복하도록 하는 방법
    • Redundancy (Cache Cluster 포함): 여러개킈 캐시 인스턴스를 운영해서 하나의 인스턴스가 장애가 나도 문제가 없도록 하는 방법
    • Warmup: 캐시 서비스를 운영환경에 투입하기 전에 자주 사용하는 데이터를 로드시킨 후 서비스에 투입되는 방법.

+ Recent posts