programming study/웹개발

캐시

gu9gu 2023. 5. 2. 15:40

- 캐시를 사용하는 이유
- 어떤 캐시 기술을 사용하는 것이 적합한지
- EhCache의 설정 옵션들

공부 예정 : 캐시 전략, 분산 캐시

 

 

- 캐시가 뭔지, 캐시를 사용하는 이유

캐시란 자주 사용되는 데이터를 일시적으로 저장할 수 있는 임시 저장공간입니다.

디스크 즉 DB에서 데이터를 얻어오는 것보다 훨씬 빠른 I/O성능을 얻을 수 있기 때문에 사용합니다. 데이터를 빠르게 읽어옴으로써 서버 부하를 줄이고 요청 속도를 높일 수 있습니다.

 

- 어떤 캐시 기술을 사용하는 것이 적합한지

 어떤 캐시 기술을 사용할지는 어플리케이션의 요구사항과 사용 목적에 따라서 선택해야합니다.

캐시 기술을 선택할 때는 캐싱속도, 캐시를 사용하려는 서버 구조, 캐시 데이터의 크기, 데이터의 유지성, 별도 비용 등을 고려해야합니다. 캐시 기술은 크게 분류하면 로컬 캐시와 글로벌 캐시가 있습니다.

 

로컬 캐시는 로컬 서버 내부에서만 사용하는 캐시로 캐싱 속도가 빠르고 단일 서버 구조인 경우에 적합합니다. 또한 로컬 캐시는 비용이 별도로 발생하지 않고 용량이 제한적입니다. 그리고 서버를 재시작하는 경우 데이터가 유지되지 않기 떄문에 데이터의 유지기간이 짧아도 되는 데이터가 적합합니다.

그에 반해서 글로벌 캐시는 별도로 외부에 서버를 두는 캐시 기술로서 외부와 통신을 해야하기 때문에 로컬캐시에 비해 상대적으로 느립니다.  그리고 여러 서버를 두는 환경에서 사용하기 적합합니다.

 

- 왜 로컬 캐시가 단일 서버, 글로벌 캐시가 멀티 서버에 적합한지?

 : 서버가 여러 대인 경우에 각 서버에 존재하는 로컬캐시를 사용하는 경우 캐시에 넣은 데이터들의 동기화가 필요합니다. 그래서 서버가 여러 대인 경우에는 외부에 캐시 서버를 별도로 둠으로써 동기화를 따로 해주지 않도록 글로벌 캐시를 사용하는게 좋습니다.

 

- ehcache, redis, memcached

스프링부트 환경에서는 대표적으로 로컬캐시인 ehcache와 글로벌 캐시인 redis와 memcached를 많이 사용합니다.

  • ehcache
    • spring에서 간단하게 사용할 수 있는 자바 기반 오픈 소스 캐시 라이브러리입니다.
  • redis
    • key-value의 value에 다양한 자료형으로 저장할 수 있습니다.
      • string : 기본 자료형
      • set :  순서는 없고 중복 데이터가 없는 유일한 자료구조
      • list :  순서가 있는 자료구조
      • hash : key-value의 value에서 한번 더 key-value가 있는 자료구조
    • 트랜잭션 기능, publish/subscribe 기능을 지원하고 싱글쓰레드로 동작합니다.
      • 트랜잭션은 데이터베이스 상태를 변경시키는 작업 단위를 의미하고, 원자성, 일관성, 독립성, 지속성의 특징을 가지고 있습니다.
      • publish/subscribe 구독/발행 기능을 사용해서 메세지 브로커 역할을 함으로써 채팅기능을 구현할 수 있습니다.
      • 싱글 쓰레드로 동작하게 되면 하나의 명령어가 오래 걸리게 되면 병목 현상이 발생할 수 있습니다.
  • memcached
    • string 형태로만 저장할 수 있고 멀티쓰레드로 동작합니다.

 

 

- EhCache의 설정 옵션들

EhCache는 메모리에 생성할 최대 객체 수, 캐시 수명,  캐시가 얼마 동안 조회되지 않으면 삭제되는지, 최대 객체 수에 도달했을 떄 어떻게 삭제할지 설정할 수 있습니다.

삭제 정책은 LRU, LFU, FIFO가 있습니다.

Least Recently Used : 가장 오랫동안 사용되지 않은 데이터

Least Frequently Used : 가장 적게 사용된 데이터

First In First Out : 가장 먼저 들어온 데이터

 

참고)

maxEntriesLocalHeap: 메모리 기반 캐시에서 사용할 최대 항목 수
timeToLiveSeconds: 캐시 항목의 수명을 초 단위
timeToIdleSeconds: 캐시 항목이 사용되지 않은 시간을 초 단위
diskSpoolBufferSizeMB: 디스크 기반 캐시에서 사용할 버퍼 크기를 메가바이트 단위
maxEntriesLocalDisk: 디스크 기반 캐시에서 사용할 최대 항목 수
diskExpiryThreadIntervalSeconds: 디스크 기반 캐시에서 만료된 항목을 제거하는 간격을 초 단위
terracotta.clustered: 분산 캐시를 사용할지 여부
terracotta.clustered.cacheName: 분산 캐시에서 사용할 캐시 이름

 

 

 

