# 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
Posted by 감각적신사
,

# opscenter - cassandra monitor tool


1. opscenter 소개

- DataStax 에서 제공하는 cassandra monitoring , data explorer

- JMX 를 이용하여 모니터링과 node management 를 한다

2. opscenter 설치

- cassandra 가 설치 되어있어야 한다

- 다운로드 http://www.datastax.com/what-we-offer/products-services/datastax-opscenter

- python ./bin/setup.py

- 실행 : ./bin/opscenter

- 실행 확인 : http://localhost:8888

3. opscenter 사용

- 기존 multi cluster 를 모니터링 한다

- cluster 추가시 해당 node 에 agent 를 설치해야되기 때문에 sudo user 의 id/pw 를 입력한다

   - NODES 메뉴에서 추가된 ring 을 확인할 수 있음         

                

            


'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (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
Posted by 감각적신사
,

# cassandra 간단설치


1. cassandra 소개

    - 오픈소스 분산 데이터베이스 관리 시스템

    - 아마존 다이나모 분산 디자인 과 구글 빅데이블 의 데이터 모델을 기반으로 페이스북에서 활용


2. cassandra 다운로드

    - http://cassandra.apache.org

    - cassandra 2.0 이후 부터는 java 1.7 에서 동작한다


3. 압축 풀기 및 기본 설정

    - ./bin : 실행 파일 cassandra , cassandra-cli 가 존재한다

    - ./conf : cassandra.yaml --> TODO 정리 필요

        - 기본적으로 /var/lib , /var/log 를 path 로 사용

        - sudo chown -R 소유자.소유자그룹 /var/lib/cassandr /var/log/cassandra


4. 실행

    - ./bin/cassandra


# cassandra multi cluster 구성하기


1. vm 구성

- 3개의 노드 준비 (lvm001, lvm002, lvm003)

- /etc/hosts 에 각 노드 등록 : (ip hostname)

- vm 간 방화벽 확인 (port 9160)

- cassandra.yaml

- rpc_port: 9160

- 각자 동작 중인 cassandra 중지 및 데이터 삭제 , commit log 삭제 (/var/lib/cassandra ...)

- cassandra.yaml : 

- data_file_directories: /usr/local/var/lib/cassandra/data

- commitlog_directory: /usr/local/var/lib/cassandra/commitlog


2. 단일 데이터센터 내 멀티 클러스터로 구성하기

- cassandra.yaml 파일 수정

- cluster_name: 'MyDemoCluster'

- num_tokens: 256

- seed_provider:

 - class_name: org.apache.cassandra.locator.SimpleSeedProvider

    - parameters:

          - seeds:  "lvm001"

- listen_address: lvm001 (* 본인 vm 의 값을 넣어준다)

- rpc_address: 0.0.0.0

- endpoint_snitch: RackInferringSnitch

- auto_bootstrap: false : 없는 옵션이므로 추가한다


3. 클러스터 구성 확인하기

- 실행 : ./bin/cassandra &

- 구성확인 : ./bin/nodetool status


4. cassandra.yaml

- path : ./conf/cassandra/yaml *or* /etc/cassandra/conf/cassandra.yaml

- 수정 point

- listen_address : 노드 간 통신하기 위한 address

- default 값은 localhost

- 0.0.0.0 은 노드간 통신 불가

- 멀티노드 구성시 변경이 필요하다

- rpc_address : client 가 접근할 수 있도록 listen address 지정

- default 값은 localhost

- 0.0.0.0 : 전 ip 에 대해 접근 가능하도록 변경

    - rpc_port : client 가 접근할 수 있도록 listen port 지정  

    - seed_provider : 노드가 추가될 때 contact point

    - default 값은 127.0.0.1

    - 멀티노드 구성시 변경이 필요하다

