Skip to content

Cassandra 정의 #
Find similar titles

Structured data

Category
Programming

Cassandra #

Apache Cassandra는 Free-Open Source Distributed NoSQL Database 관리 시스템의 하나이며, 단일 장애점(單一障礙點, Single point of failure, SPOF) 없이 고성능을 제공하면서 수많은 서버 간의 대용량의 데이터를 관리하기 위해 설계되었다. Cassandra는 여러 Data Center에 걸쳐 Cluster를 지원한다. 또한 Masterless Asynchronous-synchronous Replication을 통해 모든 Client에 대한 낮은 latency운영을 허용한다.

Cassandra의 역사 #

Cassandra는 Google의 BigTable Colume 기반의 Data Model과 FaceBook에서 만든 Dynamo의 Distributed Model을 기반으로 하여 제작되어 FaceBook에 의해 2008년에 Apache Free-Open Souce로 공개된 Distributed Database이다.

버전 출시일 상태
0.6 2010-04-12 더 이상 지원하지 않음
0.7 2011-01-10 더 이상 지원하지 않음
0.8 2011-06-03 더 이상 지원하지 않음
1.0 2011-10-18 더 이상 지원하지 않음
1.1 2012-04-24 더 이상 지원하지 않음
1.2 2013-01-02 더 이상 지원하지 않음
2.0 2013-09-03 더 이상 지원하지 않음
2.1 2014-09-16 현재 지원함, critical fixes only
2.2 2015-07-20 현재 지원함
3.0 2015-11-09 현재 지원함
3.11 2017-06-23 최신 버전

Cassandra의 특징 #

Cassandra는 Scalability와 High availability에 최적화된 대표적인 Distributed Data Storage이다.

장점 #

Consistent Hasing을 이용한 Ring구조와 Gossip protocol을 구현하였기 때문에 각 노드 장비들의 추가, 제거 등이 자유롭다. 또한 데이터 센터까지 고려 할 수 있는 데이터 복제 정책을 사용하여 안정성 측면에서 많은 장점을 가지고 있다. Cassandra를 이용하면 Sharding을 고려해야 할 필요도 없고 Master-Slave와 같은 정책이 없어도 장애에 대한 대응이 가능하며, 장비들을 늘리고 줄이는데 큰 비용이 들지 않는다.

단점 #

Cassandra는 Join이나 Transaction을 지원하지 않고, Index 등의 검색을 위한 기능도 매우 단촐하다. 게다가 Cassandra의 구조상 RDBMS와 같은 Paging을 구현하는 것이 어렵고 Keyspace나 Table등을 과도하게 생성할 경우 Memory에 대한 Overflow가 발생할 수 있다.

Cassandra Data Structure #

image

그림1. Cassandra Data layer

출처: https://blog.insightdatascience.com/the-total-newbies-guide-to-cassandra-e63bce0316a4

Cassandra의 Data Structure는 비교적 간단하다. 최상위에 Keyspace(Logical Data Storage)가 있고, Keyspace 아래에는 Table이 존재한다. Table은 다수의 Row들로 구성되어 있으며, 각 Row는 Key와 Value로 이루어진 Column들로 구성된다. RDBMS의 DB-Table-Row-Column의 구조와 유사한 모습이다. 또한 Cassandra는 현재 CQL(Cassandra Query Language)을 지원하고 있기 때문에, 기존의 RDBMS를 사용한 적이 있는 사람들이라면 큰 거부감 없이 Cassandra를 사용할 수 있다.

image

그림2. Cassandra Ring

출처: https://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureDataDistributeDistribute_c.html

Cassandra는 위 그림과 같이 Ring구조를 하고 있다. 그리고 Ring을 구성하는 각 노드에 Data를 분산하여 저장한다. 위 그림에서 알파벳은 Token의 범위를 의미하며 Partition Key라 불리는 Data의 hash값을 기준으로 Data를 분산하게 된다. 여기서 Partition Key는 Cassandra Data Layer에서 Row Key라고 불린다. 처음 각 노드가 Ring에 참여하게 되면, Cassandra의 Conf/Cassandra.yaml에 정의된 각 설정을 통하여 각 노드마다 고유의 hash 값 범위를 부여 받는다. 그 후 외부에서 Data의 Request가 오게 되면 해당 Data의 Partition Key의 Hash값을 계산하여 해당 Data가 어느 노드에 저장되어 있는지 알고 접근할 수 있다. Cassandra는 이렇게 계산된 Hash값을 Token이라고 부른다.

Column #

Column은 Column 이름과 값으로 이루어진 데이타 구조체이다.

{name: "emailAddress", value:"gdhong@insilicogen.com"}
{name: "age", value:"36"}

Column Family #

Column Family는 Column들의 집합이다. Relational database의 table과 비슷하지만 조금 차이가 있다. Column Family는 하나의 ROW를 식별하기 위한 Key를 갖는다. 하나의 Key에 여러개의 Column이 달려 있는 형태가 Column Family이다.

Cassandra = {emailAddress: "Cassandra@insilicogen.com", age: "36"}

Cassandra가 해당 Row에 대한 Key가 되고, emailAddress와 age라는 이름의 두개의 Column을 가지고 있으며 각 Column의 값은 "과 "36"이다.

UserProfile={
    Cassandra ={ emailAddress: "Cassandra@insilicogen.com", age: "36"}
    Dolphin   ={ emailAddress: "Dolphin@insilicogen.com", sex: "male"}
    Monkey    ={ emailAddress: "Monkey@insilicogen.com", age: "22", sex: "female", address: "Tokyo"}
   }

위와 같이 여러개의 Row를 가지고 있는 UserProfile는 각 Row의 data Schema가 다르다. Cassandra Row는 emailAddress와 age라는 Column을 가지고 있고, Dolphin은 emailAddress와 sex라는 컬럼을 가지고 있다. 이처럼 Cassandra는 각 Row마다 다른 형태의 Data Schema를 가질 수 있는데, 이러한 특징을 "Schemeless"라고 한다.

KeySpace #

KeySpace는 논리적으로 ColumnFamily를 묶어주는 개념이다. 단지 묶어만 줄뿐 Data Structure나 relation에서는 별다른 영향을 주지 않는다.

Spuer Column & Supper Column Family #

Column의 Value는 String이나 Integer와 같은 Primitive형 뿐만 아니라 Column 자체가 다시 들어갈 수도 있는데 이를 Super Column이라고 한다.

{
name: "userName"
 value: firstName{name: "firstName",value="Gildong"}
 value: lastName{name: "lastName", value="Hong"}
}

userName이라는 Column 안에 firstName과 lastName이라는 두 개의 column이 들어가 있는 구조이다.

마찬가지 형태로 Column Family 안에도 Column Family가 들어가는 Supper Column Family구조가 가능하다.

UserList={ 
          Gildong:{ 
                   userName:{firstName:"Gildong",lastName:"Hong"}
                   address:{city:"Seoul",postcode:"1234"}
                  }
          Sonsin:{ 
                  userName:{firstName:"Sonsin",lastName:"Lee"}
                  account:{bank:"Seoul",accounted:"1234"} 
                 }
         }

UserList라는 Column Family 안에, Gildong의 Key는 userName과 address라는 Column Family를 가지고 있고, Sonsin라는 Key는 userName과 account라는 Column Family를 가지고 있다.

관련 키워드 #

Database, CQL, BigData, NoSQL, Oracle, RDBMS, Apache, MongoDB, Data mining, [Haddop]]

0.0.1_20140628_0