분산 캐시

 

[기본 용어]

  • 분산 시스템 : 로드벨런서( 네트워크 스위치인 L4 또는 L7을 주로 사용한다)를 통해 한가지 역할을 하는 여러대의 서버로 요청을 분산시켜서 처리하는 시스템
  • 클러스터링(Clustering) 시스템 : 한가지 역할을 하는 시스템을 병렬 구조로 둬서 하나의 시스템처럼 동작하게 하는 시스템
  • 이중화 : 같은 역할을 하는 시스템을 이중 또는 그 이상으로 두는 것

EhCache를 사용할 때 이중화 구조에서 어떻게 사용하는지?

-> EhCache는 각 서버에서 동작하는 캐시이기 때문에 각  케시의 데이터를 공유하기 위해 분산캐시를 사용해야 한다.

 

EhCache로 분산 캐시를 하는 방법은 어떤게 있는가?

-> 대표적인 방법으로  분산 서버 역할을 하는Terracotta 라는 분산 캐시 서버를 설정해서 사용합니다.

Spring boot :: Caffeine cache 정리 (tistory.com)

아키텍처 설계: 분산캐시-EhCache+Terracotta Server Array (nextree.co.kr)

 

 

1. Hub and Spoke 분산 캐시 아키텍처

분산 캐시를 위해 중앙에 캐시 노드를 제어하는 분산 캐시 서버를 두고 각 캐시 노드들은 내용의 변경을 알리기 위해 중앙 캐시 서버에 요청하고 중앙 캐시 서버가 각 캐시 노드에 변경 내용을 전달하는 방식

 

2. Replication설정 또는 Invalidation설정으로 한 분산 캐시 아키텍처

캐시에 데이터가 추가, 수정, 삭제되면 해당 데이터에 대한 캐시 엔트리를 갱신합니다. 분산 캐시 환경에서는 해당 엔트리를 다른 노드에도 동기화해야 합니다. 

Replication은 업데이트된 캐시 엔트리를 다른 노드에 직접 복제합니다. 이 방법은 간단하고 빠르지만, 대규모 캐시에서는 복제 작업이 너무 많아질 수 있어서 성능 이슈가 발생할 수 있습니다.

두 번째 방법은 Invalidation입니다. Invalidation은 업데이트된 캐시 엔트리의 키를 다른 노드에 전달하여 해당 엔트리를 무효화시킵니다. 이 방법은 Replication에 비해 데이터 전송량이 적어서 대규모 캐시에서도 잘 동작합니다. 단점은 캐시에 무효화된 엔트리가 존재할 수 있다는 것입니다. 이 경우 캐시 미스가 발생하면 실제 데이터 스토어에서 데이터를 다시 가져와야 합니다.

 

Replication 방식 설정 예시

<cache name="myCache"

...

<cacheEventListenerFactory>

class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"

properties="replicateAsynchronously=true,

replicatePuts=true,

replicateUpdates=true,

replicateUpdatesViaCopy=false,

replicateRemovals=true" />

...

</cache>

 

 

==> 그런데, 대규모 멀티 서버 환경에서는 분산 캐시로 캐시 데이터를 동기화 하는 과정으로 인해 성능 저하가 발생할 수 있어서 글로벌 케시(ex)redis, memcached) 를 사용해서 성능 저하를 줄여야 합니다.

 

 

 

 

일반적인 캐시 전략

1. 읽기 캐시 전략

캐시를 읽을 떄 어떤 전략을 사용할지 결정

기본적으로는 캐시를 먼저 조회한 후 없으면 DB에서 조회 하여 캐시에 데이터를 갱신시키면서 읽는 방법을 사용

 

 1-1) Cache Aside

  

 

2. 쓰기 캐시 전략

 

 

 

참고

캐시의 모든 것 내용 정리 (velog.io)

SpringBoot기반 Redis Cache 활용법 - 대디장의 기억저장소 (tistory.com)

[Cache] 캐시란?, 로컬캐싱 vs 글로벌 캐싱, 캐시전략들 (tistory.com)

로컬 캐싱에서 글로벌 캐싱으로 변경한 이유 (tistory.com)

Redis 레디스 특징, 장단점, Memcached와 redis 비교 (tistory.com)

[JAVA] EHCache를 이용한 캐시 사용 (tistory.com)

로드 밸런싱과 클러스터링 (goodgid.github.io)

아키텍처 설계: 분산캐시-EhCache+Terracotta Server Array (nextree.co.kr)

Cache 전략 :: 뱀귤 블로그 (tistory.com)

캐시(Cache) 적용 패턴 및 관리 전략 (luran.me)

 

 

 

'programming study > 웹개발' 카테고리의 다른 글

JWT  (0) 2023.01.13