본문 바로가기

Cassandra

Astyanax 조사#1

카산드라의 모니터링 툴을 만드는 중인데,
클라이언트도 조사할 필요가있어서 정리 차원에서 일단 발번역.  
이상한 부분이 많겠지만, 저의 영어실력이 미천하여..ㅠㅠ


원문은 아래에 있습니다.
http://techblog.netflix.com/2012/01/announcing-astyanax.html 

다음에는 카산드라 맛보기 코드를 올려야징.

Astyanax는 뭔가용?

- 넷플릭스에서 공개한 오픈소스 카산드라 클라이언트 
- 헥터의 코드를 리팩토링해서 만듦. 이름도 헥터의 아들이름인 아스타이낙스
- 헥터에서 많은 컨셉을 빌려왔다. 
- 컨넥션풀과 클라이언트 API구현은 다르다. 
- 중점적으로 다룬 관심사는 컨넥션풀과 카산드라 각각을 커스터마이즈하고 개별적으로 개선할수 있도록 둘의 API사이에 깔끔한 추상화를 제공하는 것이었다. 
- Astyanax는 키와 컬럼으로 된 간소한 쿼리뿐 아니라 우리가 직면했던, 좀 더 복잡한 쿼리를 제공하는 유려한 API를 제공한다.  
- 헥터보다 좋은 Astyanax의 운영상의 이점은 lower latency, latency variance의 감소 그리고 좀 더 나은 에러 핸들링이다. (latency가 낮다는 것은 반응시간이 작다. 라는 의미이고 latency vairiance의 감소라는 말은 반응시간의 변화량이 적다 라는 얘기임.)

Astyanax는 3개의 파트로 갈라져있다. 

connection pool The connection pool abstraction and several implementations including round robin, token aware and bag of connections.
컨넥션 풀 추상화와 몇가지 구현들 - 라운드로빈, 토큰 인지, 컨넥션들의 가방(?)
cassandra-thrift API implementation Cassandra Keyspace and Cluster level APIs implementing the thrift interface.
thrift 인터페이스를 구현한 카산드라 키스페이스와 클러스터 레벨의 API의 구현
recipes and utilities Utility classes built on top of the astyanax-cassandra-thrift API.
 astyanax-cassandra-thrift API의 최상위에 구축되어있는 유틸리티 클래스


Astyanax API

Astyanax는 호출을 간단하게 해주고, 잘 정의된 인터페이스의 세트들로 쿼리를 커스터마이즈할 수 있도록 유려한 API를 구현했다. 
가능한한 저 수준 RPC레이어는 닫음으로서 효율적으로 실행가능한 몇개의 레서피를 포함하고 있다. 
클라이언트는 시리얼라이저를 지정해주어야하는 필요성을 거의 대부분 제거하기위해 제네릭과 오버로딩을 마구 사용했다. 


API에 들어있는 몇개의 중요 기능들

  • 시리얼라이저를 지정하지 않기위해 Key, column 타입은 ColumnFamily로 정의되었다.
  • 멀티 Column family key 타입은 같은 키스페이스에 있다. 
  • 어노태이션 기반 컬럼명 구성
  • 오토매틱 페이징
  • 평행화된(Parallelized) 쿼리 - 토큰인식 Token aware -
  • 각각의 명령에 대해 consistency level이 설정가능
  • 각각의 명령에 대해 재시도 정책을 설정가능
  • 특정 노드에 대해 명령을 고정하기(Pin operations to specific node)
  • Futures를 사용한 단일 타임아웃에 대한 비동기 명령실행
  • 간단한 어노태이션 기반 오브젝트 매핑
  • 명령 실행 결과 리턴. host, latency, 시도횟수
  • 명령의 실패와 성공에 대한 커스텀 이벤트를 로깅하기 위한 Tracer 인터페이스
  • 최적화된 batch 뮤태이션
  • 호출시에 clock은 완전히 숨겨져 있으나 커스터마이즈 할수 있도록 hook을 제공
  • 심플 CQL 지원
  • composite column ranges를 간단히 구성할 수 있는 RangeBuilders
  • composite columng names를 간단히 만들수 있는 Composite builders 

레시피들

  • CSV 임포트
  • 광범위한 커스터마이즈로 쿼리의 결과를 JSON으로 export해주는 녀석 
  • 평행 역 인덱스 검색
  • 키 유니크 constraint(제약) 확인
컨넥션 풀

Astyanax 컨넥션풀은 클라이언트 API층의 완전한 추상화를 제공하기 위해 디자인 되었습니다.  
Astyanax의 오픈소스화를 준비할 때의 우리의 주된 목표는 다른 사람들이 컨넥션 풀의 컴포넌트들을 간단히 플러그인 식으로 커스터마이징 할 수 있도록, 컴포넌트들의 적절한 디커플링을 하는 것이었습니다.
예를 들면, 우리는 미들티어에 로드밸런서가 있습니다. 그것들은 클러스터에 있는 노드들을 계속해서 따라다니고 클라이언트에 시드 노드들의 소스를 만들게 됩니다. 

