반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함

'Apache Cassandra Cassandra No SQL NoSQL NoSQL Database 카산드라 아파치 카산드라'에 해당되는 글 2

  1. 2015.12.22 아파치 카산드라 - CQL 실습 - Createing a table - Simple primary key
  2. 2015.12.20 아파치 카산드라 - CQL 실습 1 keyspace


Creating a table


CQL 에서는 SQL 과 마찬가지로 컬럼의 row들을 가지고 있는 테이블들에 데이터가 저장된다.

Note: 카산드라 내부에서 구현되는 row와 column (행과 열) 들은 SQL 과 똑같지 않다. 좀 더 자세한 내용은 A thrift to CQL3 upgrade guide or CQL3 for Cassandra experts 를 보세요.

테이블은 runtime 시 업데이트나 쿼리를 block 하지 않으면서 create, drop, alter 될 수 있다. 테이블을 생성할 때 primary key와 컬럼들을 테이블 property들과 함께 정의한다. 테이블 프로퍼티를 configure 하기 위해서는 optional로 WITH clause와 keyword argument들을 사용한다. "caching, compaction, and other operations" 테이블 프로퍼티들은 테이블 세팅처럼 테이블별로 특정된다.


Create schema using cqlsh

cqlsh 를 사용해서 테이블 스키마를 생성한다. Dynamic 하게 schema를 생성 하는것은 지원되지 않는다. 만약 여러 client들이 동시에 테이블을 generate 하기 위한 시도가 있을 경우 collision 이 생길 수도 있다. 만약 이렇게 collision이 일어날 경우 해결하는 방법은 schema collision fix instructions를 보면 나와있다.

Primary Key

primary key는 data storagy은 순서와 위치를 지정한다. 이 primary key는 테이블이 생성될 때 정의되고 alter 되지 않는다. 만약 primary key 의 변경이 필요하면 새로운 table schema를 생성하고 그 새로운 테이블에 데이터를 입력해야 한다. 카산드라는 어떤 node가 특정 테이블 row를 hold 할 것인가를 식별하는 partition row store, partition key, primary key 의 component 이다. 테이블 생성 이후에 그 테이블을 alter 하는 자세한 방법은 ALTER TABLE 을 보라.

프라이머리 키는 반드시 partition key를 가져야 한다. Composite partition key는 data set을 split 할 수 있다. 그래서 관련된 데이터가 각각의 partition들에 분산되서 저장된다. Compound primary key는 partition에 data를 order 한 clustering column을 포함한다.

테이블의 primary key를 정의하는 것은 카산드라에서는 아주 중요한 부분이다. 어떤 컬럼이 primary key 가 될 것인지 정의하기 이전에 데이터가 테이블에 어떻게 insert되고 retrive 될 것인지를 충분히 고려한 후 모델링을 해야 한다. 클러스터의 노드들 사이에서의 partition들의 size, partition안의 데이터의 순서, partition들의 distribution 이런 것들은 테이블에 대한 베스트 primary key를 결정하기 위해 고려되어야 할 사항들이다.


Table characteristics


테이블 이름으로는 알파벳 문자로 이뤄진 string과 밑줄 (맨처음은 안 됨)을 사용할 수 있다. 테이블 이름을 정할 때

    다른 keyspace에 테이블을 생성할 경우.  keyspace 이름과 table 이름을 구분하기 위해 . (점)을 사용한다. 이렇게 하면 다른 키스페이스에 있더라도 원하는 키스페이스에 해당 테이블을 생성할 수 있다.
    현재 위치한 키스페이스를 사용할 경우. 테이블 이름만 명시하면 된다.

Column characteristics

컬럼은 CQL table의 중요한 component 이다. 테이블 스키마를 디자인하는데 유연성을 주기위해 여러개의 컬럼 타입들이 존재한다. 테이블 내의 각각의 컬럼은 테이블을 생성할 때 데이터 타입을 할당하게 된다. 컬럼 타입들은 collection-type 컬럼을 제외하고는 괄호를 사용해서 표시하고 컬럼이름과 type 의 쌍은 쉼표로 구분된다. 다음 예제는 UUID, text 그리고 timestamp 등 세개의 데이터 타입을 사용한다.

CREATE TABLE cycling.cyclist_alt_stats ( id UUID PRIMARY KEY, lastname text, birthday timestamp, nationality text, weight text, height text );





Collection column 타입은 map, set, list를 지원한다. 이 컬렉션 컬럼은 collection type을 사용해서 정의되고 그 다음에 꺽쇠 괄호 안에 int나 text 등의 다른 타입이 온다. 다음 예제는 각 collection type을 지정한다. 하지만 실제 쿼리를 위해 디자인 하는 것은 아니다.

