-
Arcus 란?
- memcached와 ZooKeeper를 기반으로 네이버 서비스들의 요구 사항을 반영해 개발한 메모리 캐시 클라우드
- memcached 프로토콜을 지원하고 기본 성능 혜택은 그대로 유지
- 백엔드 저장소인 DB 앞단에 위치하여 hot-spot 성격의 데이터를 캐싱하여, 서비스 응용에 빠른 응답성을 제공하고 DB 부하를 감소시킴
- 복잡한 계산에 의한 결과물 or 웹 처리 상의 중간 데이터 등을 신속하게 저장 / 조회
- 캐시를 통한 여러 프로세스들 간에 데이터 공유
Front Cache
- 리모트 캐시 앞단에서 애플리케이션 장비의 로컬 메모리를 사용하여 데이터를 캐싱하는 방법
- ARCUS와 같이 리모트 서버에서 캐싱을 수행하면 캐싱된 데이터를 서로 공유할 수 있지만, 일시적인 많은 요청으로 인한 장비 리소스 부족, 과다한 트래픽 발생에 따라 데이터 응답 시간이 민감하게 영향을 받음
- 클러스터 확장, 장비 사양 업그레이드 등이 해결책이 될 수 있지만 운영 비용이 증가
- Front Cache를 통해 소프트웨어 단에서 적은 비용으로 해결 가능
- 로컬 메모리에 캐싱한다고 하여 로컬 캐시(Local Cache)라고도 부름
- 네트워크를 통해 외부 서버에 캐싱하는 것보다 훨씬 빠름
- Arcus의 Front Cache는 Ehcache를 이용
- Java EE 및 경량 컨테이너를위한 오픈 소스 Java 분산 캐시
- 특징
- 경량의 빠른 캐시 엔진
- 확장(scable) - 메모리 & 디스크 저장 지원, 멀티 CPU의 동시 접근에 튜닝
- 분산 지원 - 동기/비동기 복사, 피어(peer) 자동 발견
- 높은 품질 - Hibernate, Confluence, Spring 등에서 사용되고 있으며, Gaia 컴포넌트에서도 EHCache를 사용하여 캐시를 구현함
연결 관련 Exception
- NotExistsServiceCodeException
- Admin 주소 or service code를 잘못 설정한 경우
- 설정 파일을 확인
- TimeoutException
- 대부분 JVM GC 때문에 발생
- timeout이 연속적으로 발생하고 connection이 재설정 되는지 확인 (로그에 "exceeded continuous timeout threshold"이 남고, "Cancelled"가 여러 개 보인다.)
- timeout이 발생할 때의 GC 시간 확인
- Timeout값이 너무나 작게 설정되지 않았나 확인한다. 시간의 단위도 반드시 확인한다.
- 예상 원인
- Application 시작 이후, 충분한 Warm up 전 요청이 몰리는 경우
- 지정된 timeout 값이 GC 시간보다 작은 경우
- Arcus client 한 개로 요청을 처리하기 벅찬 경우
- 해결책
- Full GC 시간을 측정하고 GC 튜닝을 한다
- Timeout 값을 조정한다. (간헐적인 timeout은 무시)
- TimeoutException은 재시도가 가능 ~> 재시도 로직을 만듦
- Arcus client pool을 사용
- ExecutionException
- Arcus와의 연결이 끊기고 모든 대기 중인 요청이 cancle됨
- 예상 원인
- Arcus와의 연결에서 timeout exception이 n번 이상 발생 ~> 자바 클라이언트는 연결에 문제가 있다고 판단하고 재연결을 시도
- continuous timeout threshold의 default는 10회
- timeout이 연속적으로 발생하여 연결을 재설정 하는 과정에 일시적으로 발생
- Arcus 서버 or Arcus 서버 간 네트워크 문제
- 해결책
- timeout이 연속적으로 발생하는 원인을 파악하여 조치(권장)
- continuous timeout exception threshold값을 조절
- Can’t serialize null
- Arcus 값 저장 시, null을 저장할 수 없음
- null을 저장하지 않도록 한다. (Arcus에서 key miss가 발생하면 null이 반환된다.)
- 삭제는 null을 저장하지 않고 delete API를 사용한다
- IllegalArgumentException("Non-serializable object")
- 예상 원인
- Arcus java client가 기본값으로 사용하는 Transcoder는 SerializingTranscoder로 non-serializable객체를 serialize할 수 없음
- 해결책
- 저장하려는 객체에 Serializable 인터페이스를 구현
- non-serialize 객체를 encode/decode할 수 있는 customized transcoder를 만들어서 사용
- SERVER_ERROR Out of memory
- 예상 원인
- Arcus 서버 구동 시 지정한 sticky item 영역 고갈 or 영역을 지정하지 않음
- 해결책
- Sticky item 영역의 용량 산정을 다시 설정
- 값이 저장되지 않음
- 예상 원인
- 만료시간을 30일 이상으로 지정하면 Unix time으로 변환 시, 과거의 시간이 되어 즉시 만료됨
- 조회해보면 만료된 아이템으로 취급되어 null이 반환됨
- 만료 시간을 밀리 초로 지정한 경우
- 조회하는 key와 저장하는 key가 서로 다른 경우
- 해결책
- expire time값을 변경
- 로그를 통해 저장하는 key와 조회하는 key가 동일한지 확인
- Future객체의 getOperationStatus()로 결과 코드를 확인
REFERENCE