Apache Cassandra
1. 개요
1. 개요
Apache Cassandra는 오픈 소스 분산 데이터베이스 관리 시스템이다. 이 시스템은 대규모의 구조화된 데이터를 여러 상용 서버에 걸쳐 안정적으로 저장하고 관리하도록 설계되었다. 아마존 다이나모DB와 구글 빅테이블의 논문에서 영감을 받아 개발되었으며, 페이스북에서 처음 만들어져 2008년에 공개되었다. 이후 2010년에 아파치 소프트웨어 재단의 최상위 프로젝트가 되었다.
Cassandra의 핵심 설계 목표는 가용성, 확장성, 내결함성이다. 이는 단일 장애점이 없는 P2P 아키텍처를 채택하여 실현된다. 모든 노드가 동등한 역할을 하며, 데이터는 클러스터 전체에 자동으로 복제되어 저장된다. 이로 인해 하드웨어나 네트워크의 일부에 장애가 발생하더라도 시스템 전체의 서비스 중단 없이 운영을 계속할 수 있다.
이 데이터베이스는 NoSQL 데이터베이스의 한 종류로 분류되며, 특히 와이드 컬럼 스토어 또는 키-값 스토어 모델을 따른다. 전통적인 관계형 데이터베이스와 달리 고정된 스키마나 조인 연산에 의존하지 않는다. 대신 Cassandra Query Language라는 SQL과 유사한 언어를 통해 데이터에 접근하고 조작한다.
Apache Cassandra는 초당 수만 건의 트랜잭션을 처리해야 하는 대용량 데이터 작업에 적합하다. 주로 타임시리즈 데이터, 메시징 시스템, 사용자 활동 추적, 인터넷 of Things 센서 데이터, 소셜 미디어 피드와 같은 쓰기 작업이 빈번한 애플리케이션에서 널리 사용된다.
2. 아키텍처
2. 아키텍처
Apache Cassandra의 아키텍처는 단일 장애점이 없는 P2P 분산 시스템을 기반으로 한다. 모든 노드는 동등한 지위를 가지며, 클라이언트는 클러스터 내의 어떤 노드에든 연결하여 읽기 및 쓰기 요청을 보낼 수 있다. 이 노드는 해당 요청을 담당하는 적절한 노드로 전달하는 코디네이터 역할을 한다. 데이터는 파티션 키를 기준으로 해싱되어 클러스터의 여러 노드에 자동으로 분산 저장된다.
데이터 모델은 컬럼 패밀리 개념에서 진화한 테이블 기반 구조를 사용한다. 각 행은 고유한 파티션 키로 식별되며, 하나의 파티션 내에는 정렬된 여러 클러스터링 컬럼을 가진 로우가 포함될 수 있다. 이 설계는 관련 데이터를 함께 저장하여 효율적인 읽기 접근을 가능하게 한다. 스키마는 필수적이지만, CQL을 통해 동적으로 컬럼을 추가하는 등의 유연성을 제공한다.
일관성, 가용성, 파티션 내성의 균형을 맞추기 위해 Cassandra는 조정 가능한 일관성 수준을 제공한다. 쓰기 또는 읽기 작업 시, 사용자는 일관성 수준을 지정하여 얼마나 많은 복제본 노드가 응답해야 작업이 성공하는지를 정의할 수 있다. 주요 수준은 다음과 같다.
일관성 수준 | 설명 |
|---|---|
ONE | 하나의 복제본으로부터 응답을 받으면 성공한다. |
QUORUM | 과반수(복제본 수 / 2 + 1)의 복제본으로부터 응답을 받으면 성공한다. |
ALL | 모든 복제본으로부터 응답을 받아야 성공한다. |
LOCAL_QUORUM | 로컬 데이터센터 내의 과반수 복제본으로부터 응답을 받으면 성공한다. |
이 메커니즘을 통해 애플리케이션은 특정 요구사항에 따라 강한 일관성 또는 높은 가용성 사이에서 선택할 수 있다. 데이터 복제는 복제 전략과 복제 계수에 따라 자동으로 수행된다.
2.1. 분산 설계와 노드
2.1. 분산 설계와 노드
Apache Cassandra는 마스터-슬레이브 구조가 아닌 피어 투 피어 아키텍처를 기반으로 설계되었다. 모든 노드는 동등한 지위를 가지며, 특정 마스터 노드가 존재하지 않는다. 이는 단일 장애점을 제거하여 시스템의 내결함성을 극대화한다. 클라이언트는 클러스터 내의 어떤 노드에든 연결하여 읽기 또는 쓰기 요청을 보낼 수 있으며, 해당 노드는 요청을 적절한 데이터 홀더 노드로 라우팅하는 코디네이터 역할을 수행한다.
데이터는 파티션 키를 기준으로 해싱되어 클러스터의 여러 노드에 분산 저장된다. 이 분산을 관리하는 핵심 메커니즘은 일관성 해싱 원리를 활용한 파티셔너이다. 각 노드와 각 데이터의 파티션 키는 하나의 가상 원 위에 배치되며, 키는 시계 방향으로 다음 노드에 할당된다. 노드의 추가 또는 제거 시 데이터의 재분배는 최소한으로 이루어진다.
클러스터의 논리적 구조는 데이터센터, 랙, 노드 계층으로 구성된다. 이 구조는 복제 전략 설정의 기초가 된다. 데이터는 지정된 복제 인자에 따라 여러 노드에 복제되어 저장된다. 예를 들어, 복제 인자가 3이라면 각 데이터는 서로 다른 3개의 노드에 복사된다. 복제본의 배치는 네트워크 토폴로지 인식 복제 전략을 통해 수행되어, 하나의 랙이나 데이터센터 전체가 고장 나도 데이터의 가용성을 보장한다.
노드 간의 상태 정보 동기화와 클러스터 멤버십 관리는 가십 프로토콜을 통해 이루어진다. 각 노드는 주기적으로 다른 노드들에 대한 상태 정보를 교환하여, 노드 장애를 빠르게 탐지하고 클러스터의 일관된 뷰를 유지한다. 이 프로토콜은 네트워크 오버헤드를 최소화하면서도 효율적인 장애 감지를 가능하게 한다.
2.2. 데이터 모델
2.2. 데이터 모델
Apache Cassandra의 데이터 모델은 관계형 데이터베이스의 테이블 구조와 유사하지만, 분산 저장을 위한 핵심 개념인 파티션 키와 클러스터링 컬럼을 중심으로 설계된다. 기본 구성 요소는 키스페이스, 테이블, 행, 컬럼이다. 키스페이스는 테이블의 최상위 논리적 그룹이며, 복제 및 데이터 배치 전략을 정의한다. 테이블은 행과 컬럼으로 구성되며, 각 행은 고유한 기본 키에 의해 식별된다.
기본 키는 하나 이상의 컬럼으로 구성되며, 반드시 파티션 키와 선택적인 클러스터링 컬럼으로 구분된다. 파티션 키는 데이터가 클러스터 내의 어떤 노드에 저장될지를 결정하는 해시값을 생성하며, 동일한 파티션 키를 가진 모든 행은 동일한 물리적 파티션에 함께 저장된다. 클러스터링 컬럼은 파티션 내에서 행의 정렬 순서를 결정한다. 예를 들어, 기본 키가 `(country, city, user_id)`라면 `country`가 파티션 키, `city`와 `user_id`가 클러스터링 컬럼이 될 수 있다. 이 경우 같은 국가의 모든 사용자 데이터는 하나의 파티션에 모이고, 도시와 사용자 ID 순으로 정렬되어 저장된다.
이 모델은 쿼리 패턴을 먼저 설계하는 쿼리 기반 모델링을 권장한다. 데이터는 특정 파티션 내에서 클러스터링 컬럼 순으로 정렬되어 저장되므로, 범위 조회가 효율적이다. 반면, 파티션 키를 지정하지 않은 쿼리나 클러스터링 컬럼 정렬 순서를 무시한 조인 연산은 비효율적이거나 지원되지 않는다. 컬럼의 집합은 행마다 다를 수 있으며, 동적 추가가 가능한 유연성을 제공한다.
데이터 모델의 주요 특성은 다음과 같이 요약할 수 있다.
개념 | 설명 | 역할 |
|---|---|---|
파티션 키 | 데이터 분산의 기준. 해싱을 통해 저장 노드를 결정한다. | 데이터 배치 및 수평 확장성 보장 |
클러스터링 컬럼 | 파티션 내 데이터 정렬 기준. 정렬 순서를 정의한다. | 파티션 내 효율적인 범위 스캔 및 정렬 |
정적 컬럼 | 동일 파티션 내 모든 행에서 동일한 값을 공유하는 컬럼이다. | 파티션 수준에서 중복 데이터 저장 방지 |
이러한 설계는 고가용성과 선형 확장성을 실현하는 동시에, 쓰기 성능을 최적화한다. 그러나 관계형 모델의 정규화나 복잡한 조인을 지원하지 않으므로, 데이터 중복을 허용하고 애플리케이션 측에서 조인을 처리하는 비정규화 접근 방식이 일반적이다.
2.3. 일관성 수준
2.3. 일관성 수준
Apache Cassandra는 CAP 정리에서 일관성(Consistency)과 가용성(Availability) 사이의 균형을 유연하게 조정할 수 있도록 설계되었다. 이를 위해 읽기와 쓰기 연산 모두에 대해 다양한 일관성 수준을 제공한다. 사용자는 각 쿼리마다 필요한 수준을 지정하여 애플리케이션의 요구사항에 맞게 일관성과 성능, 가용성을 세밀하게 제어할 수 있다.
주요 일관성 수준은 다음과 같다.
수준 | 설명 |
|---|---|
`ONE` | 하나의 복제본 노드로부터 응답을 받으면 성공으로 간주한다. 가장 낮은 지연 시간을 제공하지만, 최신 데이터를 읽지 못할 가능성이 있다. |
`QUORUM` | 복제 계수(RF)를 기준으로 과반수( (RF/2) + 1 )의 노드로부터 응답을 받아야 한다. 강력한 일관성을 보장하는 일반적인 선택이다. |
`ALL` | 모든 복제본 노드로부터 응답을 받아야 한다. 가장 강력한 일관성을 제공하지만, 단일 노드의 장애가 연산을 차단할 수 있다. |
`LOCAL_ONE`, `LOCAL_QUORUM` | 로컬 데이터센터 내의 노드만을 대상으로 `ONE` 또는 `QUORUM` 수준을 적용한다. 다중 데이터센터 구성에서 네트워크 지연을 줄이는 데 유용하다. |
`EACH_QUORUM` | 각 데이터센터마다 독립적으로 `QUORUM`을 만족해야 한다. 매우 강력한 일관성을 보장하지만 성능 비용이 크다. |
이러한 수준은 최종 일관성 모델 위에서 동작한다. 예를 들어, `QUORUM` 수준으로 쓰고 `QUORUM` 수준으로 읽으면 강력한 일관성 읽기를 달성할 수 있다. 이는 클라이언트가 항상 가장 최근에 성공한 쓰기의 결과를 읽게 됨을 의미한다. 반면, `ONE` 수준은 가용성과 낮은 지연 시간을 우선시하지만, 읽은 데이터가 약간 오래되었을 수 있다. 적절한 수준의 선택은 애플리케이션의 내구성 요구사항과 지연 시간 허용 범위에 따라 결정된다.
3. 주요 기능
3. 주요 기능
주요 기능은 Apache Cassandra가 대규모 분산 환경에서 신뢰할 수 있는 데이터 저장소로 자리매킨 핵심적인 특성을 포괄한다. 이 기능들은 CAP 정리의 일관성(Consistency)과 가용성(Availability) 사이의 균형을 실용적으로 구현한 결과물이다.
첫 번째 핵심 기능은 고가용성과 내결함성이다. Cassandra는 마스터리스(masterless) 링 구조를 채택하여 모든 노드가 동등한 역할을 수행한다. 특정 노드에 장애가 발생하더라도 데이터는 다른 노드에 복제되어 있기 때문에 시스템 전체의 가용성에 영향을 미치지 않는다. 데이터는 설정된 복제 계수에 따라 여러 노드에 자동으로 분산 저장되며, 클라이언트는 장애 노드를 우회하여 사용 가능한 복제본에서 데이터를 읽거나 쓸 수 있다.
두 번째는 선형 확장성이다. 처리량과 저장 용량을 증가시키기 위해 새로운 노드를 클러스터에 추가하기만 하면 된다. 이 과정에서 Apache Cassandra는 데이터를 자동으로 재분배하여 부하를 균등하게 분산시킨다. 시스템 중단 없이 온라인 상태에서 확장 작업이 가능하며, 성능은 추가된 하드웨어 리소스에 비례하여 거의 선형적으로 향상된다.
세 번째 주요 기능은 다중 데이터센터 지원이다. Cassandra는 지리적으로 분리된 데이터센터에 걸쳐 단일 논리적 클러스터를 구성할 수 있다. 데이터센터 간의 복제 전략과 일관성 수준을 세밀하게 제어할 수 있어, 지역적 장애에 대한 복원력을 제공하거나 사용자에게 지리적으로 가까운 데이터를 서비스하는 데 활용된다. 이는 활동-활동 구성이 가능하게 하여 재해 복구와 지연 시간 최소화를 동시에 실현한다.
3.1. 고가용성과 내결함성
3.1. 고가용성과 내결함성
Apache Cassandra는 분산 시스템의 핵심 원칙에 기반하여 고가용성과 내결함성을 제공한다. 시스템은 여러 데이터 센터에 걸쳐 복제된 노드들로 구성된 클러스터로 운영된다. 데이터는 파티션 키를 기준으로 클러스터 전체에 분산 저장되며, 각 데이터 파티션은 설정된 복제 계수만큼 여러 노드에 복제된다. 이 설계는 단일 노드나 심지어 전체 데이터 센터의 장애가 발생하더라도 애플리케이션이 다른 복제본을 통해 데이터에 계속 접근할 수 있도록 보장한다.
내결함성은 가십 프로토콜 기반의 피어 투 피어 아키텍처를 통해 구현된다. 모든 노드는 동등한 지위를 가지며, 중앙 조정자나 단일 장애점이 존재하지 않는다. 노드 간의 상태 정보 교환과 장애 감지는 이 프로토콜을 통해 효율적으로 이루어진다. 한 노드가 장애를 일으키면, 클러스터의 다른 노드들이 이를 감지하고 해당 노드가 담당하던 데이터에 대한 요청을 보유한 복제본 노드들이 자동으로 처리한다. 장애 노드가 복구되면, 안티-엔트로피 프로세스인 메르클 트리를 사용하여 다른 노드들과 데이터를 비교하고 최신 상태로 동기화한다.
고가용성을 위한 핵심 메커니즘은 일관성 수준을 애플리케이션 요구사항에 따라 조정할 수 있다는 점이다. 예를 들어, `ONE` 수준은 단일 복제본의 응답만을 기다려 짧은 지연 시간을 제공하는 반면, `QUORUM` 또는 `ALL` 수준은 더 강한 일관성을 보장한다. 또한 다중 데이터센터 지원 기능은 지리적으로 분산된 환경에서도 가용성을 유지할 수 있게 한다. 한 데이터 센터가 정전이나 네트워크 단절과 같은 광범위한 장애를 겪더라도, 다른 데이터 센터의 복제본을 통해 서비스가 중단 없이 계속될 수 있다.
일관성 수준 | 설명 | 가용성 영향 |
|---|---|---|
`ONE` | 하나의 복제본으로부터 응답을 받으면 성공으로 간주한다. | 지연 시간이 매우 짧고 가용성이 높다. |
`QUORUM` | 복제본의 과반수(`(복제 계수/2) + 1`)로부터 응답을 받아야 한다. | 일관성과 가용성 사이의 균형을 제공한다. |
`ALL` | 모든 복제본으로부터 응답을 받아야 한다. | 가장 강한 일관성을 보장하지만, 단일 복제본의 장애도 요청 실패를 유발할 수 있다. |
`LOCAL_QUORUM` | 로컬 데이터 센터 내의 복제본 과반수로부터 응답을 받아야 한다. | 다중 데이터센터 환경에서 지연 시간을 줄이면서 일관성을 유지한다. |
3.2. 선형 확장성
3.2. 선형 확장성
Apache Cassandra의 핵심 설계 목표 중 하나는 선형 확장성을 제공하는 것이다. 이는 시스템에 노드를 추가함에 따라 처리량과 저장 용량이 거의 비례하여 증가하는 특성을 의미한다. 마스터-슬레이브 구조나 샤딩을 위한 중앙 조정자가 없는 P2P 아키텍처 덕분에, 클러스터는 병목 현상 없이 수백 대의 노드로까지 확장될 수 있다.
확장 작업은 비교적 간단하다. 새로운 노드를 클러스터에 추가하면, Cassandra는 내부의 일관성 해싱과 가상 노드 메커니즘을 통해 기존 데이터의 일부를 자동으로 새 노드에 재분배한다. 이 과정은 온라인 상태에서 수행되며, 서비스 중단을 유발하지 않는다. 읽기 및 쓰기 작업은 클라이언트가 접속한 어떤 노드에서도 처리될 수 있으며, 해당 노드는 요청을 적절한 데이터 소유자 노드로 라우팅하는 코디네이터 역할을 한다.
성능 측면에서 선형 확장성은 다음과 같은 이점을 제공한다.
이러한 확장성은 특히 쓰기 작업이 빈번하고 데이터 양이 기하급수적으로 증가하는 타임시리즈 데이터, IoT 센서 데이터, 이벤트 로깅 등의 사용 사례에서 매우 중요한 장점으로 작용한다. 시스템의 성능은 기본적으로 클러스터에 투입된 하드웨어 자원의 총량에 의해 결정된다.
3.3. 다중 데이터센터 지원
3.3. 다중 데이터센터 지원
Apache Cassandra는 지리적으로 분산된 여러 데이터센터에 걸쳐 데이터를 저장하고 관리할 수 있는 기능을 기본적으로 제공한다. 이는 글로벌 서비스를 운영하거나 재해 복구를 위해 설계된 애플리케이션에 필수적인 기능이다. 다중 데이터센터 지원은 클러스터의 논리적 그룹인 랙 인식 및 가용 영역 인식 아키텍처를 기반으로 구축된다. 관리자는 키스페이스를 생성할 때 복제 전략을 정의하며, 특정 데이터센터에 복제본을 몇 개 배치할지 명시할 수 있다.
이 구조의 주요 이점은 지역적 가용성과 내결함성이다. 사용자는 지연 시간을 최소화하기 위해 가장 가까운 데이터센터에서 데이터를 읽고 쓸 수 있다. 한 데이터센터에 장애가 발생하더라도 다른 데이터센터의 복제본을 통해 서비스 중단 없이 요청을 처리할 수 있다. 또한, 데이터센터 간의 데이터 복제는 비동기식 또는 조정된 일관성 수준을 통해 이루어지며, 네트워크 대역폭과 지연 시간을 효율적으로 관리할 수 있다.
운영 측면에서 Cassandra는 데이터센터 간의 네트워크 토폴로지를 자동으로 인식하고 최적화한다. 시드 노드 목록을 구성할 때 각 데이터센터의 노드를 포함시켜 초기 연결을 설정한다. 데이터센터 추가나 제거와 같은 토폴로지 변경은 노드 툴 같은 관리 도구를 사용하여 비교적 쉽게 수행할 수 있으며, 클러스터 전체를 중단시키지 않고 진행할 수 있다.
4. CQL (Cassandra Query Language)
4. CQL (Cassandra Query Language)
CQL은 Apache Cassandra와 상호작용하기 위한 기본 쿼리 언어이다. SQL과 유사한 구문을 가지지만, Cassandra의 분산 아키텍처와 데이터 모델에 맞게 설계되었다. 사용자는 CQL을 통해 키스페이스, 테이블을 생성하고, 데이터를 삽입, 조회, 수정, 삭제할 수 있다. CQL은 명령줄 도구 `cqlsh`나 다양한 프로그래밍 언어용 드라이버를 통해 사용된다.
CQL의 기본 데이터 조작 명령어는 SQL 사용자에게 친숙하다. `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `CREATE`, `DROP` 등의 키워드를 사용한다. 그러나 중요한 차이점이 존재한다. CQL은 조인이나 서브쿼리를 지원하지 않으며, 모든 쿼리는 반드시 파티션 키를 포함해야 효율적으로 수행된다. 데이터는 항상 파티션 내에서 클러스터링 컬럼에 의해 정렬된 상태로 저장된다.
테이블을 설계할 때는 쿼리 패턴을 먼저 고려해야 한다. 아래는 일반적인 CQL 작업의 예시이다.
작업 | 예시 CQL 문 |
|---|---|
키스페이스 생성 | `CREATE KEYSPACE my_keyspace WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};` |
테이블 생성 | `CREATE TABLE users (user_id uuid, name text, email text, PRIMARY KEY (user_id));` |
데이터 삽입 | `INSERT INTO users (user_id, name, email) VALUES (uuid(), 'alice', 'alice@example.com');` |
데이터 조회 | `SELECT * FROM users WHERE user_id = 123e4567-e89b-12d3-a456-426614174000;` |
인덱스 생성 | `CREATE INDEX ON users (email);` |
CQL은 또한 컬렉션 데이터 타입(`list`, `set`, `map`), 사용자 정의 타입, 배치 문, TTL 설정과 같은 고급 기능을 제공한다. 버전이 발전함에 따라 JSON 지원, 사용자 정의 함수, 집계 함수 등의 기능이 추가되었다. CQL의 문법은 Cassandra의 내부 저장 구조를 추상화하지만, 성능 최적화를 위해서는 기본적인 저장 모델을 이해하는 것이 필수적이다.
4.1. 기본 구문
4.1. 기본 구문
CQL은 SQL과 유사한 구문 구조를 가지지만, NoSQL 데이터베이스인 Apache Cassandra의 특성에 맞춰 제한적이고 특화된 명령어 집합을 제공한다. 기본적인 데이터 조작 언어(DML)로는 `SELECT`, `INSERT`, `UPDATE`, `DELETE`가 있으며, 데이터 정의 언어(DDL)로는 `CREATE KEYSPACE`, `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE` 등이 있다. 쿼리는 대소문자를 구분하지 않으며, 일반적으로 키워드는 대문자, 사용자 정의 식별자는 소문자로 작성하는 관례를 따른다.
데이터 조회를 위한 `SELECT` 문의 기본 형식은 다음과 같다. `WHERE` 절은 필수적이며, 파티션 키 전체와 클러스터링 컬럼의 일부 또는 전체에 대한 조건을 지정해야 한다. 클러스터링 컬럼에 대한 범위 쿼리(`>`, `<`, `BETWEEN`)는 허용되지만, 파티션 키에 대한 범위 쿼리는 허용되지 않는다.
```sql
SELECT column1, column2 FROM keyspace_name.table_name
WHERE partition_key = 'value' AND clustering_column > 100;
```
데이터를 삽입하거나 갱신하는 `INSERT`와 `UPDATE` 문은 존재하지 않는 로우에 대해 `INSERT`를 사용하면 새 로우가 생성되고, 존재하는 로우에 대해 `UPDATE`를 사용하면 해당 로우가 수정된다. 두 명령어 모두 UPSERT 방식으로 동작하여, 동일한 기본 키를 가진 로우가 이미 존재하면 값을 덮어쓴다. `DELETE` 문은 특정 컬럼의 값을 삭제하거나 전체 로우를 삭제할 수 있다.
CQL은 또한 `GROUP BY`, `ORDER BY`, 집계 함수와 같은 기능을 지원하지만 제한 사항이 있다. `ORDER BY`는 클러스터링 컬럼에 대해서만 사용할 수 있으며, 저장된 순서의 역순으로 정렬하는 것이 기본이다. 집계 함수는 `COUNT()`, `SUM()`, `AVG()` 등을 포함하지만, `GROUP BY`와 함께 사용할 때는 파티션 키로만 그룹화할 수 있다. 조인이나 서브쿼리는 지원하지 않는다.
4.2. 테이블 생성과 조작
4.2. 테이블 생성과 조작
CQL에서 테이블은 데이터를 저장하는 기본 구조이다. `CREATE TABLE` 문을 사용하여 테이블을 생성하며, 기본 키, 클러스터링 컬럼, 데이터 타입을 정의해야 한다. 기본 키는 파티션 키와 선택적인 클러스터링 컬럼으로 구성되어 데이터의 물리적 배치와 정렬 순서를 결정한다[2].
테이블을 조작하는 주요 작업은 다음과 같다.
작업 | CQL 키워드 | 주요 목적 및 특징 |
|---|---|---|
생성 | `CREATE TABLE` | 새로운 테이블과 그 스키마를 정의한다. |
변경 | `ALTER TABLE` | 컬럼 추가/삭제, 테이블 속성 변경을 수행한다. |
삭제 | `DROP TABLE` | 테이블과 그 모든 데이터를 영구적으로 제거한다. |
자르기 | `TRUNCATE TABLE` | 테이블의 모든 데이터를 빠르게 삭제하지만, 스키마는 유지한다. |
데이터 조작은 `INSERT`, `UPDATE`, `DELETE`, `SELECT` 문으로 이루어진다. Apache Cassandra는 로그 구조화 병합 트리 저장 엔진을 사용하므로, `UPDATE`와 `INSERT` 연산은 본질적으로 유사하다. 기존 행에 동일한 파티션 키와 클러스터링 키로 데이터를 삽입하면 해당 데이터는 덮어쓰여진다. `DELETE` 연산은 실제로 데이터를 즉시 지우지 않고 '삭제 표시'를 남기며, 이후 압축 과정에서 제거된다.
테이블 설계 시 쿼리 패턴을 먼저 고려하는 것이 중요하다. Apache Cassandra는 관계형 데이터베이스와 달리 조인이나 복잡한 서브쿼리를 지원하지 않으므로, 데이터 중복을 허용하고 쿼리 효율성을 위해 비정규화된 테이블 구조를 흔히 사용한다. 또한, 대량의 데이터를 한 번에 읽거나 쓰는 작업에 적합하도록 파티션 키를 설계하여 '핫스팟'을 방지해야 한다.
5. 설치와 구성
5. 설치와 구성
Apache Cassandra를 설치하고 구성하는 과정은 단일 노드 개발 환경부터 다중 노드 프로덕션 클러스터까지 목표에 따라 다르게 진행된다. 일반적인 절차는 공식 웹사이트에서 배포판을 다운로드하고, 환경 변수를 설정한 후, 구성 파일을 편집하여 실행하는 방식이다. 핵심 구성 파일은 `cassandra.yaml`로, 클러스터 이름, 시드 노드 목록, 데이터 및 로그 디렉토리, RPC 및 CQL 포트, JVM 힙 메모리 크기 등을 이 파일에서 정의한다. 운영 체제에 따라 패키지 관리자를 통한 설치도 가능하다[3].
시스템 요구사항 측면에서 Cassandra는 Java 런타임 환경 (JRE 8 또는 11)을 필요로 한다. 디스크 공간은 데이터 볼륨에 따라 결정되며, SSD 사용이 성능에 유리하다. 메모리는 최소 8GB 이상을 권장하며, 프로덕션 환경에서는 16GB 이상이 적합하다. 네트워크 설정은 노드 간 통신을 위해 필수적이며, 방화벽에서 필요한 포트(기본적으로 7000, 7001, 9042 등)를 열어야 한다.
클러스터 설정은 `cassandra.yaml` 파일의 `cluster_name`, `seeds`, `listen_address`, `rpc_address` 등의 파라미터를 조정하여 이루어진다. 시드 노드는 클러스터 내 다른 노드를 발견하는 데 사용되는 특별한 노드들이다. 초기 클러스터는 첫 번째 노드를 시드로 설정하여 시작하고, 새 노드를 추가할 때 기존 시드 노드의 IP 주소를 새 노드의 `seeds` 목록에 지정하면 된다. 토큰 할당 방식은 기본적으로 vnode(가상 노드)를 사용하며, 이는 데이터 분배와 재조정을 자동화한다.
구성 요소 | 설명 | 기본값/권장 예시 |
|---|---|---|
클러스터 이름 | 논리적 클러스터 식별자 | `Test Cluster` |
시드 노드(seeds) | 노드 발견을 위한 접점 | `127.0.0.1` (단일 노드) |
listen_address | 다른 노드와 통신할 IP | `localhost` |
rpc_address | 클라이언트 연결을 수신할 IP | `localhost` |
endpoint_snitch | 네트워크 토폴로지 인식 방식 | `SimpleSnitch` |
개발 환경에서는 단일 노드로 로컬에 빠르게 설치하여 테스트할 수 있지만, 프로덕션 환경에서는 여러 물리적 서버에 걸쳐 노드를 배포하고, 스니치를 `GossipingPropertyFileSnitch`와 같은 방식으로 변경하여 랙 및 데이터센터 인식 기능을 활용하는 것이 일반적이다. 설치 후 `nodetool status` 명령어를 통해 클러스터의 상태와 노드 참여 여부를 확인할 수 있다.
5.1. 시스템 요구사항
5.1. 시스템 요구사항
Apache Cassandra를 실행하기 위한 최소 및 권장 시스템 요구사항은 클러스터의 규모와 예상되는 워크로드에 따라 달라진다. 일반적인 프로덕션 환경을 기준으로 한다.
하드웨어 측면에서는 최소 2개 이상의 CPU 코어와 8GB 이상의 RAM을 권장한다. 디스크는 쓰기 집약적인 워크로드 특성상 높은 IOPS를 제공하는 SSD를 사용하는 것이 성능에 유리하다. 네트워크는 노드 간 통신과 데이터 복제에 중요하므로 지연 시간이 낮고 대역폭이 넓은 기가비트 이더넷 이상의 환경이 필요하다.
소프트웨어 요구사항으로는 주로 자바 가상 머신이 필요하다. Cassandra는 자바로 작성되었으며, 일반적으로 최신 LTS 버전의 OpenJDK 8 또는 11을 사용한다. 운영체제는 리눅스 배포판(예: 우분투, RHEL, 센트OS)이 가장 일반적이며, macOS와 윈도우에서도 개발 및 테스트 목적으로 실행할 수 있다. 파일 시스템은 ext4 또는 XFS와 같은 저널링 파일 시스템을 권장한다.
5.2. 클러스터 설정
5.2. 클러스터 설정
Apache Cassandra 클러스터는 동일한 애플리케이션 데이터를 공유하는 하나 이상의 노드로 구성된다. 클러스터 설정의 첫 단계는 `cassandra.yaml`이라는 주요 구성 파일을 각 노드에서 수정하는 것이다. 이 파일에서 필수적으로 설정해야 하는 항목은 클러스터 이름(`cluster_name`), 각 노드의 IP 주소(`listen_address` 및 `rpc_address`), 그리고 클러스터 내 다른 노드들과의 통신을 위한 시드 노드 목록(`seeds`)이다. 시드 노드는 새로운 노드가 클러스터에 조인할 때 연락하는 초기 접점 역할을 하며, 모든 노드의 시드 목록은 동일해야 한다.
클러스터를 초기화하는 일반적인 절차는 다음과 같다.
1. 시드 노드로 지정할 하나 이상의 노드에서 Cassandra 서비스를 시작한다.
2. 나머지 노드들을 하나씩 시작하여, 시드 노드를 통해 기존 클러스터에 자동으로 조인하도록 한다.
3. `nodetool status` 명령어를 사용하여 모든 노드가 정상적으로 클러스터에 참여했는지와 그 상태(Up/Down)를 확인한다.
클러스터의 토폴로지를 정의하는 중요한 요소는 스니치이다. 스니치는 네트워크 토폴로지를 인식하고 노드 간의 최적의 라우팅 경로를 결정하는 구성 요소이다. 기본값인 `SimpleSnitch`는 단일 데이터센터에 적합하지만, 다중 데이터센터나 복잡한 네트워크 환경에서는 `GossipingPropertyFileSnitch`나 `Ec2Snitch`(AWS 환경용)와 같은 다른 스니치를 선택해야 한다. 스니치 선택은 데이터 센터와 랙 정보를 정의하는 방식에 직접적인 영향을 미치며, 이는 복제 전략이 데이터를 물리적으로 분산시키는 방식을 결정하는 기초가 된다.
초기 클러스터 구성 후에는 키스페이스와 테이블을 생성할 때 복제 전략과 복제 계수를 신중하게 설정해야 한다. 이 설정은 데이터의 내구성과 가용성을 보장하는 핵심이다. 또한, 운영 중에도 `nodetool` 유틸리티를 사용하여 노드 추가, 제거, 교체 등의 유지보수 작업을 수행할 수 있다.
6. 운영과 모니터링
6. 운영과 모니터링
Apache Cassandra 클러스터의 안정적인 운영을 위해서는 정기적인 유지보수 작업과 체계적인 모니터링이 필수적이다. 주요 유지보수 작업으로는 노드 추가/제거, 압축, 복구 등이 있다. 새로운 노드를 클러스터에 추가하면 데이터가 자동으로 분배되며, 노드를 제거할 때는 `nodetool decommission` 또는 `nodetool removenode` 명령을 사용한다. 데이터의 조각화를 방지하고 읽기 성능을 최적화하기 위해 주기적으로 압축 작업이 수행된다. 또한 노드 장애 시 `nodetool repair` 명령을 이용한 안티엔트로피 복구를 실행하여 데이터 일관성을 유지한다.
성능 튜닝은 쓰기 및 읽기 처리량, 지연 시간을 개선하는 데 중점을 둔다. 핵심 요소는 메모리 테이블, 커밋 로그, 캐시 설정이다. `memtable_flush_writers`와 `concurrent_compactors` 같은 파라미터를 조정하여 쓰기 부하를 효율적으로 처리할 수 있다. 읽기 성능은 행 캐시와 키 캐시의 크기를 적절히 조절하고, 쿼리에서 필요한 컬럼만 지정하는 방식으로 최적화한다. 또한 일관성 수준을 애플리케이션 요구사항에 맞게 조정(예: `ONE` vs `QUORUM`)하는 것이 지연 시간에 큰 영향을 미친다.
모니터링은 `nodetool` 유틸리티와 JMX를 통해 이루어진다. 주요 지표는 다음과 같다.
모니터링 카테고리 | 주요 지표 (예시) | 도구/명령어 |
|---|---|---|
클러스터 상태 | 노드 Up/Down 상태, 데이터 소유량 | `nodetool status`, `nodetool netstats` |
성능 | 쓰기/읽기 지연 시간, 처리량, 대기 중인 작업 | `nodetool tpstats`, JMX 메트릭 |
저장소 | 디스크 사용량, 압축 진행 상황 | `nodetool tablestats`, `nodetool compactionstats` |
가비지 컬렉션 | GC 일시 정지 시간 및 빈도 | JVM 메트릭 (예: GC 로그) |
이러한 지표를 지속적으로 추적하고 시각화 도구(예: Grafana with Prometheus)와 연동하면 잠재적인 문제를 사전에 발견하고 용량 계획을 수립하는 데 도움이 된다.
6.1. 유지보수 작업
6.1. 유지보수 작업
Apache Cassandra 클러스터의 안정적인 운영을 위해서는 정기적인 유지보수 작업이 필수적이다. 주요 작업에는 노드 추가/제거, 데이터 재조정, 스냅샷 생성 및 백업, 로그 관리, 그리고 압축 작업 모니터링 등이 포함된다.
노드 운영 측면에서, 클러스터의 규모를 조정하는 것은 일반적인 작업이다. 새 노드를 추가하면 Cassandra는 자동으로 클러스터 전체에 걸쳐 데이터의 일부를 새 노드로 이동시키는 재조정 과정을 시작한다. 반대로 노드를 안전하게 제거하려면 `nodetool decommission` 또는 `nodetool removenode` 명령을 사용하여 데이터를 다른 노드로 마이그레이션한 후 종료해야 한다. 또한, 노드의 일시적 중단 후 재시작 시에는 `nodetool repair` 명령을 실행하여 데이터 일관성을 복구하는 것이 권장된다.
데이터 보호와 관리 작업도 중요하다. `nodetool snapshot` 명령을 사용하면 특정 키스페이스나 테이블의 시점 일관성 있는 백업을 생성할 수 있다. 생성된 스냅샷 파일은 외부 저장소로 복사하여 보관한다. 오래된 스냅샷은 `nodetool clearsnapshot`으로 정리하여 디스크 공간을 확보할 수 있다. 동시에, Cassandra의 핵심 메커니즘인 압축 작업은 주기적으로 실행되어 SSTable 파일을 병합하고 삭제된 데이터를 정리한다. `nodetool compactionstats`와 `nodetool tablestats` 명령으로 압축 상태와 테이블별 디스크 사용량을 모니터링해야 한다.
작업 유형 | 주요 명령어/도구 | 목적 |
|---|---|---|
노드 추가 | `nodetool status`, 재조정 자동 실행 | 클러스터 용량 확장 |
노드 제거 | `nodetool decommission` | 클러스터에서 노드 안전하게 이탈 |
데이터 복구 | `nodetool repair` | 노드 간 데이터 일관성 보정 |
백업 생성 | `nodetool snapshot` | 시점 백업 생성 |
백업 정리 | `nodetool clearsnapshot` | 오래된 스냅샷 파일 삭제 |
상태 모니터링 | `nodetool compactionstats`, `nodetool tablestats` | 압축 진행상황 및 디스크 사용량 확인 |
이러한 작업들은 대부분 nodetool 유틸리티를 통해 수행되며, 운영 중인 서비스에 미치는 영향을 최소화하기 위해 비즈니스 부하가 적은 시간대에 계획적으로 실행하는 것이 좋다.
6.2. 성능 튜닝
6.2. 성능 튜닝
성능 튜닝은 Apache Cassandra 클러스터의 처리량을 높이고 지연 시간을 줄이는 데 중점을 둔다. 핵심 접근 방식은 읽기 경로와 쓰기 경로를 분석하여 병목 현상을 식별하고, 데이터 모델을 검토하며, JVM 가비지 컬렉션과 컴팩션 전략을 최적화하는 것이다. 성능 문제는 주로 잘못된 데이터 모델링, 비효율적인 쿼리, 또는 부적절한 하드웨어 리소스에서 비롯된다.
읽기 성능을 개선하기 위해서는 일관성 수준을 적절히 조정하고, 필요한 컬럼만 선택하는 쿼리를 사용해야 한다. ALLOW FILTERING 절의 남용은 피해야 한다. 자주 조회되는 데이터에 대해서는 머티리얼라이즈드 뷰나 보조 인덱스를 고려할 수 있으나, 인덱스는 카디널리티가 낮은 컬럼에만 적합하다[4]. 쓰기 성능은 주로 메모테이블과 SSTable의 플러시, 컴팩션에 영향을 받는다. 적절한 컴팩션 전략(예: SizeTieredCompactionStrategy, LeveledCompactionStrategy)을 선택하고, 배치 쓰기의 크기를 관리하는 것이 중요하다.
하드웨어 및 구성 측면에서는 힙 메모리 크기를 적절히 설정하여 장시간 GC 정지가 발생하지 않도록 해야 한다. 캐시 설정(`key_cache`, `row_cache`)도 성능에 큰 영향을 미친다. 모니터링 도구를 통해 주요 메트릭을 지속적으로 관찰해야 한다.
튜닝 요소 | 주요 목표 | 고려 사항 및 도구 |
|---|---|---|
데이터 모델 | 파티션 크기 제어, 핫스팟 방지 | 파티션 키 설계, 클러스터링 컬럼 활용 |
쿼리 | 효율적인 읽기 경로 구성 | 일관성 수준 조정, SELECT 컬럼 제한, ALLOW FILTERING 회피 |
쓰기 처리 | 안정적인 메모테이블 플러시 | 배치 크기, 컴팩션 전략 선택(STCS, LCS) |
JVM/메모리 | 가비지 컬렉션 오버헤드 최소화 | 힙 크기 설정, GC 로그 모니터링 |
모니터링 | 병목 현실 실시간 식별 | `nodetool` 명령어, JMX 메트릭, 시각화 대시보드 |
성능 튜닝은 반복적인 프로세스이다. 변경 사항을 적용한 후에는 `nodetool cfstats`, `nodetool proxyhistograms` 같은 명령어나 JMX 메트릭을 통해 성능 지표를 측정하고 그 영향을 평가해야 한다.
7. 사용 사례
7. 사용 사례
Apache Cassandra는 분산 데이터베이스의 특성상 특정 유형의 워크로드에 매우 적합하지만, 다른 유형의 작업에는 부적합할 수 있다. 그 사용 사례는 주로 데이터 모델과 시스템의 핵심 설계 목표에 의해 결정된다.
적합한 시나리오
Cassandra는 쓰기 처리량이 높고, 데이터가 시간 순서로 생성되며, 지리적으로 분산된 여러 데이터센터에 걸쳐 복제와 고가용성이 요구되는 경우에 탁월한 성능을 발휘한다. 대표적인 사용 사례로는 시계열 데이터 처리(예: IoT 센서 데이터, 애플리케이션 로그, 금융 거래 기록), 실시간 분석, 메시징 시스템, 사용자 활동 추적, 추천 시스템의 백엔드 저장소 등이 있다. 또한, 소셜 미디어 플랫폼에서 사용자 프로필, 타임라인, 상태 업데이트와 같이 쓰기 빈도가 높고 읽기는 최신 데이터에 집중되는 경우에도 널리 사용된다. 이는 Cassandra가 제공하는 선형적인 수평적 확장성과 다중 데이터센터 지원 덕분에 가능하다.
부적합한 시나리오
반면, 복잡한 조인 연산, 다중 레코드에 걸친 ACID 트랜잭션, 또는 빈번한 임시 애드혹 쿼리가 필요한 애플리케이션에는 적합하지 않다. Cassandra의 데이터 모델은 쿼리를 먼저 설계하고, 그에 맞춰 테이블을 구조화하는 방식을 취하기 때문이다. 또한, 집계 연산이나 복잡한 보고서 생성과 같은 OLAP 성격의 작업보다는 OLTP 성격의 실시간 운영 처리에 더 최적화되어 있다. 강력한 일관성이 절대적으로 필요한 핵심 금융 결제 시스템이나, 데이터 크기가 작고 관계형 모델이 명확한 전통적인 CRUD 애플리케이션에서는 관계형 데이터베이스 관리 시스템이나 다른 NoSQL 데이터베이스가 더 나은 선택일 수 있다.
적합한 시나리오 | 부적합한 시나리오 |
|---|---|
고속 쓰기 및 시계열 데이터 | 복잡한 조인과 관계형 쿼리 |
높은 가용성과 내결함성 요구 | 강한 일관성과 복잡한 트랜잭션 요구 |
지리적으로 분산된 데이터 배포 | 단일 데이터센터 내 중앙 집중식 배포 |
선형적 수평 확장 필요 | 데이터 볼륨이 작고 스키마가 고정적 |
주로 파티션 키 기반의 예측 가능한 읽기 | 비정형적이고 임시적인 애드혹 쿼리 |
7.1. 적합한 시나리오
7.1. 적합한 시나리오
Apache Cassandra는 특정한 데이터 패턴과 요구 사항을 가진 시나리오에서 빛을 발한다. 특히 쓰기 작업이 많고, 데이터가 시간 순서로 생성되며, 낮은 지연 시간의 읽기가 필요한 경우에 적합하다. 대규모 사용자 활동 로그, 센서 데이터, 사물인터넷 디바이스의 텔레메트리 데이터, 실시간 분석 플랫폼의 이벤트 스트림 저장 등이 대표적이다.
또한, 지리적으로 분산된 아키텍처가 필수적인 애플리케이션에 매우 효과적이다. 다중 데이터센터 지원 기능을 통해 자연 재해나 지역 정전과 같은 상황에서도 서비스를 지속할 수 있는 고가용성을 제공한다. 이는 글로벌 사용자 기반을 가진 소셜 미디어 플랫폼, 온라인 게임, 금융 서비스 및 전자상거래 애플리케이션의 프로필 데이터, 사용자 세션, 카탈로그 정보 등을 저장하는 데 적합하게 만든다.
다음 표는 Apache Cassandra가 특히 잘 맞는 몇 가지 구체적인 사용 사례를 정리한 것이다.
사용 사례 분야 | 설명 | 적합한 이유 |
|---|---|---|
시계열 데이터 | 센서 데이터, 모니터링 메트릭, 주가 틱 데이터 | 시간 기반의 순차적 쓰기에 최적화된 저장 구조[5]. |
이벤트 로깅 | 사용자 클릭스트림, 애플리케이션 로그, 감사 로그 | 높은 쓰기 처리량과 선형 확장성으로 대량 로그 수집 가능. |
메시지 인박스 | 웹 메일 서비스, 메시징 앱의 사용자별 메시지 저장 | 사용자 ID를 파티션 키로 한 효율적인 데이터 분산 및 조회. |
제품 카탈로그 | 대규모 전자상거래 사이트의 상품 정보 | 여러 데이터센터에 걸쳐 항상 사용 가능한 읽기 전용 데이터 제공. |
실시간 추천 | 사용자 행동 기반의 실시간 개인화 추천 엔진 | 빠른 쓰기를 통한 실시간 선호도 업데이트와 낮은 지연 시간 읽기. |
이러한 시나리오들은 공통적으로 데이터 모델이 비교적 단순하고, 조인이 빈번하지 않으며, 사전에 정의된 접근 패턴(주로 파티션 키를 통한 조회)을 따르는 특징을 가진다. Cassandra는 이러한 조건 하에서 예측 가능한 성능과 확장성을 제공한다.
7.2. 부적합한 시나리오
7.2. 부적합한 시나리오
Apache Cassandra는 특정 설계 목표와 데이터 모델에 최적화되어 있어, 모든 유형의 워크로드에 적합하지는 않습니다. 특히 ACID 트랜잭션의 완전한 보장, 복잡한 조인 연산, 또는 실시간 애널리틱스 쿼리가 주요 요구사항인 경우에는 사용을 권장하지 않습니다.
Cassandra는 기본적으로 결과적 일관성 모델을 따르며, 강력한 일관성을 위해 일관성 수준을 높게 설정하면 지연 시간이 증가하고 가용성이 희생될 수 있습니다. 따라서 은행 계좌 이체나 재고 관리처럼 정확한 실시간 잔액과 트랜잭션 롤백이 필수적인 OLTP 시스템에는 적합하지 않습니다. 또한, 칼럼 패밀리 기반의 와이드 로우 데이터 모델은 여러 테이블 간의 관계를 효율적으로 표현하기 어렵습니다. 복잡한 조인이나 임시적인 애드혹 쿼리가 빈번한 비즈니스 인텔리전스 또는 보고 시스템에서는 관계형 데이터베이스나 데이터 웨어하우스가 더 나은 선택입니다.
데이터 접근 패턴이 명확하게 정의되지 않거나, 주로 단일 레코드의 전체 업데이트가 빈번하게 발생하는 시나리오도 Cassandra에 부적합합니다. Cassandra는 쓰기 시 전체 레코드를 덮어쓰는 방식으로 동작하기 때문에, 큰 로우의 일부 칼럼만 자주 변경해야 한다면 비효율적입니다. 마지막으로, 데이터 세트가 매우 작아 단일 서버로 충분히 처리 가능하고, 고가용성이나 지리적 분산이 필요하지 않은 간단한 애플리케이션에서는 운영의 복잡성을 정당화하기 어렵습니다. 이러한 경우 MySQL이나 PostgreSQL 같은 단일 인스턴스 관계형 데이터베이스가 더 실용적인 해결책이 될 수 있습니다.
8. 대안 기술 비교
8. 대안 기술 비교
Apache Cassandra는 특정한 설계 목표를 가진 NoSQL 데이터베이스로, 다른 데이터 저장 기술과 비교하여 뚜렷한 장단점을 가진다.
다른 NoSQL 데이터베이스와의 비교
주요 NoSQL 데이터베이스들은 데이터 모델과 일관성 접근 방식에 따라 차이를 보인다. Cassandra는 칼럼 패밀리 기반의 와이드 칼럼 스토어이며, 마스터리스 링 구조와 최종적 일관성 모델을 특징으로 한다. 이는 문서 지향 데이터베이스인 MongoDB나 키-값 스토어인 Redis와 구분된다. 특히 분산 트랜잭션이나 복잡한 조인을 필요로 하는 작업에는 적합하지 않다. Apache HBase와 유사한 카테고리에 속하지만, HBase가 Hadoop HDFS에 의존하는 반면, Cassandra는 자체적인 분산 스토리지 계층을 가지며 쓰기 성능과 다중 데이터센터 지원에 더 강점을 보인다.
관계형 데이터베이스(RDBMS)와의 차이
전통적인 관계형 데이터베이스(RDBMS)와의 근본적인 차이는 데이터 모델과 ACID 속성에 대한 접근법에 있다. RDBMS는 정규화된 테이블 구조와 강력한 스키마, SQL을 통한 복잡한 쿼리와 조인을 지원한다. 반면 Cassandra는 분산 시스템에서의 선형 확장성과 고가용성을 최우선으로 설계되었다. 이로 인해 강한 일관성(Strong Consistency)보다는 가용성과 분할 내성을 우선시하는 CAP 정리의 AP(Available, Partition-tolerant) 시스템에 가깝다. 트랜잭션은 단일 행 수준에서만 원자성을 보장하며, 테이블 조인이나 서브쿼리 같은 기능은 제공하지 않는다.
다음 표는 주요 데이터베이스 유형과의 핵심 차이점을 요약한다.
특성 | Apache Cassandra | 전통적 RDBMS (예: PostgreSQL) | 문서형 NoSQL (예: MongoDB) |
|---|---|---|---|
데이터 모델 | 와이드 칼럼 스토어 (칼럼 패밀리) | 관계형 테이블 | JSON 형태의 문서 |
스키마 | 유연하지만 정의 필요 | 엄격하고 고정적 | 동적 스키마 가능 |
확장성 | 수평적(선형) 확장 | 주로 수직적 확장 | 수평적 확장 가능 |
일관성 접근법 | 튜너블 일관성 (최종적 일관성 지향) | 강한 일관성 (ACID) | 강한 일관성 또는 최종적 일관성 구성 가능 |
주요 강점 | 쓰기 처리량, 가용성, 다중 DC | 복잡한 쿼리, 조인, 데이터 무결성 | 개발 유연성, 중첩 데이터 구조 |
주요 약점 | 복잡한 쿼리/조인 부재, 읽기 시 데이터 정합성 지연 | 수평 확장의 복잡성, 쓰기 병목 | 매우 큰 규모에서의 일관성 유지 비용 |
8.1. 다른 NoSQL 데이터베이스
8.1. 다른 NoSQL 데이터베이스
Apache Cassandra는 NoSQL 데이터베이스 시장에서 분산 데이터베이스와 열 지향 데이터베이스 카테고리의 대표주자로 꼽힌다. 주요 경쟁자 및 대안으로는 문서 지향 데이터베이스, 키-값 저장소, 그래프 데이터베이스 등 다른 데이터 모델을 채택한 시스템들이 있다.
데이터베이스 | 주요 데이터 모델 | 강점 | 주요 사용 사례 |
|---|---|---|---|
열 지향 (BigTable 계열) | 역사적 데이터 기록, 로그 분석 | ||
문서 지향 | 유연한 JSON 형식 스키마, 풍부한 쿼리 언어, 강력한 2차 인덱스 | 콘텐츠 관리, 사용자 프로필, 실시간 분석 | |
키-값 및 문서 | 완전 관리형 서비스, 예측 가능한 성능, 자동 확장 | 웹 애플리케이션 백엔드, 게임 리더보드, IoT | |
인메모리 키-값 저장소 | 극도의 저지연, 다양한 데이터 구조(리스트, 셋 등) 지원 | 세션 저장소, 캐싱, 실시간 순위표 | |
열 지향 (BigTable 계열) | 역사적 데이터 기록, 로그 분석 |
Cassandra와의 핵심 차이는 데이터 모델과 일관성 접근법에서 나타난다. MongoDB 같은 문서 데이터베이스는 복잡한 계층적 데이터를 단일 문서에 저장하는 데 적합하며, 강력한 ad-hoc 쿼리를 지원한다. 반면 Cassandra는 매우 높은 쓰기 처리량과 지리적으로 분산된 복제에 최적화되어 있다. Redis는 데이터를 주로 메모리에 저장해 마이크로초 단위의 응답 시간을 제공하지만, 데이터 세트 크기가 물리적 메모리 용량에 제한을 받는다. DynamoDB는 클라우드 환경에서의 완전 관리형 경쟁자로서, 운영 부담을 줄이지만 벤더 종속성을 초래한다.
선택은 애플리케이션의 요구사항에 따라 결정된다. 쓰기 중심의 대규모 시간序列 데이터, 여러 데이터센터에 걸친 고가용성이 필요하면 Cassandra가 강력한 후보다. 복잡한 트랜잭션, 강력한 일관성, 또는 관계형 조인이 핵심이라면 관계형 데이터베이스 관리 시스템이나 NewSQL 데이터베이스를 고려한다. 데이터 관계 탐색이 주된 작업이라면 Neo4j 같은 그래프 데이터베이스가 더 적합한 선택이 될 수 있다.
8.2. 관계형 데이터베이스와의 차이
8.2. 관계형 데이터베이스와의 차이
Apache Cassandra와 관계형 데이터베이스(RDBMS)는 데이터를 저장하고 관리하는 방식에서 근본적인 차이를 보인다. 가장 큰 차이는 데이터 모델에 있다. 관계형 데이터베이스는 정규화된 테이블과 SQL을 사용하며, 고정된 스키마와 ACID 트랜잭션을 통해 데이터 무결성을 보장한다. 반면 카산드라는 컬럼 패밀리 기반의 유연한 스키마를 가지며, CQL을 사용하지만 조인이나 서브쿼리와 같은 복잡한 관계형 연산은 지원하지 않는다. 데이터는 주로 비정규화되어 저장되어 읽기 성능을 최적화한다.
확장성과 아키텍처 측면에서도 대비된다. 관계형 데이터베이스는 전통적으로 수직 확장(Scale-up)에 의존하며, 단일 마스터 노드에서 쓰기를 처리하는 경우가 많다. 카산드라는 마스터리스 아키텍처를 채택한 진정한 수평 확장(Scale-out) 시스템이다. 모든 노드가 동등하며, 데이터는 클러스터 전체에 자동으로 분산되고 복제된다. 이 설계는 단일 장애점을 제거하고 선형에 가까운 확장성을 가능하게 한다.
일관성과 가용성의 우선순위에서도 차이가 나타난다. 관계형 데이터베이스는 일반적으로 강력한 일관성을 제공하여 모든 읽기가 가장 최근의 쓰기를 반영하도록 보장한다. 카산드라는 CAP 정리에서 가용성(A)과 분할 내성(P)을 선택하며, 최종적 일관성 모델을 따른다. 사용자는 일관성 수준을 응용 프로그램 요구사항에 따라 조정할 수 있어, 높은 가용성과 낮은 지연 시간을 희생하지 않고도 특정 수준의 일관성을 보장할 수 있다.
비교 항목 | 관계형 데이터베이스 (RDBMS) | Apache Cassandra |
|---|---|---|
데이터 모델 | 정규화된 테이블, 고정 스키마 | 컬럼 패밀리, 유연한 스키마 |
쿼리 언어 | SQL (조인, 서브쿼리 지원) | CQL (제한된 관계형 연산) |
확장 방식 | 주로 수직 확장 (Scale-up) | 수평 확장 (Scale-out) |
아키텍처 | 마스터-슬레이브 구조 일반적 | 마스터리스 피어-투-피어 구조 |
일관성 모델 | 강력한 일관성 (ACID) | 조정 가능한 일관성 (최종적 일관성) |
쓰기 처리 | 단일 마스터 노드에 집중될 수 있음 | 모든 노드에서 분산 쓰기 가능 |
주요 강점 | 복잡한 쿼리, 데이터 무결성, 트랜잭션 | 고가용성, 내결함성, 대용량 쓰기 처리량 |
