如何选择最佳数据库:MongoDB、PostgreSQL或ScyllaDB?

news2024/11/23 12:33:52

Tractian是一家提供工业监控系统的机器智能公司。去年,我们面临着将我们的实时机器学习(ML)环境和分析仪表板升级以支持数据吞吐量的大幅增长的挑战,因为我们成功地将客户数据库和数据量扩大了10倍。

我们意识到,在快节奏的实时机器学习领域保持领先地位,我们需要一个灵活、可扩展且高性能的数据基础设施。我们相信ScyllaDB将为我们提供我们所缺乏的能力,使我们能够将产品和算法推向新的水平。

但你可能想知道为什么ScyllaDB是最佳选择。我们想向你展示我们是如何改变工程流程,专注于改善产品性能的。我们将介绍为什么决定使用ScyllaDB,由此产生的积极结果以及在过渡过程中遇到的障碍。


我们如何比较NoSQL数据库 

在讨论数据库时,脑海中会浮现出许多选项。然而,我们首先决定将重点放在具有最大社区和应用的数据库上。这留下了三个直接的选择:两个市场巨头和一个令竞争对手感到惊讶的新进入者。我们研究了这些数据库的四个特征:数据模型、查询语言、分片和复制,并将这些特征作为我们下一步决策的标准。

首先,让我们通过定义的标准更深入地了解这三个数据库:

MongoDB NoSQL 

  • 数据模型:MongoDB采用面向文档的数据模型,数据以二进制JSON(BSON)格式存储。集合中的文档可以具有不同的字段和结构,提供了很高的灵活性。面向文档的模型使得几乎可以对任何数据建模或关系建模。 

  • 查询语言:MongoDB使用自定义的查询语言MongoDB Query Language(MQL),受SQL的启发,但有一些差异以匹配面向文档的数据模型。MQL支持各种查询操作,包括过滤、分组和聚合。 

  • 分片:MongoDB支持分片,即将大型数据库划分为较小的部分,并将这些部分分布在多个服务器上。分片是在集合级别执行的,可以对数据的放置进行精细的控制。MongoDB使用配置服务器存储有关集群的元数据,包括分片键和分片分布的信息。 

  • 复制:MongoDB提供自动复制,允许数据在多个服务器之间自动同步,以实现高可用性和灾难恢复。复制是使用复制集进行的,其中一个服务器被指定为主成员,其他服务器被指定为从属成员。在故障的情况下,从属成员可以接管为主成员,实现自动故障恢复。

ScyllaDB NoSQL 

  • 数据模型:ScyllaDB采用宽列族数据模型,类似于Apache Cassandra。数据按列和行组织,每列都有自己的值。该模型旨在处理具有高写入和读取性能的大量数据。 

  • 查询语言:ScyllaDB使用Cassandra查询语言(CQL),类似于SQL,但有一些差异以匹配宽列族数据模型。CQL支持各种查询操作,包括过滤、分组和聚合。 

  • 分片:ScyllaDB使用分片,即将大型数据库划分为较小的部分,并将这些部分分布在多个节点(甚至是个别核心)上。分片是自动执行的,可以随着数据的增长进行无缝扩展。ScyllaDB使用一致性哈希算法将数据分布在节点(和核心)上,确保数据和负载均衡均匀分布。 

  • 复制:ScyllaDB提供自动复制,允许数据在多个节点之间自动同步,以实现高可用性和灾难恢复。复制是使用复制数据库集群进行的,每个节点都有数据的副本。可以配置复制因子,以控制存储在集群中的数据副本数量。

PostgreSQL 

  • 数据模型:PostgreSQL使用关系数据模型,将数据组织成具有行和列的表。关系模型通过约束和事务提供对数据一致性和完整性的强力支持。 

  • 查询语言:PostgreSQL使用结构化查询语言(SQL),这是与关系数据库交互的标准语言。SQL支持广泛的查询操作,包括过滤、分组和聚合。 

  • 分片:PostgreSQL不直接支持分片,但可以通过扩展和第三方工具实现。在PostgreSQL中,可以在数据库、表甚至行级别进行分片,以精细控制数据的放置。 

  • 复制:PostgreSQL提供同步和异步复制,允许将数据在多个服务器之间进行同步,以实现高可用性和灾难恢复。复制可以使用多种方法进行,包括流复制、逻辑复制和基于文件的复制。

我们对性能的比较结果如下:

