# hector - cassandra java client
1. pool architecture
- cassandraHostRetryService : 다운된 node 에 대한 재시도
- retryDownedHosts: 서비스 사용유무 . 기본값 true
- retryDownedHostsQueueSize: 모니터링 할 node 수 . 기본값 -1 (전체)
- retryDownedHostsDelayInSeconds: 사용주기 . 기본값 10 sec
- nodeAutoDiscoverService : 새로운 node 에 대한 ring 에 추가할 것인가
- autoDiscoverHosts: 서비스 사용유무 . 기본값 false
- autoDiscoveryDelayInSeconds: 사용주기 . 기본값 30 sec
- autoDiscoveryDataCenters: 특정 datacenter 에 한한 서비스 사용 . 기본값 전체
2. 데이터 일관성 (read , write 따로 적용 가능)
- ANY: 복제본에 대한 응답이 존재할 때 까지 대기
- ONE: 복제본 1개에 대한 응답이 존재할 때 까지 대기
- TWO: 복제본 2개에 대한 응답이 존재할 때 까지 대기
- THREE: 복제본 3개에 대한 응답이 존재할 때 까지 대기
- QUORUM: (replicationi_factor / 2 ) + 1 개 만큼의 복제본이 응답할 때 까지 대기
- LOCAL_QUORUM: 동일 데이터 센터에서 quorum 만큼의 응답 대기
- EACH_QUORUM: 각각의 데이터 센터에서 quorum 만큼의 응답 대기
- ALL: 모든 replicationi_factor 만큼의 복제본 응답 대기
3. feature
- connection pooling
- 클라이언트 단에서의 장애조치 기능
- JMX(Java Management Extension) 기반의 모니터링
- load balancing 에 대한 설정 기능
- thrift 통신에 대한 캡슐화 , 숨김
- 다운된 node 에 대한 자동 재시도
- 추가된 node 에 대한 자동 검색
- 쉽게 사용할 수 있는 ORM(Object-Relational Mappging)
- cassandra’s data model 에 맞는 type-safe approach
4. hector object mapper
- 카산드라 데이터 저장 단위에 mapping 되도록 지원하는 모듈
- 설정 및 사용
@Entity
@Table(name="TestColumnFamily")
public class MyPojo {
@Id // rowkey
private UUID id;
@Column(name="col1")
private long longProp1;
@me.prettyprint.hom.annotations.Column(name = "color", converter = ColorConverter.class)
private Colors color;
private Map<String, String> anonymousProps = new HashMap<String, String>();
@AnonymousPropertyAddHandler
public void addAnonymousProp(String name, String value) {
anonymousProps.put(name, value);
}
}
Keyspace keyspace = HFactory.createKeyspace("TestKeyspace", cluster);
entityMgr = new EntityManagerImpl(keyspace, "패키지명");
MyPojo pojo = new MyPojo();
pojo.setId(asdd-asdasd-asdsad-asdasd);
pojo.setLongProp1(0L);
pojo.setColor("black");
// 저장
entityMgr.persist(desk);
// 읽어오기
MyPojo loadPojo = entityMgr.load(MyPojo.class, "asdd-asdasd-asdsad-asdasd");
# astyanax - cassandra java client
1. hector lib 를 리팩토링한 lib
2. 3 main part
- connection pool : 다양한 방법으로 load balancing 구현
- cassandra-thrift API implementation
- recipes and utilities : csv import 가능
3. util
- CSV importer
- JSON exporter
4. feature
- context 설정을 통해 장애조치
- 특정 node 에 요청 보내도록 하는 기능
- 토큰 범위를 통한 Host partitions
- latency tracking 기능
- load balancing 선택 가능
- 다운된 node 에 대한 요청 보내지 않음
- JMX 를 통한 모니터링 (단, 커낵션 pool 내부에 대한 로깅 X)
- 다운된 node 자동 재시도
- 추가된 node 자동 검색
- Minimal use of synchronized by using non-blocking data structures
# java driver - cassandra java client
1. datastax 에서 cql 언어를 java 단에서 사용하기 위해 제공
2. 적합성
3. feature
- Asynchronous
- Nodes discovery
- Configurable load balancing
- Transparent failover
- Convenient schema access
4. cql문과 cassandra-cli 를 통해 생성된 스키마 간의 호환
- 일부 호환 (select * : o) (insert : x)
- 생성된 스키마에 대한 다른 방법으로 변경 불가
# lib 비교
# lib 비교 분석을 통한 cassandra 사용에 대한 사견
1. cql 사용시 최소한의 리소스로 원하는 데이터를 얻을 수 있다.
- 상황 : sns 를 사용하는 user 를 출력하고 싶다
- cql : select * from UserCF where use_sns='Y';
- cassandra-cli :
1) get[UserCF];
2) use_sns='Y' 에 대해 추가 작업 필요
2. 단, cql 로 생성하지 않는 스키마에서는 cql 의 모든 기능을 사용하기엔 제한된다.
- cassandra-cli 로 생성한 Column Family 에서는 select column명 from CF; (동작하지 않았다)
- cassandra-cli 로 생성한 Column Family 의 스키마 변경이 되지 않았다
3. 그러나~ cql 스키마로 생성하기에는 데이터 모델링에 대한 소요 가 많다.
- DB 에 대한 깊이가 얕은 나로서는 사용하기 적합하지 않다
- append 가 자유롭고 구조가 유연하다는 장점이 발휘되지 않는다는 느낌이 조금 있다
- column key 가 알지 못하는 값으로 들어올 경우 cql 로는 얻기 어렵다? -> select * 을 통해서만 값을 가져올 수 있다
4. 그렇다면!!! hector, astyanax 등으로도 유연하면서 리소스를 잘 다룰수 있는 스키마 생성이 필요하다
- column 에는 많은 정보를 담지 않는다 -> json, map 타입의 데이터는 안 좋지 않을까, 대신 컬럼을 많이 늘리자
- CF 에 대한 rowkey 관리가 필요하다 -> rowkey 는 select * 을 통해 얻거나 client 가 직접 알고 있어야만 하는 정보이다
'Nosql > cassandra' 카테고리의 다른 글
opscenter - cassandra monitor tool (0) | 2016.08.02 |
---|---|
cassandra 간단 설치 및 multi cluster 구성하기 (0) | 2016.08.02 |
cassandra cql 3.0 (0) | 2016.08.01 |
cassandra-cli (0) | 2016.08.01 |
cassandra date model (0) | 2016.08.01 |