草庐IT

选择数据库时的五个因素

科技狠活与软件技术 2023-03-28 原文
以下是判断数据库何时适合您的项目的方法。

当您为最新用例选择数据库时(或更换不满足当前需求的数据库),现在的好消息是您有很多选项可供选择。当然,这也是坏消息。你有很多东西要整理。

有比以往更多的数据库需要考虑和比较。2012 年 12 月,即 DB-Engines.com 首次开始对数据库进行排名的第一年年底,他们列出了73个系统(比他们最初列出的18 个系统有了显着增加)。截至 2022 年 12 月,他们只有不到 400 个系统。这代表了过去十年数据库技术的寒武纪大爆发。有大量的选项可供导航:SQL、NoSQL 和“多模型”数据库的混合,可以是 SQL 和 NoSQL 的混合,或者 NoSQL 的多个数据模型(结合两个或更多选项:文档,键值、宽列、图表等)。

此外,用户不应将完全流行与适用于他们的用例相混淆。虽然网络效应肯定有优势(“如果每个人都在使用 X,它就不会出错”),但它也可能导致群体思维、扼杀创新和竞争。

我的同事 Arthur Pesa 和我最近讨论了用户在筛选和比较数据库时需要首先考虑的五个因素。

五个因素

让我们直接进入列表。

  • 软件架构——数据库是否使用最高效的数据结构、灵活的数据模型和丰富的查询语言来支持您的工作负载和查询模式?
  • 硬件利用——能否充分利用现代硬件平台?或者您是否会留下大量未充分利用的 CPU 周期?
  • 互操作性——集成到您的开发环境中有多容易?它是否支持您的编程语言、框架和项目?它是否旨在集成到您的微服务和事件流架构中?
  • RASP——它是否具有可靠性、可用性、可扩展性、可维护性,当然还有性能的必要品质?
  • 部署——这个数据库是否只能在有限的环境中工作,比如只能在本地,或者只能在单个数据中心或单个云供应商中工作?或者它是否适合在全球范围内以您想要的方式部署?
任何此类故障都是主观的。您可能有自己的 4 个因素列表,或 12 个、20 个或 100 个标准。当然,软件架构等这些因素中的每一个都分解为子类别,例如“存储引擎”、“分布式处理架构”,甚至“查询语言”。但这就是我将它们分为一般类别的方式。

软件架构

这里的关键考虑因素是“数据库是否使用最有效的数据结构、灵活的数据模型和丰富的查询语言来支持您的特定工作负载和查询模式?”

  • 工作负载——您是否需要执行大量写入或混合读写的事务性工作负载?或者你打算做一个大部分阅读的分析工作量?您是否需要混合事务和分析的混合工作负载?该工作负载是实时的、批处理的还是混合的?是每秒稳定的事件流,还是平稳、规律的日内可预测涨跌?或者您是否需要计划应对突发流量的随机冲击(例如,突发新闻或任何其他突然流行的记录)?
  • 数据模型——你在处理键值对吗?宽列存储(基于行的“键-键-值”数据)?列存储(列数据)?文档?图形?RDBMS(带有表和 JOIN)?或者完全是别的东西。您是否真的有时间并且需要对数据进行完全规范化,或者您是否会如此迅速地吸收如此多的非结构化数据以致于规范化是徒劳的,而您最好从非规范化数据模型开始?这里没有单一的“正确”答案。“这取决于”应该作为你的口头禅。
  • 查询语言——这里肯定有更多的偏见。因为虽然您的数据工程团队可能能够掩盖或隐藏后端查询模型,但您的许多用户都有自己的偏见和偏好。这是 SQL 仍然如此锁定的主要原因之一。同时,还有新的查询语言可供使用。有些类似于 SQL,例如 Cassandra 和 ScyllaDB 使用的 Cassandra 查询语言 (CQL)。SQL 用户对它非常熟悉。但不要被愚弄——没有表 JOIN!然后是一系列新派的查询语言可能会用到,比如JSON。这就是 Amazon DynamoDB 查询的工作方式。同样,在这里,ScyllaDB 使用我们的 Alternator 接口支持这样的 JSON 查询模型,它与 DynamoDB 兼容。不管你往哪个方向倾斜,
  • 交易/运营/ CAP——哪个对你更重要?完全一致的 ACID 事务?还是高性能、高可用的基本 CRUD 操作?CAP 定理说您可以拥有以下三个中的任意两个:一致性、可用性或分区容错性。考虑到分布式数据库始终需要分区容忍,这让您可以在所谓的“CP”模式一致性导向系统或“AP”模式可用性导向系统之间做出选择。在这些模式中,需要考虑实施细节。例如,在分布式系统中实现强一致性的方式可能千差万别。甚至考虑选择各种共识算法来确保线性化,如 Paxos、Raft、Zookeeper (ZAB) 等。除了不同的算法之外,每个实现都可能与另一个有很大差异。
  • 数据分布——当你说“分布式系统”时,你到底指的是什么?我们是在谈论本地的单数据中心集群吗?或者我们在谈论多数据中心集群?跨集群更新是如何发生的?它是否被视为所有一个逻辑集群,还是需要集群间同步?它如何处理数据本地化,例如 GDPR 合规性?

