티스토리 뷰

728x90
반응형

서론

애플리케이션의 성능을 높일 수 있는 다양한 방법이 있다. 때로는 어려운 과정을 거쳐 1%의 성능을 향상 시킬 수 있지만, 때로는 손쉬운 과정을 거쳐 10%의 성능을 향상 시킬 수도 있다.

캐싱 기능을 적용하면 사용자 응답시간을 향상 시키고 서버의 부하를 경감하기 위하여 다양한 영역과 위치에서 여러가지 캐싱 기술들을 적용할 수 있으며 이는 성능을 높이는 꽤 간단한 방법 중 하나이다.

일반적으로 캐싱 기능은 클라이언트와 가까울 수록 그 효과가 증대되지만, 변경에 따른 빠른 반영 등의 문제가 발생할 수 있다.

[브라우저 캐싱(Cache-Control) - CDN(Static Page) - WEB(Sticky) - WAS(Session, Response, ResultSet) - Database]
지금부터 살펴볼 내용은 이러한 캐싱 기술을 완성하게 하는 요소 기술들에 대해 알아보고자 한다

본론

1. CDN

여러 곳의 IDC 또는 ISP에 동일한 컨텐츠를 저장해 놓고, 사용자 위치에 따라 가장 가까운 곳에서 컨텐츠를 제공받을 수 있도록 한다.
이는 대표적인 웹 서비스를 담당하는 웹 서버의 앞에 위치하여 정적컨텐츠 때로는 동적 컨텐츠까지도 캐싱하여 사용자로 하여금 빠른 응답시간과 트래픽 분산에 따른 서버 부하 경감 효과를 얻을 수 있다.

대체로 전 세계에 서비스하는 게임 사이트나 정적 콘텐츠가 주를 이루며 자주 변경되지 않은 사이트에서 사용 된다.

  • CDN을 적용할 때는 CDN 적용 대상 컨텐츠와 직접 서비스 대상 컨텐츠 간에 도메인을 분리해야 한다. 도메인이 불리되어 있지 않을 경우 불필요하게 홉이 증가하여 네트워크 트래픽이 증가할 수 있다. CDN는 대부분 네트워크 트래픽을 기준으로 과금 체계를 계산하여 도메인이 분리되지 않을 경우 요금 폭탄을 맞을 수 있다.
  • Global B2C 시스템의 경우에는 CDN 적용 시 성능 향상 및 부하 절감에 효과적이다.

2. Redis

Redis는 Key-Value 형태의 데이터를 사용하는 오픈소스 In-Memory Cache이다.
메모리상에 직접 캐싱하거나 디스크에 캐싱할 수 있으며 디스크 캐시 사용 시 다소(?) 느린 캐싱 효과를 볼 수 있다.
대체로 대용량 API를 저장해야 하는경우 높은 효율을 볼 수 있다.

  • Disk를 사용할 수 있으며 대용량 캐시, 장시간 유지되어야 하는 세션 정보 등을 저장하는데 유용하다. 이로인해 서버 장애나 오류가 발생하더라도 데이터가 소실되지 않고 유지된다. (Redis Persistence - RDB, AOF)
  • Disk에 관리할 수 있어 데이터가 소실되지 않지만, 반대로 명시적인 삭제가 이루어지지 않으면, 데이터는 삭제되지 않고 영원히 유지된다. 이는 단순화 된 값을 조회하지만 여전히 데이터를 복잡하게 할 수 있으며, 메모리 또는 데이터의 누적이 발생할 수 있다. 이를 해결하기 위해 Expired를 설정하여 데이터를 저장할 기간을 지정하는 것이 좋다. 
  • 다양한 데이터 타입을 저장할 수 있어 사실상 모든 타입의 데이터를 Redis에 기록할 수 있다.
  • Redis에 데이터를 저장하고 조회하는 방법은 여러가지가 있다. CLI, Redis 프로토콜을 이용한 클라이언트 라이브러리, Webdis, mod_redis와 같은 3rd party 플러그인을 사용하는 방법 등이 있다.
  • Redis에 데이터를 입력하는 방법 역시 여러가지가 있다. 입력 시 데이터를 하나씩 순차적으로 입력하는 방법과 파이프라인을 사용해 한번에 입력하는 방법 그리고 스냅샷 파일에 직접 기록하는 방법이 있다.

Redis는 싱글 쓰레드로 동작하기 때문에 아주 큰 데이터를 하나의 List에 담지 않고 여러개의 Collection으로 나누어 담는것이 좋다. 아주 큰 Collection에 CUD가 발생되는동안 나머지 데이터들은 쓰레드를 대기하게 된다. 이는 성능저하의 요소가 되기도 한다.
또한 여러 개의 Redis 인스턴스를 설치하여 운영하는 것이 좋다. 메모리의 내용을 파일에 기록할 때 RDB 방식을 사용할 경우에는 Fork 과정에서 최악의 경우 2배의 메모리가 필요하며, 시스템의 메모리가 넉넉하지 않은 경우에는 Swap이 발생할 수 있다.

3. Memcached

Memcached는 Key-Value 쌍으로 이뤄진 간단한 데이터 타입을 저장하는 오픈소스 In-Memory Cache이다.

  • 쓰레드 병렬처리 방식으로 성능이 우수하나 기능성 측면에서는 Redis에 비해 약하다.
  • 모든 Key-Value 쌍을 메모리에 저장하므로 서버 장애나 오류가 발생했을 때 저장된 데이터가 모두 손실된다.
  • 캐시 항목은 LRU(Least Recently Used) 정책과 TTL(Time To Live)을 사용하여 유지 관리한다.
  • 문자열 타입만 저장할 수 있다.
  • Message Queue로도 활용 가능하다. (Pub/Sub 메시징 지원)

메모리에서 데이터를 읽어오기 때문에 응답속도가 빠르고, 여러대의 서버에 분산하여 데이터를 처리할 수 있어서 확장성이 높다. 또한 다양한 개발언어를 지원하며, 메모리 기반으로 처리하여 Redis보다 메모리를 효율적으로 사용할 수 있다.

이와 반면에 메모리에 데이터를 저장하여 제공하기 때문에 서버 장애 시 데이터가 손실될 수 있으며, key-value 구조이므로 like 검색이 불가능하며 검색도 지원하지 않는다. 또한 String 타입의 데이터만 저장할 수 있다.

결론

Caching 기술은 데이터 읽기 성능 개선을 위해 데이터베이스와 같은 영구 저장소로부터 데이터를 로드하여 메모리에 저장할 수 있는 아키텍처이다.

대표적인 In-Memory Cache로 앞서 살펴본 Redis와 Memcached가 있으며, In-Memory-Data Grid(IMDG)는 Infinispan, Coherence가 있다. In-Memory Cache는 Replication과 Data Sharing 등 기능을 활용하여 병렬 서비스가 가능하지만, IMDG는 기본 기능으로 여러 서버에 걸쳐 데이터를 중복 저장하고 분산 서비스가 가능하다.

캐시 솔루션은 때로는 득이 되지만, 때로는 불필요한 홉이 될 수도 있고 때로는 캐시로 인한 커다란 장애(캐시 서버의 장애, 캐시의 갱신 등)를 유발할 수도 있다. 캐시가 주는 장점을 활용하기 위해서는 충분한 검토가 이루어진 후 적용해야 할 것이다.

728x90
반응형