在性能方面,ScyllaDB针对高性能和低延迟进行了优化,采用无共享体系结构和多线程技术,提供高吞吐量和低延迟。

MongoDB针对易用性和灵活性进行了优化,提供更易于使用和开发者友好的体验,并拥有庞大的社区来帮助解决未来的问题。

另一方面,PostgreSQL针对数据完整性和一致性进行了优化,强调事务一致性和ACID(原子性、一致性、隔离性、持久性)的合规性。它是需要强大的数据可靠性和安全性的应用程序的常见选择。它还支持各种数据类型和高级功能,如存储过程、触发器和视图。

在选择PostgreSQL、MongoDB和ScyllaDB之间,必须考虑到你的具体用例和需求。如果你需要一个功能强大和可靠的关系型数据库,具有高级数据管理功能,那么PostgreSQL可能是更好的选择。然而,如果你需要一个灵活易用、具有庞大生态系统的NoSQL数据库,那么MongoDB可能是更好的选择。

但是我们正在寻找的是一种高度可扩展和高性能的NoSQL数据库。答案很简单:ScyllaDB更适合我们的用例。


MongoDB vs. ScyllaDB vs. PostgreSQL:性能对比 

经过研究过程,我们团队对仅依靠书面信息来做出塑造产品未来的决策持怀疑态度。我们开始深入挖掘,以确保我们的决策在实践中是正确的。

首先,我们建立了一个环境来复制我们的数据采集流程,但我们进行了激进的测试。我们创建了一个脚本来模拟比当前数据流量更大的数据流。当时,我们的吞吐量约为每秒16,000次操作,并且我们以每秒160,000次操作的速度测试了数据库(基本上是10倍)。

为了确保准确性,我们还测试了不同格式和数据结构的写入和读取响应时间;其中一些与我们当时已经使用的类似。

可以在下面看到我们的结果,使用ScyllaDB进行新的最佳配置,并使用MongoDB的配置(我们的旧设置)应用上述测试:

结果令人震惊。在相似的基础设施成本下,我们实现了更好的延迟和容量;决策是明确且经过验证的。我们面临着一项庞大的数据库迁移任务。


从MongoDB迁移到ScyllaDB NoSQL 

一旦我们决定开始实施,我们就面临现实世界中的困难。有一些重要的事情需要提及。

在这次迁移中,我们添加了新的信息和格式,这影响了直接或间接使用这些数据的所有生产服务。它们需要通过在流程中添加适配器或重新创建部分处理和操作逻辑来进行重构。

在迁移过程中,由于无法使用停机事件来在旧版本和新版本之间进行交换以验证我们的流程,因此必须对服务和数据库进行复制。这是你在关键的实时系统中必须处理的问题之一:即使在修复或更新系统时,也不能发生停机

重构过程应该经过数据科学模型,以便它们可以利用新的格式,提高准确性和计算性能。

在这些指导原则的基础上,我们创建了两个团队。一个团队负责管理和维护旧的数据库和架构。另一个团队对我们的数据湖进行了大规模的重处理,并重构了模型和服务以适应新的架构。

从设计结构到最终部署和生产环境切换的整个过程耗时六个月。在此期间,需要进行调整和重大修正。你永远不知道在过程中会学到什么教训。


NoSQL迁移的挑战

ScyllaDB之所以能够实现如此出色的性能,是因为它被设计用于充分利用高端硬件和非常具体的数据建模。最终的结果令人惊讶,但要达到这样的结果需要一些时间。硬件对性能有很大影响。ScyllaDB针对现代多核处理器进行了优化,利用所有可用的CPU核心来处理数据。它使用AVX2(高级向量扩展2)和AES-NI(高级加密标准新指令)等硬件加速技术;它还依赖于存储设备的类型和速度,包括固态硬盘和NVMe(非易失性内存表达)驱动器。

在我们早期的测试中,我们弄乱了一些硬件配置,导致性能下降。当这些问题得到修复后,我们又遇到了另一个问题:数据建模

ScyllaDB使用Cassandra数据模型,这对查询的性能产生了重大影响。如果你对数据结构、查询或数据量做出了错误的假设,就像我们在开始时做的那样,性能将受到影响。

实际上,在某些情况下,第一个提出的数据格式超过了ScyllaDB分区的推荐最大大小,导致数据库性能不佳。

