benchANT compares MongoDB and ScyllaDB architectures, with a focus on what the differences mean for performance and scalability 当选择 NoSQL 数据库时,选项可能是压倒性的。最受欢迎的选择之一是 MongoDB,它以其易于使用而闻名。 该报告对这两个数据库进行了更密切的技术研究 - 从独立的技术角度比较它们的架构。 宾客 MongoDB 和 ScyllaDB 都承诺具有高可用性、高性能和可扩展的架构,但它们实现这些目标的方式远远不同于您可能在第一眼看到的。 为了突出这些差异,我们深入讨论了内部存储架构和分布式架构,从而实现了高可用性和水平可扩展性。 我们还刚刚发布了一项基准,量化了这些差异的影响。 Note: 阅读DynamoDB vs MongoDB Benchmark 总结 下载此比较报告 Read the DynamoDB vs MongoDB Benchmark Summary 阅读DynamoDB vs MongoDB Benchmark 总结 Download this Comparison Report 下载此比较报告 关于 MongoDB vs ScyllaDB 存储架构的性能观点 两种数据库都以 C++ 实现,并建议使用 XFS 文件系统。 , Commit Log 在 ScyllaDB 术语中和 Oplog 在 MongoDB 术语中. 使用 write-ahead-logging,在执行操作之前,所有操作都被写入日志表中。 写作前期日志概念 作为默认存储引擎,MongoDB 使用 B+-Tree 索引(Wired Tiger)来存储和检索数据。B+-Tree 索引是平衡的树数据结构,以排序顺序存储数据,方便执行基于范围的查询。MongoDB 支持集合上的多个索引,包括复合索引、文本索引和地理空间索引。 还可以对数组元素和嵌入式字段进行索引,从而允许对复杂数据结构进行高效查询。 ScyllaDB 将数据分成碎片,将节点中的总数据分配给特定 CPU,以及其相关的内存(RAM)和持久存储(如 NVMe SSD)。 ScyllaDB 的内部存储引擎通过将磁盘持久连接日志和基于内存的记忆记录应用到磁盘中,从而将数据分割为碎片。 ScyllaDB 支持主要、次要和复合索引,每个节点和每个集群均为本地和全球索引。 主要索引由一个 hashing 环组成,其中存储了 hashed 密钥和相应的分区。 并且在分区内,ScyllaDB 会找到分类数据结构中的行(SSTable),这是 LSM-Tree 的一个变体。 次要索引被保留在一个表中。 这些不同的存储架构导致可用硬件的不同用途来处理工作负载 MongoDB 不会将内部线程粘贴到可用的 CPU 内核中,而是将分布式线程粘贴到内核中。 CPU架构,这可能会导致性能下降,特别是对于大型服务器,因为线程可以动态分配到具有不同内存节点的不同接口上的核心。 这允许它将负责任的线条粘贴到特定内核中,避免在不同的内核和内存空间之间切换,因此,切割密钥需要仔细选择,以确保数据在切割中均匀分布,并防止热切割。 它为延迟敏感和不敏感查询提供内置优先级类,以及在一个节点上的碎片之间协调的 I/O 时间安排,以最大限度地提高磁盘性能。 基于 shard per core 方法 I/O 时间表 ScyllaDB 允许用户控制数据是否应该留在 DB 缓存中,或绕过它以访问罕见分区。ScyllaDB 允许客户端访问拥有数据的节点和 CPU 核心(shard)。 MongoDB 分布式架构 – 高可用性和可扩展性的两个操作模式 MongoDB 数据库架构提供了以下部分所描述的两种群集模式:复制集群旨在实现高可用性,而分裂群集则旨在实现水平可扩展性和高可用性。 复制集群:高可用性与有限的可扩展性 MongoDB 架构通过复制集的概念实现了高可用性。 MongoDB 复制集遵循主要和次要节点的概念,其中只有主要处理 WRITE 操作。 次要节点持有数据的副本,并且只能启用来处理 READ 操作。 一个共同的复制集部署由两个次要节点组成,但可以添加额外的次要节点来增加可用性或扩展重量级工作负载。 MongoDB 在一个复制集中支持多达 50 个次要节点。 至于地理分布,MongoDB 支持地理分布的复制集部署,以确保数据中心故障时的高可用性。在这种情况下,辅助实例可以分布到多个数据中心,如下图所示。 Sharded 集群:水平可扩展性和高可用性与运营复杂性 MongoDB 支持横向扩展,通过在多个主要实例中分割数据,以应对编写密集的工作负载和日益增长的数据大小。在分割的集群中,由一个主要和多个次要组成的每个复制集都代表一个分割。 要启用 sharding,需要额外的 MongoDB 节点类型: 并配置服务器. 一个 mongos 实例作为一个查询路由器,提供客户端应用程序和碎片集群之间的接口. 因此,客户端永远不会直接与碎片通信,但总是通过查询路由器。 查询路由器(Mongos) 建议部署多个查询路由器以确保集群的可访问性,因为查询路由器是客户端驱动程序的直接接口。查询路由器数量没有限制,但由于它们经常与配置服务器进行通信,应该注意到过多的查询路由器可以过载配置服务器。配置服务器存储碎片集群的元数据,包括所有数据和组件的状态和组织。该元数据包括每个碎片上的碎片列表和定义碎片的范围。 MongoDB 中的数据分割是在集合层面进行的,并且可以根据分割密钥分割一个集合。MongoDB 使用分割密钥来确定哪个文件属于哪个分割密钥。 常见的分割密钥选项包括 _id 字段和具有高 cardinality 的字段,如时刻印或用户 ID。 根据 shard 密钥值,分区分区文件在分区之间。这使具有 shard 密钥值的文档保持相近,并且适用于基于范围的查询,例如时间序列数据。 hashed sharding 保证了分区间的写字均匀分布,有利于写工作负载。 此外,分裂的集群可以在地理分布的设置中部署,以克服数据中心故障,如下图所示。 ScyllaDB架构 – 高可用性和水平可扩展性的多重主流 与MongoDB不同,ScyllaDB不跟随经典的RDBMS架构,具有一个主节点和多个次节点,而是使用一个分散的结构,其中所有数据在多个节点上系统地分布和复制,形成一个群集。 集群是组织成一个虚拟环架构的相互连接节点的集合,在其中数据被分布。 环被分为 vNodes,这代表了分配给物理节点的一系列代币,并根据键空间的复制因子设置在物理节点上复制。 所有节点被认为是平等的,在多元原理意义上。 没有定义的领导者,集群没有一个单一的故障点。 节点可以是单独的本地服务器,或虚拟服务器(公共云实例),由一个较大的物理服务器上的硬件子集组成。 在每个节点上,数据进一步分割成碎片。 碎片作为大多数独立运作的单元,被称为“共享无物”设计。 这大大降低了争议和需要昂贵的 所有节点都通过 该协议决定在哪个分区写哪个数据,并使用索引搜索右分区中的数据记录。 GOSIP 协议 至于扩展,ScyllaDB的架构是为了在多个服务器和地区进行轻松的水平分割而设计的。ScyllaDB的分割是在表层进行的,一个表可以根据分区密钥进行分割。分区密钥可以是单一列或多列的组合。ScyllaDB还支持基于范围的分割,其中行根据分区密钥值范围分布在分区之间,以及以哈希为基础的分割,以平等分配数据并避免热点。 此外,ScyllaDB 允许在多个数据中心中复制数据,以获得更高的可用性和更低的延迟。 在客户端方面,应用程序可能或可能不知道多数据中心部署,而应用程序开发人员将决定如何意识到数据中心(数据中心)的倒退。这可以通过读写一致性选项进行配置,这些选项可以定义是否对单个数据中心或所有数据中心执行查询。 对 MongoDB 和 ScyllaDB 的分布式架构的比较可扩展性观点 当涉及到可扩展性时,必须考虑 ScyllaDB 和 MongoDB 的显著不同的分布方法,特别是对于在本地或 IaaS 上运行的自管理集群。 然而,为了扩展具有显著写比率的工作负载,复制集需要转化为碎片复制集,这带来了几个挑战。 首先,需要两个额外的MongoDB服务:一个查询路由器(mongos)和一个复制集合的配置服务器,以确保高可用性。 因此,需要更多的资源才能在第一位实现碎片复制。 此外,操作复杂性显然增加了。 例如,一个碎片复制集合有三个碎片的碎片集合需要三种蒙戈斯实例的碎片复制集合,三种配置服务器和三种碎片复制集合的碎片复制集合 – 每个碎片由一个主要和至少两个次要的碎片组成。 第二個挑戰是將數據分割到分裂集群中。在這裡,MongoDB應用一項不斷運行的背景任務,自動引發數據在分裂集群中重新分配。分割並非在新分裂集群加入後才會發生,而是當達到某些內部值時。因此,增加分裂的數量會立即擴大集群,但可能會有延遲的擴張效果。 在这里,每个节点都是平等的,没有需要额外的服务来将群集扩展到数百个节点。此外,一旦新节点被添加到群集中,就会启动数据分割。在这种情况下,ScyllaDB在MongoDB上提供了明显的优势。首先,由于一致的哈希化方法,数据不需要在整个群集中分布,只需要在小节点的子集中分布。 主要的可扩展性差异概述在下表中: 结论与展望 当你比较两个分布 数据库,你总是发现一些平行,但也有许多显著的差异。 . 两个数据库都解决了类似的使用案例,并具有相似的产品和社区策略,但在技术方面,你可以看到不同的方法和重点。这两个数据库都是为了通过分布式架构实现高可用性而构建的。 诺斯卡 ScyllaDB 与 MongoDB ScyllaDB 清楚地解决了性能关键的工作负载,这些工作负载需要容易和高可扩展性、高输出量、低和稳定的延迟,以及多数据中心部署中的所有内容。 为了进一步了解各自的性能能力,我们在单独的基准报告中提供了一个透明且可重复的性能比较,该报告调查了 MongoDB Atlas 和 ScyllaDB Cloud 的性能,可扩展性和成本。 附加的 ScyllaDB vs. MongoDB 比较详细信息 查看完整 对本技术比较的扩展版本,包括比较的细节: benchANT MongoDB vs ScyllaDB 比较 数据模型 想要的语言 使用案例和客户示例 数据一致性选项 第一手操作经验