Cassandra와 MongoDB의 차이점은 무엇인가요?

Apache Cassandra와 MongoDB는 데이터를 테이블 형식이 아닌 형식으로 저장하는 두 개의 NoSQL 데이터베이스입니다. Cassandra는 테이블 형식 스토어와 키-값 스토어 간에 하이브리드 설계를 적용한 초기 NoSQL 데이터베이스입니다. 빠른 읽기 및 쓰기 성능이 필요한 애플리케이션을 위한 데이터를 저장하도록 설계되었습니다. 반면 MongoDB는 범용 용도로 구축된 도큐먼트 데이터베이스로, 이진 JSON 또는 BSON이라는 최적화된 JSON 형식으로 비정형 데이터를 저장할 수 있는 유연한 데이터 모델을 기반으로 합니다. MongoDB 데이터베이스는 기능이 풍부하고 직관적인 API를 사용하여 완전한 인덱싱 지원과 복제 기능을 제공합니다.

Apache Cassandra에 대해 읽어보기 »

MongoDB에 대해 읽어보기 »

Cassandra와 MongoDB의 유사점은 무엇인가요?

Apache Cassandra와 MongoDB는 모두 NoSQL 데이터베이스 그룹에 속합니다. NoSQL 데이터베이스는 데이터베이스 스키마 없이 정형, 비정형 및 반정형 데이터를 저장할 수 있습니다.

NoSQL 데이터베이스의 데이터 스토리지는 기존의 관계형 데이터베이스 관리 시스템과 달리 테이블 형식 및 테이블 간의 관계에 따른 제약을 받지 않습니다. 여러 노드에 데이터를 자유롭게 분할하고 복제하여 효율적으로 규모를 조정할 수 있습니다. 

또한 Cassandra와 MongoDB의 초기 버전은 오픈 소스입니다. 따라서 이들 NoSQL 데이터베이스의 소스 코드를 다운로드하여 원하는 대로 구성할 수 있습니다.

Facebook은 Cassandra를 개발한 후 Apache와 함께 오픈 소스 프로젝트로 릴리스했습니다. MongoDB는 MongoDB, Inc. 산하의 소규모 개발자 그룹에 의해 개발되었습니다. 2018년 10월 16일 이전에 릴리스된 MongoDB의 모든 버전은 GNU Affero 일반 공중 사용 허가서에 따라 사용할 수 있습니다.

NoSQL에 대해 읽어보기 »

오픈 소스에 대해 읽어보기 »

데이터 모델의 차이점: Cassandra와 MongoDB

MongoDB와 Apache Cassandra는 모두 NoSQL 데이터베이스이지만 데이터를 저장하고 관리하는 방식이 서로 다릅니다.

Cassandra

Cassandra는 데이터를 키-값 스토어로 저장합니다. 행과 열로 테이블을 정의할 수 있지만 실제 스토리지에는 테이블 구조가 사용되지 않습니다. 대신 와이드 컬럼 지향 데이터베이스 모델을 사용하므로 테이블의 각 행이 서로 다른 열 세트를 가질 수 있습니다.

데이터 유형이나 사용량을 기준으로 열을 열 그룹으로 그룹화할 수 있습니다. 모든 행에는 Cassandra에서 데이터를 빠르게 읽는 데 사용할 수 있는 프라이머리 키가 있습니다.

Apache Cassandra 테이블 구조는 다음 예와 같이 시각화할 수 있습니다.

Customer id 1

Column - Name

Column - Country

 
 

Value - John Doe

Value - United States

 
Customer id 2

Column - Name 

Column - Age

Column - Email

 

Value - Jane Doe

Value - 35

Value - jane_doe@example.com

MongoDB

반면 MongoDB는 최적화된 이진 JSON(BSON) 형식을 사용하여 스키마 없이 데이터를 저장합니다. JSON 객체와 마찬가지로 여러 데이터 유형을 단일 문서에 저장한 다음, BSON으로 직렬화할 수 있습니다.

MongoDB는 구조가 서로 다른 여러 데이터를 포함할 수 있는 컬렉션으로 문서를 구성합니다. 데이터 모델은 유연하며 대량의 비정형 데이터를 처리할 수 있습니다.