컨넥션 풀의 주기능 

HostSupplier/NodeAutoDiscovery Background task that frequently refreshes the client host list. There is also an implementation that consolidates a describe ring against the local region's list of hosts to prevent cross-regional client traffic.
백그라운드 태스크. 
클라이언트 호스트리스트를 자주 리프레쉬 시켜준다. 
그리고 로컬지역에 대한 링을 그려주어서 지역간의 클리아언트 크래픽을 막아주고 강화 시켜준다. 
TokenAware The token aware connection pool implementation keeps track of which hosts own which tokens and intelligently directs traffic to a specific range with fallback to round robin.
토큰 인식 컨넥션 풀 구현은 해당 호스트 자신의 토큰을 지속적으로 추적하고 라운드 로빈의 대비책으로 지능적으로 특정 래인지에 트래픽을 보낸다.  
RoundRobin This is a standard round robin implementation
그냥 라운드로빈 
Bag We found that for our shared cluster we needed to limit the number of client connections. This connection pool opens a limited number of connections to random hosts in a ring.
공유 클러스터에 대해 우리는 클라이언트 컨넥션에 제한이 필요하다는것을 알게되었습니다. 이 컨넥션은 풀은 하나의 링안에 있는 랜덤한 호스트에 대해 컨넥션의 제한 수를 오픈해 줍니다. 
ExecuteWithFailover This abstraction lets the connection pool implementation capture a fail-over context efficiently
이 추상화는 대체 컨텍스를 효율적으로 캡춰하게 한다. 
RetryPolicy Retry on top of the normal fail-over in ExecuteWithFailover. Fail-over addresses problems such as connections not available on a host, a host going down in the middle of an operation or timeouts. Retry implements backoff and retrying the entire operation with an entirely new context.
ExecuteWithFailover에서 발생한 일반적인 fail-over 재시도. Fail-over는  명령실행 중간에 죽었던가, 타임아웃이 걸린 호스트 의 사용하지 못하는 컨넥션에서 문제를 찾는다. 
재시도의 구현은 대응하지 않기와 새로운 컨텍스트에 오든 명령 실행하기이다. 
BadHostDetector Determine when a node has gone down, based on timeouts
타임아웃기준으로 노드가 죽었는지를 결정한다. 
LatencyScoreStrategy Algorithm to determine a node's score based on latency. Two modes, unordered (round robin) ordered (best score gets priority)
응답속도에 기반한 노드의 스코어를 결정하는 알고리즘
정렬안됨(라운드 로빈). 정렬됨(최고 점수를 얻으면 우선권을 줌)이라는 
두가지 모드가 있다. 
ConnectionPoolMonitor Monitors all events in the connection pool and can tie into proprietary monitoring mechanisms. We found that logging deep in the connection pool code tended to be very verbose so we funnel all events to a monitoring interface so that logging and alerting may be controlled externally.
컨넥션풀과 소유 모니터링 메카니즘으로 관련 지을수 있는 모든 이벤트들을 감시한다. 
우리는 컨넥션풀에 있는 코드는 매우 상세하게 로그를 남기도록 의도되었다는 것을 알아버렸다.
그래서 우리는 모니터링 인터페이스의 모든 이벤트에 외부에서 컨트롤되어서 로깅하거나 경고할 수 있도록 깔때기(funnel)를 대었다. 
Pluggable real-time configuration
플러그인 리얼타임 설정
The connection pool configuration is kept by a single object referenced throughout the code. For our internal implementation this configuration object is tied to volatile properties that may change at run time and are picked up by the connection pool immediately thereby allowing us to tweak client performance at runtime without having to restart.
컨넥션 풀 설정은 코드를 통해 하나의 오브젝트를 참고하는 것으로 유지됩니다. 그래서 우리의 내부적인 구현 이것 설정 객체는 변경가능한 프로퍼티들로 묵여있어요. 그 객체는 런타임에 변경될 수 있고, 컨넥션풀에서 즉시 가져 올수 있죠. 그렇게 함으로서 클라이언트의 성능을 런타임에 변경 할 수 있어요. 리스타트 없이요.
RateLimiter Limits the number of connections that can be opened within a given time window. We found this necessary for certain types of network outages that cause thundering herd of connection attempts overwhelming Cassandra.
주어진 윈도우 시간안에 열수있게되는 컨넥션 수의 제한. 
우리는 특정한 타입의 네트워크의 단절은 엄청난 수의 컨넥션의 시도가 카산드라를 압도하는 원인이 되므로 이것이 필요하다는 것을 알게됐다. 


'Cassandra' 카테고리의 다른 글

카산드라의 한계들  (0) 2012.02.20