我们主要的困难在于理解如何将我们旧的数据建模转化为适用于ScyllaDB的建模方式。我们不得不将数据重新组织成多个表和分区,有时还要复制数据以实现更好的性能。


总结与教训:比较和迁移NoSQL数据库

简而言之,在这个过程中,我们学到了三个教训:一些来自我们的成功,另一些则来自我们的错误。

在研究和基准测试这些数据库时,很明显,不同数据库中的许多规格和功能都具有特定的应用。你的具体用例将决定最适合你应用程序的最佳数据库。而这个真相只有通过在高压环境下进行实际测试和生产环境的模拟才能发现。我们投入了大量时间,而选择使用最合适的数据库付出了回报。

在开始一个大型项目时,对于在旅程中改变方向做好准备非常重要。如果你开发的项目在构思之后没有发生变化,那么你可能在建设过程中没有学到任何东西,或者你对于意外情况并不在意。规划无法完全预测到所有现实世界中的问题,所以要准备好根据实际情况调整决策和信念。

不要害怕大的改变。很多人反对我们提出的变化,因为它带来了风险,并给开发人员带来了不便(将一个已经为团队所拥有的工具更换为完全不熟悉的新工具)。

最终,决策是基于它对我们产品改进的影响而做出的,而不是基于我们的工程团队,尽管这是我们迄今为止最重大的工程变化之一。

无论你使用的是什么架构或系统,真正关键的是它是否能够将你的产品带入一个光明的未来。

这就是我们在构建Tractian产品未来之桥的旅程。

作者: Joao Pedro Voltani and Joao Granzotti

更多技术干货请关注公号“云原生数据库

squids.cn,基于公有云基础资源,提供云上 RDS,云备份,云迁移,SQL 窗口门户企业功能,

帮助企业快速构建云上数据库融合生态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610553.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL版本5.7.99?

序:在项目工作中需要从三方厂商数据库同步数据到项目业务库中,本平平无奇的功能却被一个报错打破。 在使用某框架的DataSourceConfig(Object)方法初始化数据库连接时,日志输出报错: Unknown system variable transaction_isolatio…

sparkRDD编程实战

文章目录 sparkRDD编程实战1、Spark RDD 实现单词计数2、Spark RDD 实现分组求TopN3、Spark RDD 实现二次排序4、Spark RDD 计算平均成绩5、Spark RDD 倒排索引统计每日新增用户6、Spark案例实操7、Spark RDD 综合应用需求1:Top10热门品类需求说明实现方案一实现方案…

【Python SMTP/POP3/IMAP】零基础也能轻松掌握的学习路线与参考资料

Python是一种高级编程语言,广泛应用于Web开发、人工智能、数据科学、自动化等领域。SMTP/POP3/IMAP是与邮件相关的三个协议,分别用于发送邮件、接收邮件和访问邮件。使用Python可以轻松实现这些功能,本文将介绍Python SMTP/POP3/IMAP的学习路…

【Python】Python系列教程-- Python3 条件控制(十六)

文章目录 前言if 语句if 嵌套match...case 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列教程–Python3 VScode(三)Python系列教程–Pytho…

Spring Boot整合Swagger2 Swagger2配置

目录 什么是Swagger? Swagger如何使用 如何使用Swagger 查看SwaggerAPI文档 什么是Swagger? Swagger是一款流行的RESTful API文档生成工具,它支持多种编程语言和多种框架,包括但不限于Java、Python、Node.js、Go等,Spring Boot也提供了…

【机器学习】第二章:K近邻(分类)

系列文章目录 第二章:K近邻(分类) 相关代码地址:https://github.com/wzybmw888/MachineLearning.git 文章目录 系列文章目录一、最近邻算法二、最近邻算法的缺陷(1)策略一:K近邻(k‐…

java源码为什么需要编译成字节码?

作用1: jvm支持多语言,需要字节码作为统一的规范 作用2: 字节码转成机器的指令会更快 作用3: 如果没有对应的反编译器,字节码还具有一定的安全保密作用

【Rust日报】2023-06-02 Rust 1.70.0 稳定版发布

Rust 1.70.0 稳定版发布 Rust 团队很高兴地宣布 Rust 的新版本 1.70.0。Rust 是一种编程语言,它使每个人都能构建可靠、高效的软件。 最大的特性是,OnceCell稳定版可用啦。 如果你通过 rustup 安装了以前版本的 Rust,你可以通过以下方式获得 …

