Jerry's Log

Cassandra

contents

1. Apache Cassandra란 무엇인가?

Cassandra는 단일 실패 지점(Single Point of Failure) 없이 범용 서버에서 대량의 데이터를 처리하도록 설계된 오픈 소스 분산 NoSQL 데이터베이스입니다.


2. 핵심 아키텍처: "링" (마스터 없음)

MySQL이나 MongoDB(보통 마스터-슬레이브 구조)와 달리, Cassandra는 P2P(Peer-to-Peer) 방식입니다.


3. 데이터 모델 (CQL)

Cassandra는 CQL(Cassandra Query Language) 을 사용합니다. SQL과 비슷해 보이지만 작동 방식은 완전히 다릅니다.

주의: JOIN 없음. Cassandra에서는 JOIN 연산을 할 수 없습니다. 쿼리에 맞춰 데이터를 미리 중복 저장(비정규화)해야 합니다. "데이터가 아니라 쿼리를 중심으로 테이블을 설계하라."


4. 쓰기 경로 (Write Path - 속도 최적화)

Cassandra는 엄청나게 빠른 쓰기 속도로 유명합니다. 쓰기 작업을 "이어 붙이기(Append Only)" 방식으로 처리합니다.

  1. Commit Log: 데이터가 디스크의 로그 파일에 기록됩니다 (장애 발생 시 복구용).
  2. Memtable: 데이터가 메모리(RAM) 구조에 기록됩니다.
  3. 응답(Acknowledge): 클라이언트에게 "성공" 메시지를 보냅니다. (주의: 아직 데이터가 디스크에 영구적으로 정리된 상태는 아님).
  4. 플러시(Flush -> SSTable): Memtable이 가득 차면, 디스크에 SSTable(Sorted String Table) 형태로 플러시됩니다. SSTable은 불변(Immutable) 입니다 (수정 불가).

5. 읽기 경로 (Read Path - 병합)

읽기는 쓰기보다 복잡합니다. 데이터가 여러 SSTable과 Memtable에 흩어져 있을 수 있기 때문입니다.

  1. 블룸 필터(Bloom Filter): 확률적 알고리즘으로 체크합니다: "이 SSTable에 데이터가 있을 가능성 이 있는가?" (불필요한 디스크 검색 방지).
  2. 키 캐시(Key Cache): 데이터 위치가 RAM에 캐시되어 있는지 확인합니다.
  3. Memtable 확인: 현재 메모리에 있는 최신 데이터를 확인합니다.
  4. SSTable 확인: 메모리에 없다면 디스크의 SSTable들을 스캔합니다.
  5. 조정(Reconciliation): 타임스탬프를 기준으로 Memtable과 SSTable의 데이터를 병합하여 최신 버전을 반환합니다.

6. 복제 및 일관성 (조정 가능)

Cassandra는 모든 쿼리마다 속도와 정확성 사이에서 선택할 수 있게 해줍니다.

강한 일관성(Strong Consistency) 공식:

Read Level + Write Level > Replication Factor

(예: RF=3일 때, 읽기 쿼럼(2) + 쓰기 쿼럼(2) = 4 > 3. 이러면 무조건 최신 데이터를 읽게 됩니다.)


7. 삭제 처리 (툼스톤)

SSTable은 불변(수정 불가)이므로, 파일에서 특정 행을 바로 "삭제"할 수 없습니다.


8. 요약: 언제 Cassandra를 써야 하나?

사용하세요 (YES) 피하세요 (NO)
높은 쓰기 처리량: IoT 센서 데이터, 로그, 채팅 메시지 수집. 복잡한 트랜잭션: ACID가 필요한 경우 (은행 이체).
글로벌 스케일: 미국, 유럽, 아시아에 걸친 Active-Active 복제 필요. Ad-hoc 쿼리: 무작위 JOIN이나 GROUP BY 분석이 필요한 경우.
Always On: 단 1초의 다운타임도 허용할 수 없을 때. 작은 데이터셋: 100GB 미만이라면 과한 선택(Overkill).

references