数据库怎么选择?终于有人讲明白了

作者 | Alex Petrov

所有数据库管理系统的主要工作都是可靠地存储数据并使其对用户可用。我们使用数据库作为数据的主要来源,帮助我们在应用程序的不同部分之间共享数据。我们使用数据库,而不是在每次创建新应用程序时寻找存储和检索信息的方法,也不是每次都去发明一种组织数据的新方法。这样一来,我们就可以专注于应用程序逻辑而不是基础设施。

数据库是模块化的系统,由多个部分组成:接受请求的传输层、决定以最高效方式运行查询的查询处理器、执行操作的执行引擎以及存储引擎。

存储引擎(或数据库引擎)是数据库的一个软件组件,它负责在内存和磁盘上存储、检索和管理数据,而设计它的目的是长久保存每个节点的数据[REED78]。数据库可以响应复杂的查询,存储引擎则会更细粒度地看待数据并提供一组简单的数据操作API,允许用户创建、更新、删除和检索数据记录。从某个角度来看,数据库是构建在存储引擎之上的应用程序,它提供了表结构(schema)、查询语言、索引、事务和许多其他有用的特性。

为了获得灵活性,键和值都可以是没有预设格式的任意字节序列。它们的排序和表示语义是在更高级别的子系统中定义的。例如,你可以在一个表中使用int32(32位整数)作为键,而在另一个表中使用ascii(ASCII字符串);从存储引擎的角度来看,这两个键都只是序列化的条目。

BerkeleyDB、LevelDB(及其后代RocksDB)、LMDB(及其后代libmdbx、Sophia和HaloDB)等存储引擎的开发都与它们现在所嵌入的数据库彼此独立。使用可插拔的存储引擎使数据库开发人员能够使用现有存储引擎来构建数据库系统,并将精力集中在其他子系统上。

同时,数据库系统组件之间清晰的解耦为切换不同引擎提供了机会,这些引擎可能分别适用于特定的用例。例如:流行的数据库MySQL有几个存储引擎,包括InnoDB、MyISAM和RocksDB(在MyRocks发行版中),而MongoDB则允许在WiredTiger、内存以及(现已弃用的)MMAPv1存储引擎之间进行切换。

 

数据库的比较

 

对数据库系统的选择将会产生长期的影响。如果选择的数据库不合适(因其导致性能问题、一致性问题或运维上的挑战),那么我们最好在开发周期的早期就发现这一点,因为迁移到不同的系统可能并非易事,甚至在某些情况下,你还需要对应用程序的代码进行重大的修改。

每个数据库系统都有优点和缺点。为了降低进行高成本迁移的风险,你可以在选择数据库上投入一些时间,以确保其具备满足应用程序需求的能力。

试图根据数据库的组件(例如:使用的存储引擎,数据共享、复制和分布的方式等)、它们的排名(ThoughtWorks等咨询机构或诸如DB-Engines和Database of Databases等数据库比较网站所呈现的流行度值)或实现语言(C、Java或Go等)来比较数据库,可能导致无效和不成熟的结论。这些方法只能用于高层次上的比较,并且可能出现例如在HBase和SQLite之间进行选择这样粗糙的对比。因此,即使只是对每个数据库的工作原理和内部结构有粗浅了解,这些了解也可以很好地帮助你得出一个更可靠的结论。

每一次比较都应该从清晰界定的目标开始,因为哪怕是最小的偏差都可能使整个调查完全无效。如果你正在找寻一个非常适合当下(或者未来)的工作负载的数据库,那么你所能做的最好的事情就是在不同的数据库系统上模拟这些工作负载、测量对你很重要的那些性能指标,并比较结果。有些问题(特别是性能和可伸缩性方面的问题)只有在一段时间后或随着容量的增长才会开始显现出来。为了发现潜在的问题,最好在尽可能接近真实生产环境的环境中进行长期的运行测试。

模拟现实世界中的工作负载不仅能帮助你了解数据库的运行方式,还能帮助你学习如何操作与调试数据库,并了解其社区的友好程度和能提供帮助的程度。数据库的选择总是这些因素的组合,而性能通常并不是最重要的方面:使用保存数据缓慢的数据库通常比使用会快速丢失数据的数据库要好得多。

要比较数据库,非常详细地理解用例并定义当前和预期的变量是有帮助的,例如:

  • 表结构和记录大小

  • 客户端数量

  • 查询类型和访问模式

  • 读写查询速率

  • 任何这些变量中的预期变化