硬件利用率

我们正处于底层硬件的持续革命之中,这场革命继续推动软件的发展。许多软件应用程序,尤其是许多数据库,仍然植根于几十年前的起源、设计和假设。

  • CPU 利用率/效率——如果 CPU 利用率超过 40% 或 50%,很多软件就会运行不佳。这意味着您应该低效地运行该软件,定期让一半的机器未得到充分利用。实际上,您支付的基础设施费用是您实际需要的两倍(或更多)。因此,您有必要查看您的系统处理分布式处理的方式。
  • RAM 利用率/效率——您的数据库是否始终受内存限制?它的缓存是否过于激进或过于臃肿(例如具有多层缓存),将不需要的数据保留在内存中?它如何优化其读写路径?
  • 存储利用率/效率——你的数据库使用什么存储格式?它是否具有可能需要重量级文件锁定机制的紧凑型可变表?或者它是否使用可能产生快速写入但以空间和读取放大为代价的不可变表?它是否允许分层存储?它如何处理并发?文件是按行存储(适合事务用例)还是按列存储(适合对高度重复的数据进行分析)?请注意,不只有一个“正确”答案。每个解决方案都针对不同的用例进行了优化。
  • 网络利用率/效率——在这里您应该同时考虑客户端-服务器集群通信的效率,以及集群内通信的效率。通过并发、连接池等,可以使客户端/服务器模型更加高效。集群内通信涵盖典型的操作/交易聊天(在更新或写入中复制数据),以及管理任务,例如在拓扑更改期间在节点之间流式传输和平衡数据。

互操作性

没有数据库是一座孤岛。集成到您的开发环境中有多容易?它是否支持您的编程语言、框架和项目?它是否旨在集成到您的微服务和事件流架构中?

  • 编程语言/框架——您一遍又一遍地听到“我们是一家X商店”,其中X代表您首选的编程语言或框架。如果您的数据库没有必要的客户端、SDK、库、ORM 和/或其他包来将其集成到该语言中,那么它可能不存在。公平地说,数据库的大规模爆炸与编程语言的大规模爆炸同时发生。然而,查看对客户端的编程语言支持是值得的。请注意,这与数据库本身可能编写的语言不同(这可能会影响其软件架构和效率)。这纯粹是关于您可以使用哪些语言编写应用程序来连接到该后端数据库。
  • 事件流/消息队列——数据库可能是单一的事实来源,但它们并不是您公司中运行的唯一系统。事实上,您可能拥有不同的数据库,它们都在处理、分析和共享公司整体数据和信息空间的不同部分。事件流是现代企业避免数据孤岛的越来越普遍的媒体,如今,您的数据库只有与实时事件流和消息队列技术集成才能发挥作用。您的数据库能否同时充当数据接收器和数据源?它是否具有变更数据捕获 (CDC)?它是否连接到您最喜欢的事件流和消息队列技术,例如 Apache Kafka、Apache Pulsar 或 RabbitMQ?
  • API——为了促进您的数据库集成到您的应用程序和微服务架构中,您的数据库是否支持一个或多个 API,例如 RESTful 接口或 GraphQL?它是否具有管理 API,以便您可以通过编程方式配置它而不是通过 GUI 界面执行所有操作?起初使用 GUI 似乎很方便,直到您必须管理和自动化您的部署系统。
  • 其他集成——CI/CD 工具链呢?可观察性平台?如何将您的数据库用作可插拔存储引擎或更广泛架构的底层元素?它作为基础设施的作用如何,或者适合您已经使用的基础设施?