다음은 MongoDB에 있는 고객 데이터의 예입니다.

customers:[

{

  customer_id: "1",

  name: “John Doe”,

  country: "United States"

},

{

  customer_id: "2",

  age: “35”

  email: "jane_doe@example.com"

}]

아키텍처의 차이점: Cassandra와 MongoDB

데이터 모델의 차이로 인해 Cassandra와 MongoDB는 몇 가지 데이터베이스 기능을 다르게 구현합니다.

기본 저장 단위

Cassandra에서 정렬된 문자열 테이블(SSTable)은 데이터를 디스크에 저장하는 데 사용되는 기본 저장 단위입니다. SSTable은 특정 열 패밀리(테이블) 및 파티션에 대한 정렬된 키-값 페어 세트를 포함하는 파일입니다. SSTable은 변경할 수 없습니다. 즉, 한 번 쓰여지면 수정할 수 없습니다. 

MongoDB에서 기본 저장 단위는 문서입니다. 문서는 키가 문자열이고 값이 다양한 유형일 수 있는 키-값 페어의 세트입니다. 예를 들어 값은 다른 문서, 배열, 문자열, 숫자, 날짜 및 부울 값일 수 있습니다. 문서는 컬렉션으로 저장됩니다.

쿼리 언어

쿼리 언어는 데이터베이스에서 데이터를 삽입하고 검색하는 데 사용하는 명령문입니다.

Cassandra 쿼리 언어(CQL)는 Cassandra에서 사용하는 쿼리 언어입니다. SQL과 구문 및 구조가 비슷하지만, Apache는 열 패밀리 데이터 모델에서 작동하는 CQL을 개발했습니다.

반면 MongoDB는 명령이 Node.js 명령과 유사한 MongoDB 쿼리 언어(MQL)를 사용합니다. MQL은 생성, 읽기, 업데이트 및 삭제(CRUD) 작업을 지원합니다. MongoDB 쉘에서 MQL 명령을 쓸 수 있습니다.

인덱싱

인덱싱은 데이터베이스에서 데이터 검색 작업의 속도와 효율성을 개선하기 위해 사용되는 기법입니다. 인덱싱에서는 데이터베이스 테이블에 있는 하나 이상의 열 값을 디스크에서 해당 데이터의 물리적 위치에 매핑하는 데이터 구조를 생성합니다.

Cassandra는 다음 두 가지 유형의 인덱스를 지원합니다.

  • 개별 열의 보조 인덱스
  • 여러 열의 SSTable 연결 보조 인덱스(SASI)

SASI 인덱스는 인덱스 데이터를 SSTable에 직접 저장합니다. 많은 수의 고유 값이 있는 열에 대해 범위, 접두사전체 텍스트 검색과 같은 복잡한 쿼리를 지원합니다.

반면 MongoDB는 컬렉션 수준 및 필드 수준에서 인덱싱을 지원합니다. 단일 필드, 복합 및 다중 키와 같은 여러 인덱스 유형을 제공합니다. 또한 다음과 같은 인덱스도 제공합니다.

  • 지리적으로 분산된 데이터를 위한 특수한 지리 공간 인덱스
  • 대용량의 텍스트 데이터에 대한 텍스트 검색 인덱스
  • 수치 데이터에 대한 해싱되고 클러스터화된 인덱스

동시성

데이터베이스에서 동시성이란 여러 사용자 또는 프로세스가 서로 방해하지 않으면서 동시에 데이터베이스에 액세스하고 데이터베이스 트랜잭션을 수행할 수 있는 것을 말합니다. 

Cassandra는 턴테이블 일관성과 행 수준의 원자성을 통해 동시성을 달성합니다. 한 명의 사용자가 한 번에 하나의 행에 대해서만 작업을 수행할 수 있습니다.

턴테이블 일관성을 유지하기 위해 각 복제본 노드는 관련 데이터의 버전 기록을 추적하는 데이터 구조인 벡터 클록을 유지합니다. 쓰기 작업이 수행되면 벡터 클록이 새 버전을 반영하도록 업데이트됩니다. 읽기 작업이 수행되면 Cassandra는 모든 복제본에서 타임스탬프가 가장 높은 버전을 반환하므로, 항상 최신 버전의 데이터가 반환됩니다.