Linux 之大数据定制篇-Shell 编程

Linux 之大数据定制篇-Shell 编程 为什么要学习Shell 编程 Linux 运维工程师在进行服务器集群管理时,需要编写Shell 程序来进行服务器管理。对于JavaEE 和Python 程序员来说,工作的需要,你的老大会要求你编写一些Shell 脚本进行程序或者是服…

Mocha AE:图层相关面板

Mocha AE 左侧的图层面板、图层属性面板以及边缘属性面板提供了与图层、样条、跟踪等相关的选项。 Layers 图层 图层的上下顺序相当重要。 上方所有图层的样条区域将被自动排除出跟踪遮罩 Track Mattes。 也可在同一图层上绘制多个样条形状。相交的样条区域将被排除出遮罩。 Vi…

【MySQL】一文带你了解MySQL中的子查询

文章目录 1. 需求分析与问题解决1. 1实际问题1.2 子查询的基本使用1.3 子查询的分类 2. 单行子查询2.1 单行比较操作符2.2 代码示例2.3 HAVING 中的子查询2.4 注意的问题 3. 多行子查询3.1 多行比较操作符3.2 代码示例 4. 相关子查询4.1 相关子查询执行流程4.2 代码示例 子查询…

图论学习(六)

图的连通度 删去任意一条边后便不连通 删去任意一条边后仍连通,但删去点u后不连通。 G3和G4删去任意一条边或任意一个点后仍连通,但从直观上看,G4的连通程度比G3高。 割边 设e是图G的一条边,若ω(G-e)>ω(G),则…

uniapp微信一键登录微信授权

前言 现在小程序逐渐成为主流,常用的微信授权登录很重要很常见的一个功能,今天自己总结了一下。 准备工作 1.如果你想自己想试一下这个功能首先你需要有一个开发中的项目并且你在开发成员里面。 2.配置自己的微信开发者工具的appid码 3.在hbuilderx的…

echarts 如何实现图例单个数据项加上背景颜色和饼图中的背景图自适应

需求: 实现效果如下: ECharts中,可以通过设置legend中的formatter属性来自定义图例项的显示格式。以下是一个示例: option = {// ...legend: {data: [A, B, C],formatter: function (name) {var color = #fff;if (name === A) {color = #ff0000; // 设置A的背景颜色为红色…

如何使用ArcGIS计算容积率

字段计算 为建筑图层新建一个area字段,用于记录单层建筑的面积,如下图所示。 单层建筑面积 为建筑图层新建一个areaAll字段,用于记录总建筑面积,areaAllarea*floor,如下图所示。 计算总面积 为小区图层新建一个area…

chatgpt赋能python:Python大于0的SEO

Python大于0的SEO Python是一种高级编程语言,被广泛用于数据科学、机器学习、Web应用程序和网络爬虫等领域。Python大于0的SEO是指使用Python编写程序来优化网站的排名。在本文中,我们将介绍Python大于0的SEO的基础知识和一些实用技巧。 什么是Python大…

【redis基础】哨兵

hi,这里是redis系列文章,本篇是【redis基础】哨兵,上一篇链接:【redis】redis主从复制_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 如何使用哨兵(案例演示实战步骤) redis sentinel架构提前说明 重点参数…

【Java】Java(四十九):注解及自定义注解

文章目录 什么是注解?概述注解的作用自定义注解注解的定义格式带有属性的注解 注解的使用注解的使用格式 元注解元注解的作用:常用元注解: 注解解析 什么是注解? 注解(Annotation)也称为元数据,是一种代码级别的说明注…

数据库管理-第八十期 Exadata to RAC(x86) ADG(20230605)

数据库管理 2023-06-05 第八十期 Exadata to RAC(x86) ADG1 环境2 搭建流程2.1配置静态监听-主库2.2配置静态监听-备库2.3配置本地命名-主备库2.4数据库配置-主库2.5生成参数文件和密码文件-主库2.6创建目录并上传密码文件-备库2.7添加数据库服务-备库2.8修改参数文件-备库2.9复…

超级智能的治理

原文链接:https://openai.com/blog/governance-of-superintelligence#SamAltman 作者丨Sam Altman,Greg Brockman,Ilya Sutskever 译者 | Ted Liu 审校 | LsssY 编辑丨肖钰雯 现在是开始思考超级智能治理的好时机--未来的人工智能系统甚至比通…