明确这些变量可以帮助回答以下问题:

  • 数据库支持所需的查询吗?

  • 数据库能够处理我们计划存储的数据量吗?

  • 单个节点可以处理的读写操作有多少?

  • 一个系统计划要有多少个节点?

  • 鉴于预期的增长率,我们如何扩展集群?

  • 维护过程是什么?

在回答了这些问题之后,你可以构建一个测试集群并模拟你的工作负载。大多数数据库已经有了压测工具,可以用来重现特定的用例。如果没有标准的压测工具用来在数据库生态系统中生成现实中的随机工作负载,那么这可能是一个危险的信号。如果有什么东西让你无法使用数据库自带的工具,那么你可以尝试一个现有的通用工具,或者从零开始实现一个。

如果测试结果理想,那么进一步熟悉数据库代码可能会有更大的帮助。为了阅读源代码,首先要了解数据库的各个部分、如何查找不同组件的源代码,然后浏览这些组件。即使仅对数据库代码库有一个粗略的了解,也有助于你更好地理解它产生的日志和配置参数,并帮助你在使用数据库的应用程序中,甚至在数据库代码本身发现问题。

有些人以为,可以将数据库当作黑匣子而无须了解其中的内容是件好事。但实践往往表明,这样做迟早会碰到bug、服务中断、性能倒退或其他问题。你最好为这些问题做好准备,如果你了解并且理解数据库的内部结构,就可以减少业务风险且更有可能快速地恢复。

用于基准测试、性能评估和比较的一个流行工具是Yahoo! Cloud Serving Benchmark(YCSB)。YCSB提供了一个框架和一组可应用于不同数据存储的公共工作负载集。就像任何通用的东西一样,你应该小心使用这个工具,因为使用它很容易得出错误的结论。为了进行公平的比较并做出明智的决定,你需要投入足够的时间来了解数据库将在何种实际环境下运行,并相应地调整基准测试的内容。

TPC-C基准

事务处理性能委员会(Transaction Processing Performance Council,TPC)提供了一组数据库厂商用来比较和宣传其产品性能的基准。TPC-C是一个联机事务处理(OLTP)基准,它是只读事务和更新事务的混合,用于模拟常见的应用程序工作负载。

该基准关注的是执行的并发事务的性能和正确性。主要性能指标是吞吐量:数据库系统每分钟能够处理的事务数。其需要执行事务具备ACID属性并符合基准本身定义的属性集。

此基准不专注于任何特定的业务部门,但提供了对大多数适用OLTP数据库的应用都很重要的抽象操作集。它包括几个表和实体,如仓库、库存、客户和订单,并指定了表布局、可以对表执行的事务的细节、表的最小行数和数据持久性约束。

这并不意味着基准测试只能用于比较数据库。基准可用于定义和测试服务级别协议注1的详细信息、了解系统要求以及容量规划等。你在使用数据库之前对它了解得越多,在生产环境中运行数据库时节省的时间就越多。

选择数据库是一个长期的决定,最好跟踪新发布的版本,了解到底发生了什么变化及其原因,并制定升级策略。新版本通常包含对bug和安全问题的改进及修复,但也可能会引入新的bug、性能退化或意外行为,因此在部署新版本之前测试新版本也是至关重要的。查看数据库开发者以前是如何处理升级的,可能会让你对将来的情况有一个很好的了解。过去的顺利升级并不能保证未来的升级也会如此顺利,但过去复杂的升级可能也是未来升级亦会不容易的标志。

 

理解权衡取舍

 

作为用户,我们可以看到数据库在不同条件下的行为,但是在使用数据库时,我们必须做出选择来直接影响其行为。

设计一个存储引擎肯定比仅实现一个教科书上的数据结构要复杂得多:很难在一开始就将许多细节和边界情况处理正确。我们需要设计物理数据布局和组织指针、决定序列化格式、了解数据将如何被进行垃圾收集、存储引擎如何适应整个数据库系统的语义、探索如何使其在并发环境中工作,以及最后确保在任何情况下都不会丢失任何数据。

不仅有许多事情需要决定,而且这些决定中的大多数都涉及权衡取舍。例如,如果按数据插入数据库的顺序保存,我们就可以更快地存储它们;但是如果按字典顺序检索它们,我们就必须在将结果返回给客户端之前对它们进行重新排序。正如你将在本书中看到的那样,存储引擎设计有许多不同的方法,每个实现都有它自己的优点和缺点。

在研究不同的存储引擎时,我们会讨论它们的优点和缺点。如果对于每个可以想到的用例都有一个绝对最优的存储引擎,那么人人都一定会使用它。但是并不存在这样的储存引擎,因此我们需要根据服务的工作负载和用例进行明智的选择。

