Cassandra 和 MongoDB 有什么区别?
Apache Cassandra 和 MongoDB 是两个以非表格格式存储数据的 NoSQL 数据库。Cassandra 是早期的 NoSQL 数据库,采用表格存储和键值存储之间的混合设计,旨在为需要快速读取和写入性能的应用程序存储数据。相比之下,MongoDB 是为通用用途构建的文档数据库。该数据库具有灵活的数据模型,允许您以一种优化的 JSON 格式存储非结构化数据,这种格式称为二进制 JSON 或 BSON。MongoDB 数据库通过丰富直观的 API 提供全面的索引支持和复制。
Cassandra 和 MongoDB 有什么相似之处?
Apache Cassandra 和 MongoDB 都属于 NoSQL 数据库组。NoSQL 数据库无需数据库架构即可存储结构化、非结构化和半结构化数据。
与传统的关系数据库管理系统不同,NoSQL 数据库中的数据存储不受表格格式和表之间关系的限制。您可以跨多个节点自由分区和复制数据,以实现高效扩展。
此外,Cassandra 和 MongoDB 的早期版本是开源的。这意味着您可以下载这些 NoSQL 数据库的源代码并根据需要进行配置。
Facebook 开发了 Cassandra,然后将其作为与 Apache 合作进行的开源项目发布。MongoDB 由 MongoDB, Inc. 旗下的一小组开发人员开发。2018 年 10 月 16 日之前发布的所有版本的 MongoDB 均在 GNU Affero 通用公共许可证下提供。
数据模型差异:Cassandra 与MongoDB
尽管 MongoDB 和 Apache Cassandra 都是 NoSQL 数据库,但二者存储和管理数据的方法有所不同。
Cassandra
Cassandra 通过键值存储模式来存储数据。它允许您定义包含行和列的表,但在实际存储中不会使用表结构。相反,它使用面向宽列的数据库模型,因此表中的每一行可以有一组不同的列。
您可以根据列的数据类型或使用情况将列分组为列族。每行都有一个主键,可用于快速读取来自 Cassandra 的数据。
Apache Cassandra 的表结构可以在以下示例中直观呈现。
客户 ID 1 | 列 — 名称 |
列 — 国家/地区 |
|
值 — John Doe |
值 — 美国 |
||
客户 ID 2 | 列 — 名称 |
列 — 年龄 |
列 — 电子邮件 |
值 — Jane Doe |
值 — 35 |
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 上使用的查询语言。尽管 Apache 的语法和结构与 SQL 类似,但它开发了 CQL 来处理列族数据模型。
另一方面,MongoDB 使用 MongoDB 查询语言(MQL),其命令与 Node.js 类似。MQL 支持创建、读取、更新和删除(CRUD)操作。您可以在 MongoDB Shell 上编写 MQL 命令。
索引
索引是数据库中使用的一种技术,用于提高数据检索操作的速度和效率。它涉及创建一种数据结构,将数据库表中一列或多列的值映射到磁盘上相应数据的物理位置。
Cassandra 支持两种类型的索引:
- 适用于单列的二级索引
- 适用于多列的附加 SSTable 的二级索引(SASI)索引
SASI 索引直接将索引数据存储在 SSTable 中。它们支持范围、前缀等复杂查询以及对具有大量唯一值的列进行全文搜索。
相比之下,MongoDB 支持集合级别和字段级别的索引。它提供多种索引类型,例如单字段、复合索引和多键。它还提供以下索引:
- 适用于地理分布数据的专业地理空间索引
- 适用于大量文本数据的文本搜索索引
- 适用于数字数据的哈希索引和聚集索引
并发
在数据库中,并发是指多个用户或进程可以在互不干扰的情况下同时访问和执行数据库事务。
Cassandra 通过转盘一致性和行级原子性实现并发性。一次只有一个用户可以对单行进行操作。
在转盘一致性方面,每个副本节点维护一个矢量时钟,这是一种数据结构,用于跟踪管理数据的版本历史。执行写入操作时,矢量时钟会更新以反映新版本。执行读取操作时,Cassandra 会返回所有副本中时间戳最高的版本,从而确保始终返回最新版本的数据。
相比之下,MongoDB 支持多版本并发控制(MVCC)的机制。MVCC 允许同一数据文档的多个版本同时存在。每个文档都有一个唯一的修订版 ID,该 ID 每次更新时都会增加。文档级锁定和 MVCC 提供更强大的并发策略。
可用性
可用性意味着您可以确保不会出现数据停机,即使在服务器中断期间也不例外。Cassandra 和 MongoDB 都通过在多个服务器节点之间复制数据来确保可用性。
在 Apache Cassandra 中,集群中的每个节点都包含其他节点的数据副本。每个节点坐标都会读取到正确的节点以写入或提取数据。同时,它还可以修复在不同节点间失去一致性的数据。这可能会在扩展时影响性能。
相比之下,MongoDB 使用单主节点复制来提供高数据可用性。MongoDB 将数据复制到副本集中。只有一个主节点接收写入,其他节点只是从主节点复制数据。但是,主节点会造成单点故障。
可扩展性
Cassandra 和 MongoDB 都允许分片,即在集群中的多个节点上对数据进行水平分区的技术。例如,如果您有成千上万的客户,则需要对数据进行分区,以便每个节点仅包含几百个客户的信息。这样就可以在不造成瓶颈的情况下扩展数据库。
Cassandra 使用一种称为一致哈希的分布式哈希算法来确定哪个节点对特定的数据值负责。Cassandra 还支持虚拟节点(vnode),允许单个物理节点具有多个数据范围。
相比之下,MongoDB 使用分片键来确定数据值的去向。数据库管理员可以定义分片键,以对数据进行分区。您可以根据地理位置、字母顺序或对任何其他数据集最有效的系统等因素来对数据进行划分。
何时使用 Cassandra 与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。
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 是无服务器服务,因此您只需为实际使用的资源付费,并且该服务会根据应用程序流量自动扩展和缩减表。您可以构建每秒可处理数千个请求,且吞吐量和存储空间几乎无限的应用程序。
Amazon DocumentDB(与 MongoDB 兼容)是一项完全托管的本地 JSON 文档数据库。该数据库让您可以轻松且经济高效地运行几乎任何规模的关键文档工作负载,并且无需管理基础设施。Amazon DocumentDB 通过提供内置的安全最佳实践、连续备份,以及与其他 AWS 服务的本机集成,简化了您的架构。
立即创建 AWS 账户,开始在 AWS 上使用托管的 Apache Cassandra 和 MongoDB 数据库服务。