CREATE TABLE cycling.whimsey ( id UUID PRIMARY KEY, lastname text, cyclist_teams set<text>, events list<text>, teams map<int,text> );





현재로서는 Collection type은 nest 될 수 없다. (collection 안의 또 다른 collection은 불가능하다.) Collection은 frozen data type을 포함할 수 있습니다. 그 사용예와 사용법을 보시려면  Collection type 을 보세요.
컬럼 타입인 tuple 데이터 타입은 입력된 positional field의 고정된 length 값을 가진다. tuple을 사용저 정의 타입의 대안으로 사용한다. tuple은 많은 field (32768)들을 가질 수 있다. 대개 tuple은 적은 수의 field로 생성한다. tuple은 대개 2~5 개 필드들에 사용된다. 테이블에 tuple을 생성하려면 꺽쇠 괄호를 사용한다. 그리고 tuple component type을 정의하기 위해 쉼표로 구분한다. Tuple은 nest 될 수 있다. (Tuple 안에 또 다른 Tuple을 만들 수 있다.) 다음 예제는 text 필드로 구성되고 또 그 안에 두개의 float 필드들이 있는 tuple 타입을 만드는 것을 보여 준다.

CREATE TABLE cycling.route (race_id int, race_name text, point_id int, lat_long tuple<text, tuple<float,float>>, PRIMARY KEY (race_id, point_id));





Note : 카산드라 2.1.0 에서 2.1.2 까지는 tuple을 위해 frozen을 사용해야 한다. 2.1.3 이상의 버전에서는 이 keyword가 꼭 필요하지는 않다.

frozen <tuple <int, tuple<text, double>>>

좀 더 자세한 정보는 "Tuple type" 을 보세요.

사용자 정의 타입 (UDTs)은 여러 필드들의 데이터 타입이 CREATE TYPE 을 사용해 생성할 때 컬럼 타입으로 사용될 수 있다. UDT는 여러 테이블 정의에서 사용되어질 컬럼 타입일 경우 사용된다. 사용자 정의 컬럼 타입은 frozen 키워드를 사용한다. frozen 은 여러 컴포넌트들을 하나의 value로 serializes 한다. Non-frozen type은 개별적인 필드에 대해 update할 수 있도록 한다. 카산드라는 frozen type의 value를 blob로 처리한다. keyspace의 scope : 키스페이스 이름 다음에 점을 찍고 타입의 이름을 사용한다. 이렇게 하면 (점을 사용하면) 카산드라는 해당 키스페이스의 타입에 접근하면서도 현재의 키스페이스를 바꾸지는 않는다. 다른 방법으로 키스페이스를 특정 하지 않으면 카산드라는 현재의 키스페이스 내에서 작업할 것이다. 자세한 사항은 "Using a user-defined type" 를 보라.

counter는 점차 증가하는 숫자를 저장하는데 사용되는 특별한 컬럼이다. countercounter data type 컬럼을 포함하고 있는 dedicated table에만 사용될 수 있다.



Using the keyspace qualifier

가끔 키스페이스를 선택하기 위해 USE 구문을 사용하는 것이 불편할 때가 있다. Connection pooling 은 여러개의 키스페이스를 관리해야 한다. 여러 키스페이스를 tracking 하는 것을 간편화하기 위해 USE 구문 대신에 keyspace  qualifier 를 사용한다. 이 statement들에 keyspace qualifier를 사용해서 키스페이스를 특정할 수 있다.

    ALTER TABLE
    CREATE TABLE
    DELETE
    INSERT
    SELECT
    TRUNCATE
    UPDATE

Procedure


사용할 키스페이스에 있지 않으면서 그 키스페이스 내의 테이블을 특정하려면 그 키스페이스 이름을 적고 그 다음에 점을 찍고 그리고 테이블 이름을 명시한다.
예를 들어 cycling.race_winners 이렇게 하면 cycling 키스페이스 안의 race_winners 테이블을 명시하는 것이다.

cqlsh> INSERT INTO cycling.race_winners ( race_name, race_position, cyclist_name ) VALUES (
  'National Championships South Africa WJ-ITT (CN)',
  1,
  {firstname:'Frances',lastname:'DU TOUT'}
);


Simple Primary Key

간단한 프라이머리 키를 가지고 있는 테이블에 대해 카산드라는 partition key로서 한개의 column name을 사용한다. 이 primary key는 이 경우 오직 한개의 partition key만을 갖게 되는 것이다. 만약 많은 양의 데이터가 사용되고 -프라이머리 키가 정의된 컬럼에 대해 적은 value만이 insert 되는 경우- 그 partition은 더 커지게 된다. Large partition은 read request에 대해 반응 속도가 느리거나 노드의 할당된 디스크공간에 대해 너무 크게 증가할 것이다. 다른 한편으로는 간단한 프라이머리 키에 저장된 데이터는 insert 와 retrieve시 속도가 빠를 것이다. 만약 해당 컬럼에 대해 많은 value들이 여러 노드에 걸쳐 partition들이 distribute 될 경우 더 효과적일 것이다.