市面上有许多存储引擎,它们使用各种数据结构并且用不同的语言实现—从低级语言(如C)到高级语言(如Java)。所有存储引擎都面临相同的挑战和限制。可以将其与城市规划相类比:我们为特定的人口数量构建一座城市,并选择是在高度上还是面积上对这座城市进行扩展。这两种情况都可以将同样数量的人放入该城市,但这些方法导致了截然不同的生活方式。当在高度上建设城市时,人们住在公寓里,人口密度可能导致面积较小地区的交通流量增加;而在一个面积更大且更分散的城市中,人们更有可能住在大房子里,但通勤则需要走更远的路。

类似地,存储引擎的开发人员所做的设计决策使它们更适合于不同的情况:有些对低读写延迟进行了优化,有些则试图最大化存储密度(每个节点存储的数据量),而有些则专注于运维上的简单性。

在《数据库系统内幕》的小结中,你可以找到可用于实现的完整算法和其他附加参考。阅读本书可以使你为高效地利用这些资料而做好准备,并使你对其中所述概念的现有替代办法有扎实的理解。

本文摘编于《数据库系统内幕》,经出版方授权发布。

推荐阅读
  • 浅谈分布式存储中的网络通信

  • 138 张图带你 MySQL 入门!

  • 如何在 Kubernetes 上配置 Jenkins?

  • 突发!印度封禁抖音、微信、快手等 59 款中国 App

  • 厉害!国内大学生计算机编程第一人,一人挑战一个队,百度最年轻 T10,现创业自动驾驶

  • Balancer因通缩代币STA遭遇闪电贷攻击,价值50万美元资产被黑

  • 浅谈分布式存储中的网络通信

真香,朕在看了!

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

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

相关文章

医疗数据典型特征及架构发展方向研究

前言 医疗健康产业目前呈高速发展状态,处在互联网对医疗行业赋能的关键阶段,由于医疗行业数据的隐私性较强,通过传统方式很难获取公开的医疗健康数据进行研究,根据阿里云天池比赛赛题设置研究及提供的脱敏数据集着手进行分析是比…

分布式事务 GTS 的价值和原理浅析

GTS 今年双 11 的成绩 今年 2684 亿的背后,有一个默默支撑,低调到几乎被遗忘的中间件云产品——GTS(全局事务服务,Global Transaction Service),稳稳地通过了自 2014 年诞生以来的第 5 次“大考”。 2019 …

kafka java.net.UnknownHostException: node4 Error connecting to node node4:9092

解决:修改kafka的server.properties文件 vim /kafka安装路径/config/server.properties 去除下面这行配置的注释,并设置对应的ip地址 #advertised.listenersPLAINTEXT://your.host.name:9092 advertised.listenersPLAINTEXT://192.168.92.104:9092 重启…

看全新升级的KubeSphere 3.0 如何助力企业在容器混合云时代乘风破浪?

数据时代,层出不穷的创新型业务对企业IT提出了更高的要求,业务、技术和管理方面的挑战也逐渐显现。对此,越来越多的企业希望能够快速、简单地创建企业应用,敏捷地满足业务创新的需求,同时还能维持极高的企业级服务水平…

5G的7大用途,你知道几个?

阿里妹导读:5G时代悄悄来临,甚至成为街头巷尾都在讨论的话题。相信你一定有过一些疑问:什么是5G?仅仅只是网速更快吗?5G如何做到毫秒级的延迟?网络切片是什么?5G的标准之争是怎么回事&#xff0…

ALive:淘宝双11直播,技术同学却可以“偷懒”?

“疯狂的”淘宝直播间 今年直播又火了! 2019年双11淘宝直播带来近 200亿 成交,以天猫双11交易总额2684亿计算,直播已经占总成交额的近 7.45%! 今年的变化 除了以往的手淘和猫客,现在 UC 浏览器、新浪微博、支付宝、…

虚拟机安装centos

到官网下载centos系统: https://www.centos.org/download/ 有三种选择(DVD IOS,Everything IOS, Minimal IOS(精简版的)),建议使用DVD IOS 安装虚拟机: #选择典型安装: #选择稍后安装&#…

KAFKA SpringBoot2 Nacos 消息异步发送和消费消息(进阶篇)

文章目录一、基础集成1. 技术选型2. 导入依赖3. kafka配置4. auto-offset-reset 简述5. 新增一个订单类6. 生产者(异步)7. 消费者8. kafka配置类9.单元测试9. 效果图10. 源码地址11.微服务专栏一、基础集成 1. 技术选型 软件/框架版本jdk1.8.0_202spri…

看懂别人的代码,只是成为高效程序员的第一步!

