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 할때
- 사용자는 Cassandra의 어느 노드들 중 하나에 Write를 요청 (Coordinator 노드라고 칭함)
- 이 Coordinator 노드는 Row Key를 Hashing하여 어느 노드들에 데이터를 Write해야 하는지 확인
- Write해야할 노드가 Status가 정상인지 확인한다.
- status 가 비정상인 경우에는 hint hand off라는 로컬 임시 저장공간 Write 할 데이터를 저장
- 이때 주의할점은 hint hand off가 Consistency를 보장하는 것을 아니다.
- Cassandra의 topoloy를 확인하여 어느 데이터 센터의 어느 렉에 있는 노드에 먼저 접근할 것인 결정하고 데이터 함께 Write
- 실제로 데이터를 저장하게 될 노드 Write 요청이 오면 혹시 모를 장애에 대비하여 CommitLog라고 로컬 디스크의 파일이 기록을 남김
- MemTable이라는 메모리 저장공간에 데이터를 Write, 성공 메시지에 Coordinator Node에게 돌려줌
- MemTable이 충분히 쌓이면 SSTable에 데이터를 Flush
- SSTable은 immutable하여 sequential하다는 특징이 있음
Read 할떄
- 사용자는 Cassandra의 어느 노드들중 하나에 Read 요청
- Row Key를 hashing하여 접근해야 할 노드의 위치 파악
- Consistency Level를 체크하여 몇 개의 Replication을 확인해야 할지 결정한다.
- 가장 가까운 노드에는 Data Request를 요청, 그 다음 가까운 노드들에는 Data Digest Reqeust를 요청
- 가져온 Data와 Data Digest를 확인하여 데이터 정보가 일치하지 않으면 일치하지 않는 데이터들의 노드들로부터 FullData를 가져와서 그중 가장 최신 데이터를 사용자에게 돌려준다.
- 그리고 난뒤에 최신데이터를 기준으로 나머지 노드들의 데이터를 수리
- MemTable의 저장된 데이터 확인
- 있으면 바로 리턴
- 없으면 Boolm Filter 확인
- Bloom Filter는 긍정오류를 발생할수 있지만, 부정오류는 발생하지 않는 확률적인 자료구조
- 쉽게 말하면 없는걸 있다고 거짓말을 할수 있지만, 있는 걸 없다고 거짓말 하지는 않는다는 것
- I/O가 일어나기전에 일차적으로 메모리 저장되어있는 Bloom Filter를 통해 SSTable에 데이터가 있는지 존재를 확인
- Summery Index 통해 데이터의 Offset 확인
- 원본 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 |