Database/Cassandra

Apache Cassandra

BUST 2018. 9. 17. 22:43

Apache Cassandra


특징

  • High Availability에 최적화된 분산형 Database
  • Consistent Hasing을 이용한 Ring 구조
    • https://ko.wikipedia.org/wiki/%EC%9D%BC%EA%B4%80%EB%90%9C_%ED%95%B4%EC%8B%B1
    • https://www.joinc.co.kr/w/man/12/hash/consistent
    • http://d2.naver.com/helloworld/1039
  • Gossip Protocol
    • 마스터 없이 동작
    • https://en.wikipedia.org/wiki/Gossip_protocol

Data Structure



  • 최상위 논리적인 Data 저장소 Keyspace
  • Table
    • Row
      • Key-Value로 구성된 Column

 


데이터의 분산



  • Replication 정책에 의해 Ring과 노드의 구성은 하나의 노드에서 연속한 3개의 Token 범위에 대한 저장 범위를 가진다.
  • 하나의 Row Key를 Hasing하여 token를 계산한뒤에 token에 해당되는 node를 찾아 CRUD를 진행을 한다.
    • 예를 들어) row_key : key를 hashing을 했더니 token이 F이면 node1, node2, node6에 CRUD를 진행을 한다.
  • Row Key를 어떻게  Token으로 어떻게 변환하는가?
    • conf/cassandra.yaml partitioner 항목에 어떤 Partitoner를 사용하는지 확인 가능
    • RandomPartitioner
      • MD5로 Hashing 하여 Token을 생성
    • Murmur3Partitioner
      • Murmur5로 Hasing하여 Token을 생성
      • default Partitoner
    • ByteOrderedPartitioner
      • Row Key를 16진수 형태로 변환하여 사용
      • Hot Spot이 발생될 가능이 높음.


Data Consistency와 Replication

  • CQL 쿼리 시점에 Read Write에 따른 다양한 Consistency Level를 통해 Replication을 통해 어느 정도 수준의 데이터 일관성을 확보 할것인이 선택이 가능
  • conf/cassandra.yaml의 endpoint_snitch 항목에 snitch 종류를 셋팅
    • sniitch?
      • 데이터 센터가 어떻게 구성되어 있는지, 장비가 설치된 렉이 어떻게 나뉘어져 있는지에 대한 topology
    • snitch의 종류는 매우 다양
      • 1개의 Data Center
      • 다수의 Data Center
      • Cloud Stack
      • Google Cloud
      • 등등
  • Data Consistency 관련된 설명
    • https://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlConfigConsistency.html



Virtual Node

  • Virtual Node란 실제 Cassandra 노드 안에 가상 노드를 여러개르 두고, 아주 잘게 나누어진 token 범위를 가상노드들에게 할당하여 데이터를 분산하는 개념

 


Read / Write

Write 할때




  1. 사용자는 Cassandra의 어느 노드들 중 하나에 Write를 요청 (Coordinator 노드라고 칭함)
  2. 이 Coordinator 노드는 Row Key를 Hashing하여 어느 노드들에 데이터를 Write해야 하는지 확인
  3. Write해야할 노드가 Status가 정상인지 확인한다.
    1. status 가 비정상인 경우에는 hint hand off라는 로컬 임시 저장공간 Write 할 데이터를 저장
    2. 이때 주의할점은 hint hand off가 Consistency를 보장하는 것을 아니다.
  4. Cassandra의 topoloy를 확인하여 어느 데이터 센터의 어느 렉에 있는 노드에 먼저 접근할 것인 결정하고 데이터 함께 Write


  1. 실제로 데이터를 저장하게 될 노드 Write 요청이 오면 혹시 모를 장애에 대비하여 CommitLog라고 로컬 디스크의 파일이 기록을 남김
  2. MemTable이라는 메모리 저장공간에 데이터를 Write, 성공 메시지에 Coordinator Node에게 돌려줌
  3. MemTable이 충분히 쌓이면 SSTable에 데이터를 Flush
    1. SSTable은 immutable하여 sequential하다는 특징이 있음


Read 할떄



  1. 사용자는 Cassandra의 어느 노드들중 하나에 Read 요청
  2. Row Key를 hashing하여 접근해야 할 노드의 위치 파악
  3. Consistency Level를 체크하여 몇 개의 Replication을 확인해야 할지 결정한다.
  4. 가장 가까운 노드에는 Data Request를 요청, 그 다음 가까운 노드들에는 Data Digest Reqeust를 요청
  5. 가져온 Data와 Data Digest를 확인하여 데이터 정보가 일치하지 않으면 일치하지 않는 데이터들의 노드들로부터 FullData를 가져와서 그중 가장 최신 데이터를 사용자에게 돌려준다.
  6. 그리고 난뒤에 최신데이터를 기준으로 나머지 노드들의 데이터를 수리



  1. MemTable의 저장된 데이터 확인
    1. 있으면 바로 리턴
  2. 없으면 Boolm Filter 확인
    1. Bloom Filter는 긍정오류를 발생할수 있지만, 부정오류는 발생하지 않는 확률적인 자료구조
    2. 쉽게 말하면 없는걸 있다고 거짓말을 할수 있지만, 있는 걸 없다고 거짓말 하지는 않는다는 것
    3. I/O가 일어나기전에 일차적으로 메모리 저장되어있는 Bloom Filter를 통해 SSTable에 데이터가 있는지 존재를 확인
  3. Summery Index 통해 데이터의 Offset 확인
  4. 원본 Index를 통해 원하는 SSTable에 원하는 데이터를 가지고 온다.


Delete 할때

  • Tombstone에 마킹을 한후, 주기적인 Garbage Collection이나  SSTable의 Compaction 등의 이벤트가 발생할때 데이터를 삭제


Update 할때

  • Update는 내부적으로 Delete/Write로 구현되어 있음
  • Delete를 통해 Tombstone에 마킹을 하고, 새로운 데이터를 다른곳에 쓰여짐.


지원하는 기능들

  • Join, Transaction 지원하지 않음
  • 높은 수준의 Index 제공하지 않음
  • 복잡한 쿼리는 불가능하다.
  • Secondary Index
    • Range Query는 동작하지 않는다.
  • Collection
    • Set, List, Map


참고자료

  • Install Cassandra - http://cassandra.apache.org/doc/latest/getting_started/installing.html
  • CQL - http://cassandra.apache.org/doc/latest/cql/index.html#cql
  • Apache Cassandra 톺아보기 - http://meetup.toast.com/posts/58

 


참고할만한 외국 책

  • Learning Apache Cassandra
  • Mastring Apache Cassandra
  • Cassandra High Availabilty


'Database > Cassandra' 카테고리의 다른 글

Cassandra Install  (0) 2018.07.28
Cassandra Model Design Examples  (0) 2018.02.10