作者 | SeattleDataGuy译者 | 弯月,责编 | 屠敏出品 | CSDN(ID:CSDNnews)在为面试做准备的时候,很多软件工程师都花费了大量时间做编程题和完善简历。最终在找到一份工作后,无论是在创业公司、Google、亚马…

响应速度不给力?解锁正确缓存姿势

阿里妹导读:响应时间长,遇到性能瓶颈时,开发者第一个想到的总是性能优化。《什么技能产品经理不会提,但技术人必须懂?》讲到了什么时候需要使用缓存。但缓存的用法是什么?一旦缓存使用不当,或稍…

Spring Boot2 集成 jasypt 3.0.4 配置文件敏感信息加密

文章目录1. 导入依赖2. yml中添加配置文件3. 加解密工具类4. 敏感信息替换5. 编译打包6. 启动项目1. 导入依赖 <!--敏感信息加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifa…

技术直播:1小时突击Java工程师面试核心(限免报名)

后疫情时代&#xff0c;连程序员这个多金的职业也遭受到了一定程度的打击。从各大招聘网站和多次面试经历中&#xff0c;相信大家已经意识到&#xff0c;面试官对程序员技能体系和项目经验考核似乎更严苛了。你在面试中常常为什么苦恼呢&#xff1f;简历撰写&#xff1f;数据算…

重塑云上的 Java 语言

音乐无国界&#xff0c;但是音乐人有国界。 云原生亦如此。虽没有限定的编程语言&#xff0c;但应用所使用的编程语言已经决定了应用部署运行的行为。 Java 诞生于20年前&#xff0c;拥有大量优秀的企业级框架&#xff0c;践行 OOP 理念&#xff0c;更多体现的是严谨以及在长…

5分钟带你看懂 GCanvas渲染引擎的演进

本文内容大纲&#xff1a; 1、轻量级图形渲染引擎与应用 2、渲染引擎演进与优化之路 3、渲染引擎未来的发展方向 GCanvas 的定位是遵循 w3c 标准的跨平台的轻量级图形渲染引擎。有清晰的定位和目标&#xff0c;并且紧贴现有的业务&#xff0c;为业务提供丰富表现形式。 GCa…

免费技术直播:唐宇迪带你一节课了解机器学习经典算法

常常有小伙伴在后台反馈&#xff1a;机器学习经典算法有哪些&#xff1f;自学难度大又没有效果&#xff0c;该怎么办&#xff1f;CSDN为了解决这个难题&#xff0c;联合唐宇迪老师为大家带来了一场精彩的直播【一节课掌握机器学习经典算法-线性回归模型】。本次直播将帮大家了解…

Centos7 安装Go环境

文章目录1. 下载2. 解压 和目录创建3. 配置环境变量4. 刷新环境变量5. 验证1. 下载 https://golang.google.cn/dl/ wget https://golang.google.cn/dl/go1.17.1.linux-amd64.tar.gz2. 解压 和目录创建 tar -zxvf go1.17.1.linux-amd64.tar.gz -C /usr/local/ mkdir gocode3…

深度学习在商户挂牌语义理解的实践

​导读&#xff1a;高德地图拥有几千万的POI兴趣点&#xff0c;例如大厦、底商、学校等数据&#xff0c;而且每天不断有新的POI出现。为了维持POI数据的鲜度&#xff0c;高德会通过大量的数据采集来覆盖和更新。现实中POI名称复杂&#xff0c;多变&#xff0c;同时&#xff0c;…

云计算与星辰大海的结合——不要回答,来自百亿光年外的未知信号

作者 | 硬核云顶宫责编 | Carol出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;今年在疫情的影响下&#xff0c;各国的经济发展都遇到了一些困难&#xff0c;甚至除中国以外的主要经济体都会进入了负增长的情况&#xff0c;不过越是这样的时候&#xff0c;越…

让大数据分析更简单,4步教你玩转MongoDB BI Connector

MongoDB使用BI Connector支持BI组件直接使用SQL或ODBC数据源方式直接访问MongoDB,在早期MongoDB直接使用Postgresql FDW实现 SQL到MQL的转换,后来实现更加轻量级的mongosqld支持BI工具的连接。 安装 BI Connector 参考 Install BI Connectorhttps://docs.mongodb.com/bi-conne…

谷歌排名第一的编程语言,收下这份资料,小白也能学的会!

学习 Python 的过程中你是否有过这样的问题&#xff1a; 应用方向太多了&#xff0c;不知道该选择哪个&#xff0c;也不知道学习路径是什么。 入门简单&#xff0c;但是精通很难&#xff0c;每次学完做练习项目时都头疼&#xff0c;没思路&#xff0c;甚至怀疑自己不适合编程。…