'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
opscenter - cassandra monitor tool  (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
Posted by 감각적신사
,

# cql 3.0


1. 사용하기 위한 작업

- python 모듈 설치

- sudo easy_install cql

- 실행

- ~/bin/cqlsh host_name host_portnumber

- python ~/bin/cqlsh host_name host_portnumber  

2. cql 사용

- create :  

     CREATE KEYSPACE cql_ks  

      WITH REPLICATION =

  { 'class' : 'SimpleStrategy', 'replication_factor' : 3 };  

 - CREATE TABLE hector_cf_cql (  

  rowkey text PRIMARY KEY,  

  col1 text,  

  col2 text,  

  col3 text,  

  col4 text,  

  col5 set<text>,  

  col6 map<text, text>  

 );  

- insert : 

        INSERT INTO hector_cf_cql  (rowkey, col1, col2, col3) VALUES ('arowkey001', 'val1', 'val2', 'val3');

  INSERT INTO hector_cf_cql  (rowkey, col1, col2, col3, col5)  VALUES ('browkey001', 'val1', 'val2', 'val3', {'string1','string2'});

        INSERT INTO hector_cf_cql  (rowkey, col6) VALUES ('crowkey001',{'map_key1':'map_value1'});

- update   

  UPDATE hector_cf_cql  SET col5 = col5 + {'added_string'} WHERE rowkey = 'browkey001';

  UPDATE hector_cf_cql  SET col5 = {'remove_and_added_string'} WHERE rowkey = 'browkey001';

- delete 

  DELETE col2 FROM hector_cf_cql WHERE rowkey = 'arowkey001';

  DELETE FROM hector_cf_cql WHERE rowkey = 'arowkey001';

    - select  

  select * from hector_cf_cql;

  select col1 from hector_cf_cql;  

        

3. 도입시 주의사항?

- version 별로 지원이 안되거나 기능이 변경되는 부분이 있어 확인이 반드시 필요하다

- 스키마 필요

- 다른 방식(cli 방식)으로 기 생성된 스키마에 대해서는 일부 기능 지원이 제한된다

- select * (o)

- select 특정_column_name_명 (x)

- column 을 추가하기 위해서는 스키마 변경이 선 작업 되어야 한다

'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
opscenter - cassandra monitor tool  (0) 2016.08.02
cassandra 간단 설치 및 multi cluster 구성하기  (0) 2016.08.02
cassandra-cli  (0) 2016.08.01
cassandra date model  (0) 2016.08.01
Posted by 감각적신사
,

cassandra-cli

Nosql/cassandra 2016. 8. 1. 12:55

# cassandra-cli


1. 실행

- ~/bin/cassandra-cli -h host_name -p host_portnumber

2. cli 사용

- create :

- CREATE KEYSPACE hector_ks  

           with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'  

           and strategy_options = {replication_factor:3};

- CREATE COLUMN FAMILY hector_cf  

             WITH comparator = UTF8Type  

             AND key_validation_class=UTF8Type  

             AND column_metadata = [  

             {column_name: col1, validation_class: UTF8Type, index_type: KEYS}  

             {column_name: col2, validation_class: UTF8Type}  

             {column_name: col3, validation_class: UTF8Type}  

             {column_name: col4, validation_class: UTF8Type}  

             {column_name: col5, validation_class: UTF8Type}  

            ];

- insert :

-  SET hector_cf['rowkey1']['col1']='val1';

-  SET hector_cf['rowkey1'][utf8('extra_col')]=utf8('extra_val');

-  **column_metadata 에 추가하지 않은 값도 insert 가능하다 , 단 타입을 명시해야 한다**

- SET hector_cf['rowkey1'][col3] = 'SAVE20' WITH ttl=864000;

- ttl 단위는 초 이다

- update

- UPDATE COLUMN FAMILY hector_cf WITH comparator = UTF8Type AND column_metadata = [{column_name: col1, index_type: KEYS }];

- set hector_cf['rowkey1']['col1']='val00';

- insert == update 

- delete

- DEL hector_cf ['rowkey1']['col2'];

- DEL hector_cf ['rowkey1'];

- get :

- GET hector_cf[rowkey1][col1];

- GET hector_cf[rowkey1];

- GET hector_cf WHERE col1 = 'val1';

- key 로 선언한 컬럼에 대해 indexing 기능을 지원한다

'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
opscenter - cassandra monitor tool  (0) 2016.08.02
cassandra 간단 설치 및 multi cluster 구성하기  (0) 2016.08.02
cassandra cql 3.0  (0) 2016.08.01
cassandra date model  (0) 2016.08.01
Posted by 감각적신사
,

1. 데이터 모델

    

    - keyspace : 

- 논리적으로 ColumnFamily를 묶어주는 개념

- 단지 묶어만 줄뿐 데이타 구조나 관계에서는 별다른 영향을 주지 않으나 복제 수를 지정할 수 있다

    - Column Family

- 컬럼들의 집합

- 하나의 row key 에 다수의 column 을 가질 수 있다

- row key 는 기본적으로 timestamp column 을 갖는다

    - Column

    - name : value 로 맵핑된다  



'Nosql > cassandra' 카테고리의 다른 글

cassandra java client 소개 및 비교  (0) 2016.08.02
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
Posted by 감각적신사
,