Cassandra
contents
1. Apache Cassandra란 무엇인가?
Cassandra는 단일 실패 지점(Single Point of Failure) 없이 범용 서버에서 대량의 데이터를 처리하도록 설계된 오픈 소스 분산 NoSQL 데이터베이스입니다.
- 유형: Wide-Column Store (2차원 키-값 저장소).
- 기원: 페이스북(2008)에서 Inbox 검색 기능을 위해 개발되었으며, 아마존 Dynamo의 아키텍처(분산)와 구글 Bigtable의 데이터 모델(저장)을 결합했습니다.
- 핵심 철학: "Always On (항상 켜져 있음)." CAP 이론에서 즉각적인 일관성(Consistency)보다는 가용성(Availability) 과 분할 내성(Partition Tolerance)(AP)을 최우선으로 합니다.
2. 핵심 아키텍처: "링" (마스터 없음)
MySQL이나 MongoDB(보통 마스터-슬레이브 구조)와 달리, Cassandra는 P2P(Peer-to-Peer) 방식입니다.
- Masterless: 모든 노드가 동등합니다. 죽었을 때 시스템 전체를 마비시키는 "단일 대장(Brain)"이 없습니다.
- 링(Ring): 노드들은 논리적으로 링 형태로 배치됩니다. 데이터는 일관된 해싱(Consistent Hashing)을 통해 이 링을 따라 분산됩니다.
- 가십 프로토콜(Gossip Protocol): 노드끼리 매초 서로 정보를 교환("가십")하여 상태를 공유합니다 (예: "A 노드 살아있음", "B 노드 죽었음").
- 스니치(Snitch): 노드가 어느 데이터 센터와 랙(Rack)에 위치해 있는지 알려주는 컴포넌트로, 위상(Topology)을 인식하게 해줍니다.
3. 데이터 모델 (CQL)
Cassandra는 CQL(Cassandra Query Language) 을 사용합니다. SQL과 비슷해 보이지만 작동 방식은 완전히 다릅니다.
- 키스페이스(Keyspace): RDBMS의
Database와 유사합니다. 복제 전략을 정의합니다. - 테이블(Table):
Table과 유사합니다 (과거엔 Column Family라 불림). - 행(Row): Primary Key로 식별되는 컬럼들의 집합입니다.
- Primary Key (매우 중요):
- 파티션 키(Partition Key): 데이터를 어떤 노드에 저장할지 결정합니다. (예:
user_id). - 클러스터링 키(Clustering Key): 해당 노드 안에서 데이터가 어떻게 정렬될지 결정합니다. (예:
created_atDESC).
- 파티션 키(Partition Key): 데이터를 어떤 노드에 저장할지 결정합니다. (예:
주의: JOIN 없음. Cassandra에서는
JOIN연산을 할 수 없습니다. 쿼리에 맞춰 데이터를 미리 중복 저장(비정규화)해야 합니다. "데이터가 아니라 쿼리를 중심으로 테이블을 설계하라."
4. 쓰기 경로 (Write Path - 속도 최적화)
Cassandra는 엄청나게 빠른 쓰기 속도로 유명합니다. 쓰기 작업을 "이어 붙이기(Append Only)" 방식으로 처리합니다.
- Commit Log: 데이터가 디스크의 로그 파일에 기록됩니다 (장애 발생 시 복구용).
- Memtable: 데이터가 메모리(RAM) 구조에 기록됩니다.
- 응답(Acknowledge): 클라이언트에게 "성공" 메시지를 보냅니다. (주의: 아직 데이터가 디스크에 영구적으로 정리된 상태는 아님).
- 플러시(Flush -> SSTable): Memtable이 가득 차면, 디스크에 SSTable(Sorted String Table) 형태로 플러시됩니다. SSTable은 불변(Immutable) 입니다 (수정 불가).
5. 읽기 경로 (Read Path - 병합)
읽기는 쓰기보다 복잡합니다. 데이터가 여러 SSTable과 Memtable에 흩어져 있을 수 있기 때문입니다.
- 블룸 필터(Bloom Filter): 확률적 알고리즘으로 체크합니다: "이 SSTable에 데이터가 있을 가능성 이 있는가?" (불필요한 디스크 검색 방지).
- 키 캐시(Key Cache): 데이터 위치가 RAM에 캐시되어 있는지 확인합니다.
- Memtable 확인: 현재 메모리에 있는 최신 데이터를 확인합니다.
- SSTable 확인: 메모리에 없다면 디스크의 SSTable들을 스캔합니다.
- 조정(Reconciliation): 타임스탬프를 기준으로 Memtable과 SSTable의 데이터를 병합하여 최신 버전을 반환합니다.
6. 복제 및 일관성 (조정 가능)
Cassandra는 모든 쿼리마다 속도와 정확성 사이에서 선택할 수 있게 해줍니다.
- 복제 계수(RF): 데이터 사본을 몇 개 만들 것인가. (보통 RF=3).
- 일관성 레벨(CL):
- CL=ONE: "노드 1개만 확인되면 성공으로 쳐줘." (가장 빠름, 고가용성, 데이터 유실 위험).
- CL=QUORUM: "과반수(51%+) 노드가 확인해야 해." (균형 잡힘, 강한 일관성).
- CL=ALL: "모든 노드가 확인해야 해." (가장 느림, 하나만 죽어도 실패).
강한 일관성(Strong Consistency) 공식:
Read Level + Write Level > Replication Factor(예: RF=3일 때, 읽기 쿼럼(2) + 쓰기 쿼럼(2) = 4 > 3. 이러면 무조건 최신 데이터를 읽게 됩니다.)
7. 삭제 처리 (툼스톤)
SSTable은 불변(수정 불가)이므로, 파일에서 특정 행을 바로 "삭제"할 수 없습니다.
- 툼스톤(Tombstone - 묘비): Cassandra는 새 데이터 파일에 "이 행은 법적으로 죽었음"이라는 툼스톤 마커를 기록합니다.
- 컴팩션(Compaction): 백그라운드 프로세스가 주기적으로 오래된 SSTable들을 병합할 때, 툼스톤이 박힌 데이터를 실제로 삭제하고 디스크 공간을 회수합니다.
8. 요약: 언제 Cassandra를 써야 하나?
| 사용하세요 (YES) | 피하세요 (NO) |
|---|---|
| 높은 쓰기 처리량: IoT 센서 데이터, 로그, 채팅 메시지 수집. | 복잡한 트랜잭션: ACID가 필요한 경우 (은행 이체). |
| 글로벌 스케일: 미국, 유럽, 아시아에 걸친 Active-Active 복제 필요. | Ad-hoc 쿼리: 무작위 JOIN이나 GROUP BY 분석이 필요한 경우. |
| Always On: 단 1초의 다운타임도 허용할 수 없을 때. | 작은 데이터셋: 100GB 미만이라면 과한 선택(Overkill). |
references