가끔 카산드라를 사용할 때 부딪히는 첫번째 어려움에는 simple primary key를 가지고 있는 테이블과 관련된 일도 포함된다. 오직 해당 primary key만이 테이블에서 데이터를 retrieve 할 때 명시되어야 한다는 것을 명심하라. (secondary index가 사용되지 않을 경우.) 많은 production table들이 simple primary key 같은 unique identifier 들을 사용한다. 이런 identifier를 살펴보고 테이블의 나머지 데이터를 retrive 하라. 만약 어플리케이션이 simple lookup table이 필요하면 simple primary key를 사용하라. 그 테이블은 primary key로 id를 사용할 것이다.



To create a table having a single primary key, two methods can be used:
single primary key를 가지고 있는 테이블을 생성할 때 두가지 방법을 사용할 수 있다.

   
    CREATE TABLE definition 안의 컬럼 이름 다음에 PRIMARY KEY 라는 키워드를 넣는다.
    CREAET TABLE definition 안의 마지막 컬럼 정의 이후에 PRIMARY KEY 라는 키워드를 넣는다. 그 다음에 그 키의 컬럼 이름을 명시하면 된다. 그 컬럼 이름은 괄호 안에 넣는다.



Using a simple primary key


정렬된 결과를 return 하도록 하는 쿼리에 사용될 컬럼을 생성하기 위해 simple primary key를 사용한다. 이 예제는 ID number 가 저장된 cyclist_name 테이블을 생성한다. 그리고 컬럼들에는 사이클 선수의 이름과 성이 들어간다. 이 테이블은 primary key로 UUID 를 사용한다. 이 테이블은 해당 ID number에 해당하는 사이클 선수의 이름을 찾을 때 사용될 수 있다.


simple primary key 테이블 생성 방법은 다음과 같이 3가지가 있다.

Procedure

    cycling 키스페이스안에 cyclist_name이라는 테이블을 생성한다. primary key로 ID를 사용한다. 이 테이블을 생성하기 이전에 USE 구문으로 해당 키스페이스로 들어간다.

    cqlsh> USE cycling;
    CREATE TABLE cyclist_name ( id UUID PRIMARY KEY, lastname text, firstname text );





    테이블 definition 끝에 primary key 를 지정함으로서 똑같은 결과를 얻을 수 있다.

    cqlsh> USE cycling;
    CREATE TABLE cyclist_name ( id UUID, lastname text, firstname text, PRIMARY KEY (id) );

    USE 구문을 사용하지 않고 키스페이스 이름을 명시함으로서 해당 키스페이스에 테이블을 사용할 수 있다.

    cqlsh> CREATE TABLE cycling.cyclist_name ( id UUID, lastname text, firstname text, PRIMARY KEY (id) );

    Cassandra 2.2 이상 버전에서는 date 나 time data type을 사용할 수 있다.

    CREATE TABLE cycling.birthdays (id UUID PRIMARY KEY, bday date, btime time);



제가 설치한 카산드라에서 이 구문을 실행했더니 위와 같은 에러가 나오네요.


그래서 카산드라 버전을 확인해 봤습니다.


select peer, release_version from system.peers;
select release_version from system.local;




역시나 제가 설치한 카산드라 버전은 2.1.11.969 이네요.


여기까지 테이블 생성 관련해서 Simple Primary Key 까지 공부했습니다.


다음은 테이블 생성이 나머지 부분을 공부해 보겠습니다.

반응형

Comment

아파치 카산드라 - CQL 실습 1 keyspace

2015. 12. 20. 15:27 | Posted by 솔웅



오늘은 keyspace와 관련해서 리스트업 해보고 생성하고 업데이트 하는 것에 대해 공부해 보겠습니다.


Creating and updating a keyspace


CQL에서 keyspace를 생성하는 것은 SQL database를 생성하는 것과 비슷하지만 약간 다르다. Cassandra keyspace는 namespace로서 어떻게 node들에 데이터가 replicate (복제)될 것인가를 정의하는 것이다. 일반적으로 어플리케이션 당 한개의 cluster는 한개의 keyspace 를 가지고 있다. Replication은 keyspace별로 컨트롤 된다. 다른 replication을 가진 데이터는 다른 keyspace에 있어야 한다. 키스페이스는 데이터모델안에서 significant map layer로서 사용되도록 디자인되지 않았다.