반면 MongoDB는 다중 버전 동시성 제어(MVCC) 메커니즘을 지원합니다. MVCC는 동일한 데이터 문서의 여러 버전이 동시에 존재할 수 있게 합니다. 각 문서에는 업데이트할 때마다 증가하는 고유한 개정 ID가 있습니다. 문서 수준 잠금 및 MVCC는 보다 강력한 동시성 전략을 제공합니다.

가용성

가용성은 서버가 가동 중단되는 동안에도 데이터 운영 중단이 발생하지 않는 것을 의미합니다. Cassandra와 MongoDB는 모두 여러 서버 노드에 데이터를 복제하여 가용성을 보장합니다.

Apache Cassandra에서 클러스터의 각 노드에는 다른 노드의 데이터 복제본이 있습니다. 모든 노드는 데이터를 쓰거나 가져오기 위해 올바른 노드로 읽기를 조정합니다. 동시에 모든 노드에 걸쳐 일관성이 손상된 데이터도 복구합니다. 이는 대규모 환경에서 성능에 영향을 미칠 수 있습니다.

반면 MongoDB는 단일 프라이머리 노드 복제를 사용하여 높은 데이터 가용성을 제공합니다. MongoDB는 복제본 세트에 데이터를 복제합니다. 하나의 프라이머리 노드만 쓰기를 수신하고 다른 노드는 프라이머리 노드의 데이터를 복제하기만 합니다. 하지만 프라이머리 노드는 단일 장애 지점을 생성합니다.

확장성

Cassandra와 MongoDB는 모두 클러스터의 여러 노드에 걸쳐 데이터를 수평으로 분할하는 기술인 샤딩을 허용합니다. 예를 들어 고객이 수천 명인 경우 노드마다 수백 명의 고객 정보만 포함되도록 데이터를 분할합니다. 이렇게 하면 병목 현상 없이 데이터베이스를 규모 조정할 수 있습니다.

Cassandra는 일관된 해싱이라는 분산 해시 알고리즘을 사용하여 특정 데이터 값을 저장할 노드를 결정합니다. 또한 Cassandra는 단일 물리적 노드가 여러 데이터 범위를 가질 수 있도록 하는 가상 노드(vnode)를 지원합니다.

반면 MongoDB는 샤딩 키를 사용하여 데이터 값이 저장될 수 있는 위치를 식별합니다. 데이터베이스 관리자는 데이터를 분할하는 샤딩 키를 정의할 수 있습니다. 지리적 위치, 알파벳순 또는 데이터 세트에 가장 효율적인 다른 시스템과 같은 요소를 기준으로 데이터를 나눌 수 있습니다.

사용 사례: Cassandra vs. MongoDB

가동 시간의 비율이 높고 분산 아키텍처를 기반으로 하는 Cassandra는 고가용성 요구 사항에 적합합니다. MongoDB는 문서 중심의 접근 방식으로 비정형 데이터를 처리할 수 있으므로 데이터가 지속적으로 변경되는 시스템에 유용합니다. 

둘 중 하나를 선택할 때 고려해야 할 몇 가지 요소는 다음과 같습니다.

데이터 형식

Apache Cassandra의 데이터 스토리지 시스템은 MongoDB보다 더 구조화되어 있습니다. 작업 중인 데이터가 고정된 형식인 경우 Cassandra가 더 적합합니다.

반면 데이터가 더 동적이고 일관된 구조가 아닌 경우 MongoDB가 더 적합합니다.

가용성

MongoDB에는 프라이머리 노드와 일련의 복제본이 있습니다. 프라이머리 노드가 가동 중단되면 MongoDB가 대체할 복제본 노드를 선택하는 데 몇 분이 걸립니다. 이로 인해 약간의 가동 중지 시간이 발생할 수 있습니다.

Cassandra는 다수의 프라이머리 노드가 있는 분산 노드 시스템을 사용하므로 100%의 가동 시간이 보장됩니다. 

확장성

MongoDB는 규모를 조정하면서 사용자에게 더 많은 제어권을 제공합니다. 요구 사항에 따라 노드 간에 데이터를 분할하는 방법을 결정하고, 고도로 분산된 데이터베이스를 대규모로 관리할 수 있습니다.

