ARCUS(아커스)는 네이버(NAVER) 서비스들의 요구 사항을
반영하여 개발한 메모리 캐시 클러스터입니다. 오픈소스 프로젝트인 Memcached
기반으로 키-밸류 데이터 모델을 확장하고 ZooKeeper를
이용하여 운영 도중에 캐시 노드를 추가 또는 제거할 수 있는 수평 확장(horizontal scale-out) 기능을 장착한 "유연한 캐시 클러스터(elastic cache cluster)"
시스템이며, 2014년 5월부터 오픈소스로 공개하였습니다.
ARCUS(아커스)는 응용 웹/모바일 서비스에서 조회 성격의 API 수행 결과를 빠른 메모리에 캐싱해 두고 반복된 조회에서
이용함으로써 서비스 처리 성능을 극대화하고 사용자들이 쾌적한 웹/모바일 서비스를 경험할 수 있도록 도와주는 캐시 솔루션입니다.
ARCUS는 응용에게 remote caching 서비스를 제공하는 memory cache cluster입니다. ARCUS는 일반적으로 back-end storage인 DB의 앞 단에서 hot-spot 성격의 데이터를 캐싱하여 반복된 조회에서 사용함으로써, 여러 응용들에게 빠른 응답성을 제공하면서 DB로의 load를 경감시켜 줍니다. 그 외에 복잡한 계산에 의한 결과물 또는 웹 처리상의 중간 데이터 등을 신속히 저장 및 조회할 수도 있으며, caching 데이터를 여러 프로세스들 간에 공유하여 사용할 수 있습니다.
ARCUS 캐시 클러스터는 자신의 캐시 노드 목록을 고가용 저장소인 ZooKeeper에 보관하면서 클러스터의 수평 확장 또는 축소로 인해 변경되는 캐시 노드 목록을 실시간으로 응용에 장착된 ARCUS 클라이언트 드라이버에 전달하며, ARCUS 클라이언트 드라이버는 변경된 캐시 노드 목록에 따라 캐시 데이터를 자동으로 재배치합니다. ARCUS 캐시 클러스터의 확장 및 축소에 의한 처리는 모두 ARCUS 클라이언트 드라이버 내부에서 수행되므로, 응용은 어떠한 중단 없이 ARCUS 캐시 클러스터를 안정적으로 사용할 수 있습니다.
ARCUS 캐시 클러스터를 구성하는 개별 캐시 노드는 Memcached 오픈소스를 기반으로 응용 요구를 수용하여 다양한 collection 데이터 타입을 지원하고, 캐시 용도에 적합한 memory allocator를 제공하며, 클러스터 구성을 위한 ZooKeeper 모듈을 가지도록 개발한 제품으로 캐시 서버 역할을 수행합니다. ARCUS 데이터 모델은 하나의 데이터만을 가지는 simple key-value 데이터 타입 외에도 다수의 데이터를 구조화된 형태로 저장하고 일부 또는 전체 데이터를 조회할 수 있는 collection 데이터 타입을 제공합니다. Collection 타입으로List, Set, Map 타입을 기본으로 제공하며, 데이터들의 정렬과 범위 검색 기능 그리고 필터링을 통한 선택적 검색이 가능한 B+Tree collection 타입을 제공하여 응용의 다양한 요구들을 충족시켜 줍니다.
ARCUS 캐시는 인-메모리 캐시로 제한된 크기의 메모리 공간을 효율적으로 사용할 수 있어야 합니다. Collection 데이터 타입을 제공함에 따라 메모리 공간 요청이 예전보다 다양해 진 상황에서 메모리 파편화(memory fragmentation)를 최소화하여 메모리 사용 효율을 높이는 memory allocator를 자체 개발하여 사용하고 있습니다. 이를 통해, 응용의 다양한 메모리 사용 패턴에서도 안정적인 메모리 사용이 가능합니다.
단순 key-value 데이터 타입과 비교하여 collection 데이터 타입의 특징과 자료 구조는 아래와 같습니다.
ARCUS(아커스) 캐시 클러스터는 distributed key-value store 구조로 응용의 안정적인 서비스를 위한 다양한 특성들을 제공합니다.
Caching 대상 데이터 규모 또는 caching 데이터에 대한 요청량 규모에 따라 cache node 추가/삭제 또는 cache memory 증대/감소를 통해 운영 도중에 서비스 중단 없이 cache cluster 규모를 늘리거나 줄일 수 있습니다.
일부 cache node가 다운되거나 접근되지 않는 문제 등이 발생하면, 자동으로 failed cache node를 찾아 cache cluster에서 제거하고 나머지 cache node들로 cluster를 형성하여 동작합니다.
캐시 데이터의 이중화 기능으로 마스터 노드에 저장된 캐시 데이터를 슬레이브 노드에 상시 복제합니다. 운영 중에 마스터 노드의 장애나 업데이트로 인해 중지될 경우, 슬레이브 노드가 마스터 노드의 역할을 대신하여 서비스를 유지할 수 있습니다.
캐시 클러스터를 확장하거나 축소할 시에 consistent hashing에 의해 캐시 데이터의 담당 캐시 노드가 변경되며, 기존의 담당 캐시 노드에서 변경된 담당 캐시 노드로 캐시 데이터를 이관함으로써 캐시 데이터의 가용성을 보장합니다. (릴리즈 예정)
앞서 기술한 Fault-tolerance, replication, migration 기능으로 ARCUS 캐시 클러스터는 캐시 데이터의 고가용성을 제공합니다.
Hubble(허블)은 ARCUS Enterprise모니터링 도구로, 클러스터에 속한 캐시 노드의 통계 정보와 캐시 장비의 리소스 사용 데이터를 수집하고, 이를 대시보드에 시각화합니다.
캐시 데이터의 영구 저장을 위하여, 캐시 데이터의 스냅샷(snapshot)과 명령 로깅(command logging) 방식을 구현하여 캐시 데이터를 영구 저장 장치에 보관하고, 캐시 노드가 종료되더라도 향후 재구동 시에 캐시 데이터를 그대로 복구하는 기능을 제공합니다. Persistence 기능 제공에 따른 수행 오버헤드를 최소화하도록 개발함으로써 ARCUS 기존 성능을 최대한 보장합니다.
Kubernetes 환경에서 ARCUS 캐시 클러스터의 배포 및 운영을 자동화하는 ARCUS Operator를 제공합니다. 네이버의 쿠버네티스 환경에서 현재 ARCUS 캐시 클러스터를 운영하고 있습니다.
Java 기반의 응용인 경우, 기본 캐싱 방식인 demand-fill 방식을 응용 코드 수정 없이 적용할 수 있게 합니다. 캐시 대상 응용 API에 대해 Annotation 설정 방식과 Property 파일로 캐시 대상 정보를 명시하여 적용하는 방식이 있습니다. 특히, Property 적용 방식인 경우는 응용 재배포 없이 캐시 대상 API를 변경할 수 있는 기능을 제공합니다.