RASP

这个首字母缩略词可以追溯到几十年前,通常用于硬件上下文中。它代表可靠性、可用性、可维护性(或可扩展性)和性能。基本上,这些“-ilities”是“facilities”——让你的系统运行起来更容易的东西。在数据库中,考虑您可能需要执行多少手动干预和“转盘”以保持系统正常运行和稳定是至关重要的。它们表示数据库在一般操作条件下可以在多大程度上照顾好自己,甚至尽可能地减轻故障状态。

典型的平台工程师启动了一堆新节点。

  • 可靠性——为了防止这个东西崩溃或数据消失,你需要进行多少修补?你的数据库是否具备良好的持久化能力?它的生存能力如何?它包括什么反熵机制来让集群恢复同步?您的备份系统有多好?更重要的是,您的还原系统有多好?是否有操作护栏来防止个人用一个“哎呀!”把事情搞砸了?
  • 可用性——当您遇到短期网络分区和临时节点不可用时,您的数据库会做什么?当一个节点完全失败时会发生什么?如果网络故障持续超过几个小时怎么办?
  • 可服务性——如今流行的流行语是“可观察性”,它通常包含日志记录、跟踪和指标这三大支柱。当然,您的数据库需要内置可观察性。然而,可维护性远不止于此。在不停机的情况下执行升级有多容易?维护操作有多轻松?
  • 可扩展性——一些数据库非常适合入门。然后……你撞墙了。难的。可扩展性意味着您不必担心在管理的总数据量、每秒总操作数或地理限制方面达到极限——例如超越单个数据中心以实现真正的全球部署。此外,还有水平可扩展性——向集群添加更多节点的横向扩展——以及垂直可扩展性——将您的数据库放在具有不断增加的 CPU 数量、更多 RAM 和更多存储的服务器上(参见硬件部分)多于)。
  • 性能——底线:如果数据库不能满足您的延迟或吞吐量 SLA,它就不会在生产中运行。此外,与可扩展性相关,许多数据库似乎可以在小规模下或基于使用测试数据的静态基准满足您的性能要求,但当遇到实际生产工作负载时,就无法跟上不断增加的频率、可变性和查询的复杂性。因此性能需要与线性比例有很强的相关性。

部署

然后,以上所有内容都需要在您需要的地方运行。这个数据库是否只能在有限的环境中工作,比如只能在本地,或者只能在单个数据中心或单个云供应商中工作?或者它是否适合在全球范围内以您想要的方式部署?问自己这些问题:

  • 锁定——这可以在本地运行吗?或者,相反,它是否仅限于本地部署?它仅限于某个公共云供应商,还是可以在您选择的云供应商中运行?您的混合云或多云部署选项是什么?
  • 管理/控制——同样,这是否只能作为自我管理的数据库使用,还是可以作为完全托管的数据库即服务 (DBaas) 使用?前者允许团队完全控制系统,后者减轻团队的管理负担。两者都有其权衡。只能选择一个,还是数据库允许用户在这两种商业模式之间切换?
  • 自动化和编排——是否有 Kubernetes Operator 在生产中支持它?Terraform 和 Ansible 脚本?虽然这是列表中的最后一项,但请放心,在任何生产考虑中都不应事后考虑。

有关选择数据库时的五个因素的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  3. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  4. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  7. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  8. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

    我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

  9. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  10. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

随机推荐