Cassandra의 성능은 데이터 값에 따라 대규모 환경에서 약간 떨어질 수 있습니다.

쿼리 언어

Cassandra 쿼리 언어(CQL)와 MongoDB 쿼리 언어(MQL)는 모두 매우 효과적인 쿼리 언어입니다. 하지만 CQL은 SQL과 훨씬 더 유사하므로 이미 SQL에 능숙한 사용자라면 손쉽게 CQL을 사용할 수 있습니다.

MQL은 구현 방식과 구문이 다르며 익히기가 더 까다로울 수 있습니다.

프로그래밍 언어 지원

MongoDB는 C, C++, C#, Go, Java, Node.js, PHP, Python, Ruby, Rust, Scala, Swift 등, 12가지 프로그래밍 언어를 지원합니다.

Cassandra는 Java, JavaScript, Perl, Ruby, Scala, C#, Erlang, PHP, Python 등 더 적은 수의 언어를 지원합니다.

차이점 요약: Cassandra와 MongoDB

 

Apache Cassandra

MongoDB

데이터 모델

Cassandra는 관계형 데이터베이스와 더 밀접한 관련이 있는 와이드 컬럼 데이터 모델을 사용합니다. 

MongoDB는 데이터를 문서로 저장하므로 관계형 모델에 전혀 부합하지 않습니다.

기본 저장 단위

정렬된 문자열 테이블

직렬화된 JSON 문서.

인덱싱

Cassandra는 단일 열 또는 여러 열 단위로 인덱싱하기 위한 보조 인덱스와 SASI를 지원합니다.

MongoDB는 컬렉션 수준 및 필드 수준에서 인덱싱하며 여러 인덱싱 옵션을 제공합니다.

쿼리 언어

Cassandra는 CQL을 사용합니다.

MongoDB는 MQL을 사용합니다.

동시성

Cassandra는 행 수준의 원자성과 턴테이블 일관성을 동시에 달성합니다. 

MongoDB는 MVCC 및 문서 수준 잠금을 사용하여 동시성을 보장합니다. 

가용성

Cassandra는 복수의 프라이머리 노드, 노드 파티셔닝 및 키 복제 기능을 통해 고가용성을 제공합니다.

MongoDB는 단일 프라이머리 노드와 여러 복제본 노드를 사용합니다. MongoDB는 샤딩과 함께 사용되어 높은 가용성과 확장성을 제공합니다. 

분할

일관된 해싱 알고리즘을 제공하며, 사용자에 대한 제어 능력은 떨어집니다.

사용자는 샤딩 키를 정의하고 파티셔닝을 더 세부적으로 제어할 수 있습니다.

AWS는 Cassandra 및 MongoDB 요구 사항을 어떻게 지원하나요?

Amazon Web Services(AWS)는 일반적인 Apache Cassandra 및 MongoDB 요구 사항을 지원하는 두 가지 서비스를 제공합니다.

Amazon Keyspaces(Apache Cassandra용)는 Cassandra 워크로드를 클라우드로 이전할 수 있게 해 주는 가용성이 뛰어난 관리형 데이터베이스입니다. Amazon Keyspaces는 서버리스이므로 사용하는 리소스에 대해서만 비용을 지불하며 서비스가 애플리케이션 트래픽에 따라 자동으로 테이블 규모를 조정할 수 있습니다. 사실상 무제한의 처리량(throughput)과 스토리지로 초당 수천 건의 요청을 처리하는 애플리케이션을 구축할 수 있습니다.

Amazon DocumentDB(MongoDB 호환)는 완전관리형 네이티브 JSON 도큐먼트 데이터베이스로, 인프라를 관리하지 않고도 규모에 관계없이 중요한 문서 워크로드를 쉽고 비용 효율적으로 운영할 수 있게 해 줍니다. Amazon DocumentDB는 내장 보안 모범 사례, 지속적인 백업, 다른 AWS 서비스와의 기본 통합을 제공하여 사용자의 아키텍처를 간소화합니다.

지금 AWS 계정을 만들어 AWS에서 관리형 Apache Cassandra 및 MongoDB 데이터베이스 서비스를 시작하세요.