키스페이스를 생성할 때, replicating keyspace를 위해 특정 strategy class를 명시해야 한다. SimpleStrategy 클래스는 카산드라를 evaluating할 때 좋다. 실제 프로덕션용이나 mixed workloads들을 위해서는 NetworkTopologyStrategy 클래스를 사용하는 것이 좋다.

NetworkTopologyStrategy를 예를 들어 single node cluster 같은 evaluating 목적으로 사용하기 위해서는 default data center name 이 사용된다. NetworkTopologyStrategy 를 프로덕션용으로 사용할 때에는, default snitch 인 SimpleSnitch를 network-aware snitch (네트워크에서 사용되는 snitch) 로 바꿔야 한다. 한개 이상의 데이터 센트 이름을 snitch property 파일에 정의하고 그 데이터 센터 이름을 keyspace를 정의할 때 사용해야 한다. Snitch 부분을 보세요. 만약 cluster 가 PropertyFileSnitch를 사용한다면 keyspace를 생성할 때 user-defined data center와 rack name을 cassandra-topologies.properties 파일에서 사용한다. 만약 cluster 가 Ec2Snitch를 사용한다면 키스페이스를 EC2 data center 와 rack 이름을 사용해서 생성한다. 만약 cluster가 GoogleCloudSnitch를 사용한다면 키스페이스를 GoogleCloud data center와 rack name을 사용해서 생성한다.

만약 default snitch를 바꾸고 NetworkTopologyStrategy를 사용하는데 실패하면 카산드라는 write request를 수행하지 못할 것이다. (예를 들어 데이터를 테이블에 insert 하는 것 같은...) 그리고 이런 에러 메세지를 log 할 것이다.

Unable to complete request: one or more nodes were unavailable.

데이터 센터 이름을 snitch property 파일에 정의하거나 datacenter1이라는 single data center 를 사용하지 않는 한 NetworkTopologyStrategy 를 사용하는 keyspace 에서는 table 에 데이터를 insert 할 수 없다.




CQL 을 한번 실습해 보겠습니다.

우선 다운 받은 Datastax Enterprise 에서 start_cassandra 를 더블 클릭해서 카산들를 실행합니다.

그리고 커맨드 창을 열어서 cqlsh 를 실행합니다.

그러면 위 화면과 같이 cqlsh 가 실행됩니다.



이제 전체 keyspace가 어떤게 있는지 보겠습니다.

select * from system.schema_keyspaces;


보니까 기본적으로 4개의 키스페이스가 있네요.

첫번째 키스페이스의 구조를 한번 보겠습니다.


desc dse_system;

이러면 해당 키스페이스의 구조를 볼 수 있습니다.



특정 키스페이스를 사용하시려면 이렇게 합니다.

use des_system;


그리고 이 keyspace 에 있는 column family들을 보려면 이렇게 합니다.


select * from system.schema_columnfamilies;


너무 복잡하니까 컬럼패밀리 이름들만 출력해 볼까요?





select columnfamily_name from system.schema_columnfamilies;


그리고 특정 컬럼패밀리의 구조를 보시려면 desc encryped_keys 를 하시면 됩니다.


참고로 use 'keyspace' 를 하지 않은 상태에서 특정 키스페이스 안의 컬럼패밀리들을 보려면 where절을 넣으시면 됩니다.

select columnfamily_name from syste.schema_columnfamilies where keyspace_name = '키스페이스';


desc tables; 라고 하면 현재 키스페이스 내의 테이블들을 보실 수 있습니다.



이제 keyspace를 생성해 보겠습니다.

CREATE KEYSPACE demodb WITH REPLICATION =
 { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };



생성된 키스페이스를 확인하기 위해 아래 두개의 쿼리를 이용했습니다.


select * from system.schema_keyspaces; , describe keyspaces;


Datastax 의 최신 버전 CQL Tutorial 페이지에서는 cycling 이라는 키스페이스를 생성했네요.

그래서 그 키스페이스도 생성해 보았습니다.


CREATE KEYSPACE IF NOT EXISTS cycling WITH REPLICATION 
= {
'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };


use cycling; , desc cycling; 을 해 보았습니다.


이제 이 키스페이스를 업데이트 해 보겠습니다.


Updating the replication factor


replication factor를 증가시키면 카산드라 클러스터에 저장된 keyspace data 의 copy 의

tatal number 가 증가된다. security feature를 사용한다면 default(1) 에서부터

system_auth 키스페이스의 replication factor 를 증가시키는 것이 중요하다.

왜냐하면 node 의 그 유일한 replication이 다운되면 더이상 클러스터에 log를 할 수 없기 때문이다.

system_auth 키스페이스에는 각 데이터 센터별 node 의 갯수 만큼 replication factor를

세팅하는 것이 권장된다.




ALTER KEYSPACE "cycling" WITH REPLICATION

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





반응형

Comment

이전 1 다음