`

想扩展你的数据库吗?那么先了解一下I/O

 
阅读更多

本文选自 HighScalability上的一篇博客文章,作者系 Tokutek公司(Tokutek能够提升MongoDB, MySQL以及MariaDB的性能20倍)的一位工程师,该公司研究的主要方向是存储引擎。CSDN编译整理如下: 

作为一名软件开发者,我们非常看重那些抽象化的东西。API越简单,对我们越有吸引力。辩证地讲,MongoDB最大的优势就是“优雅”的API和它的敏捷性,这让开发者的编码过程变得异常的简单。

但是,当MongoDB涉及到大数据可扩展性问题时,开发者还是需要了解一下它的底层,弄明白那些潜在的问题,然后才能快速地进行解决。如果不理解,最终可能会选择一个低效的解决方案,而且浪费了时间和金钱。本文重点介绍了,如何为大数据的扩展性问题找个一个高效的解决方案。 

定义问题 

首先,我们要确定应用的上下文,本文主要讨论的是MongoDB的应用程序。这意味着,我们将研究一个分布式文档存储数据库,而且它还支持二级索引和分片集群。如果是针对其他的NoSQL产品,像Riak或者Cassandra,我们可能会讨论I/O瓶颈问题,而本文主要关注MongoDB的一些特性。 

其次,这些应用能够做什么?是做联机事务处理( OLTP)还是做联机分析处理( OLAP)?本文主要讨论的是OLTP,因为对MongoDB而言,OLAP还是一个不小的挑战,或者说基本不能够进行处理。 

第三,大数据是什么?通过大数据,我们能够处理和使用更多的数据,不再局限于单机RAM中的那些部分。这样的话,有些数据保留在服务器上,而更多的数据则是存放在磁盘中,这就需要I/O的访问。但是请注意,我们不是在讨论数据库够不够大,而是关注那些经常被存取和使用的数据(有时称之为“工作集”)是不是很小。比如说,磁盘上虽然存储了好几年的数据,但是应用可能经常访问的只有最后一天的数据。 

第四,OLTP应用的限制性因素有哪些?简而言之,就是I/O。硬盘驱动每秒钟只可以启动上百次的I/O,而另一方面,RAM每秒可以实现数百万次的存取,这个限制性因素就是导致大数据应用I/O瓶颈的原因所在。 

最后,我们应该如何解决I/O瓶颈?通过分析思维,公式和直接指令给我们提供了很多种方式,但是一个持久性的解决方案就需要“理解”。用户必须着眼于应用程序的I/O特性,然后才能做出最好的设计决策。

开销模型 

未来解决I/O瓶颈,第一步需要掌握哪些数据库操作会包括I/O。 无论MongoDB,还是其他的数据库类型,都有三种基本的操作:

Point Query:查找一个独立的文件。在一个给定的位置的文件夹(磁盘或者内存上),检索该文档。对于大数据来说,该文件可能不在内存中。此操作可能会导致一次I/O。

Range Query:在索引中,查找大量的连续性文件,对比Point Query而言,它是一个更高效的查询操作。这是因为我们查找的这些数据都是打包存放在磁盘上,可以通过极少的I/O操作来直接读入内存。Range Query一般检索100个文件才会启动一次I/O,相对比,100个Point Query检索100个文件可能就需要100次I/O操作。

Write:写文件到数据库中。类似MongoDB这样的数据库,都会产生I/O。而对那些“写优化”数据结构的数据库而言,比如 TokuMX,仅仅需要很少的I/O。不像MongDB,“写优化”的数据结构能够通过执行多次插入来分摊I/O。

在了解三个基本操作对I/O的影响之后,还需要理解MongoDB数据库语句对I/O的影响。MongoDB包含了这三个基本操作,同时还构建了四个用户级别的操作: 

 

  • 插入:将一个新文件写到数据库中。
  • 查询:在集合上使用索引,这样做一个Range Queries和Point Query的整合。如果该索引是一个覆盖索引或者是集群索引,那么接下来基本上只需要做范围查询。否则的话,整合的范围查询和点查询就会被启用。
  • 修改和删除:这是一个查询和写操作的整合。查询操作用于发现那些需要更新和删除的文件,然后写操作再对这些文件进行修改或者是删除。

 

现在,我们理解了开销模型。不过为了解决I/O的瓶颈问题,用户还需要知道哪些应用启动了I/O操作。这就需要我们了解数据库的行为。I/O启动是源于查询操作吗?如果是这样的话,查询行为是如何影响I/O的?还是源于修改操作?如果是因为修改导致的影响,那么是因为修改过程中的查询操作还是插入操作?一旦用户掌握了哪些因素会影响 I/O,接下来就可以逐步来解决瓶颈的问题了。

假设我们明白了某个应用的I/O特性,我们就可以探讨几种途径来解决这一问题。我最喜欢的方式是这样的:首先尝试使用软件来解决该问题,如果不能完美的解决,那么再考虑硬件。毕竟软件的成本更低且易于维护。 

 

 

可行的软件解决方案

一个可行的软件解决方案,就是需要减少软件或者应用的I/O启动次数。针对不同的瓶颈,下面列举了对应可行的解决方案:

问题:插入操作导致过多的I/O 

可行方案:使用一个写优化的数据库,比如说TokuMX,使用TokuMX的一项优势就是它能够大幅度减少对写操作的I/O请求,而索引方式使用的是Fractal Trees TokuDB实际上还对Fractal Trees做了改进,将插入的IO数量级从log(N)提高到了logB(N)) 

问题:查询操作导致过多的I/O 

可行方案:使用一个更好的索引,减少点查询,尽量使用范围查询替代。在我看来,还是需要“理解索引”。我解释了索引能够减少查询操作的I/O请求。当然这不是用一两段话就可以说得清的,但是要点如下:减少应用的I/O请求首先要避免独立的点查询来检索每个文件夹,为了实现这点,我们要使用覆盖或者集群索引,这样可以智能地过滤掉在查询过程中已经分析过的文件,然后再使用范围查询报告结果。 

诚然,一个好的索引方式还不足够,如果是一个OLTP应用,那么所有的查询从本质上讲都是点查询(因为他们只是检索极少的文件),即使使用一个完全适合的索引,用户还是会出现I/O的瓶颈问题。在这种情况下,硬件的解决方案就是必要的。

当然,增加索引也意味着增加插入的成本,因为每个插入操作都要保证索引的及时更新,但是写优化的数据库可以减少一定的成本。这也是我一直强调我们需要理解应用的原因所在,对于某些应用来说,一个可行的解决方案,并不代表也适用于其他的应用。

问题:修改或者删除导致过多的I/O

解决方案:整合以上所有的解决方案

修改和删除之所以复杂是因为这是查询和插入的一个整合。提升它们的性能要求对操作开销有一个很好的理解。哪部分操作会涉及到I/O?是查询?如果这样,我们就提升索引。是写操作?还是兼而有之?简单来讲,就是哪部分操作牵涉到I/O问题,我们就应用对应的解决方案。 

一个很常见的错误就是:当我们使用一个写优化的数据库(像TokuMX),在不改变任何索引的情况下,就希望它能够消除修改或者删除的I/O瓶颈问题。毕竟,写优化的数据库还是不足够的,在修改/删除过程中的隐含的查询也必须进行处理。

可行的硬件解决方案 

就像上文提到的那样,当软件解决方案不能够解决问题的时候,我们就需要寻求硬件的解决方案。我们先分析一下硬件的优势和劣势:

 

  • 购买尽可能多的内存,即使难以做到,也要把工作集放到内存中
  • 使用SSD来增加IOPS 
  • 购买更多的服务器,并使用一个可扩展的解决方案,其中包括 
  • 通过副本进行读扩展 
  • 分片 

 

购买更多的内存

RAM是很昂贵的,而且在一台机器上可扩展的内存也是有限的。如果数据太大,都保存在RAM中也不是一个可行的选择。这种解决方案可能适于用大多数的应用,但我们更关注那些这种方案解决不了的应用。

使用SSD存储

不可否认,如果存储设备使用SSD提升吞吐量,这绝对是一个很实用的解决方案。如果I/O成为应用的限制性因素,那么增加IOPS(每秒的I/O操作)理所当然地能够增加吞吐量,简单且使用。

然而,SSD的成本和硬盘的成本也不一样,SSD绝对可以显著地提升I/O的吞吐量,虽然成本也不便宜,但是更轻、容量更大,速率也更快。那么为了降低成本,数据压缩就是一个关键。 其实,虽然硬件成本增加了,但这并不意味着管理成本也会增加: 

通过副本进行读扩展 

当查询操作成为应用的瓶颈,那么通过副本进行读扩展就是一个非常有效的解决方案。想法如下: 

 

  • 使用备份功能,将多个数据拷贝到相互独立的机器上 
  • 分布地在不同的机器上进行读取,这样将会提升读的吞吐量 

 

 

如果在单一的机器上进行读操作而且传输出来,这样会出现很大的瓶颈。如果有多个副本的话,应用将有更多的资源可用,因此读写方面都将有很大的提升。

 

如果是插入、修改或者是删除过程存在瓶颈,那么副本可能就不会那么的高效。这是因为写操作需要将数据备份到所有的服务器的副本集上,机器在数据的输入过程中也面临同样的瓶颈问题。

分片 

基于shard key,分片片将数据切分到不同的副本集,集群中不同副本集负责相应范围的值。所以,可以通过将写操作分配给集群中不同的副本集来提升应用程序的写吞吐量。对于写负载高的应用,分片可以非常有效的。

在shard key空间中将数据按范围划分,使用shard key横跨多个副本做范围查询可以非常有效。如果将shard key哈希,那么所有范围查询必须运行在集群中的所有分片,但是在shard key上的点查询只运行在一个分片上。shard key哈希,据结构模型并且不支持join,分片用起来非常的高效且简单。如果上述的方案都不足以解决应用的瓶颈问,那么你可以在分片上多下工夫了。

无论如何,分片都是一个重量级的解决方案,而且成本非常之高。对初入者来说,你的硬件投入预算需要增加好几倍。不仅仅需要为分片设置增加服务器,还需要增加一整套副本集。你还需要增加和管理配置服务器,考虑到成本问题,用户需要慎重考虑分片是不是很必要。通常来讲,上面所有方案都比这个节省成本。 

另外一个很大的挑战就是选择一个shard key,一个好的shard key有以下特点:

 

  • 大多数(如果不是全部)的查询都使用shard key,任何查询(没有使用shard key)必须运行在所有的分片上。这点可能比较麻烦。
  • shard key应该非常有利于集群不同副本及上的分布写操作,如果所有的写操作都对应到集群上同一个副本集,那么该副本集对于写操作来讲,就会成为一个瓶颈,就好像处在一个非分片的设置中,这样的话,这种情况糟糕到就像使用时间戳作为shard key。

 

 

这些要求并不是很容易实现。有时,一个好的shard key并不存在,这让分片变得极不高效。 

总结

很多解决方案都行得通,但是没有一个能百分百得到保障的,甚至包括分片。这也是作者强调的:理解应用的特性是至关重要的。工具可以解决问题,但是如何更好地使用工具,这就取决于用户了。(文/王鹏,审校/仲浩)

背景资料:

TokuDB是一个高性能、支持事务处理的MySQL和MariaDB的存储引擎。TokuDB的主要特点则是对高写压力的支持。在今年4月份,TokuDB v7发布了,项目托管在GitHub上,宣布开源。TokuDB V7主要特点有:快速Trickle负载,快速批量负载,快速通过聚集索引范围查询,无碎片化,完全兼容MySQL/ MariaDB,易于安装。(信息源于 CSDN 

分享到:
评论

相关推荐

    PI数据库介绍.doc

    I/O与磁盘调度; 主内存数据库系统; 不精确计算问题; 放松的可串行化问题; 实时SQL; 实时事务的可预测性; 研究现状与发展 因为国内的实时数据库产品不论在技术性能、用户功能扩展等方面远不如国外的产品 先进...

    蓝天碧海系列小型数据库解决方案

    公司的成功与其支持全天候运营的能力成正比。意外的停机将影响到数据检索和其它的业务流程,这意味着效益损失,并...采用具有高 I/O 能力和扩展能力的 DS4700;可以通过 HACMP 高可靠群集,为整个系统提供最高可靠性。

    NoSQL数据库笔谈

    I/O的五分钟法则 不要删除数据 RAM是硬盘,硬盘是磁带 Amdahl定律和Gustafson定律 万兆以太网 3. 手段篇 一致性哈希 亚马逊的现状 算法的选择 Quorum NRW Vector clock Virtual node gossip Gossip (State Transfer ...

    数据库基于三范式的优化

    从基本表设计、扩展设计和数据库表对象放置等角度进行讨论,着重讨论了如何避免磁盘I/O瓶颈和减少资源竞争,相信读者会一目了然

    实时数据库比较.doc

    因为国内的实时数据库产品不论在技术性能、用户功能扩展等方面远不如国外的产品先 进、成熟、稳定,所以对于国内的产品不予考虑。 目前在国内比较流性的国外实时数据库产品有美国Wonderware公司的Industrial SQL,...

    Graphite 是一个高度可扩展的实时图形系统,同时也是一种企业级监视工具.rar

    如果你有一个可能会随时间变化的数字,并且你可能想把这个值随时间变化的情况用图表表示出来,那么Graphite可能可以满足你的需求。 具体来说,Graphite被设计用来处理数字时间序列数据。例如,Graphite就很适合绘制...

    大数据云计算技术系列 NoSQL数据库学习教程(共71页).pdf

    2 I/O的五分钟法则 2 不要删除数据 2 RAM是硬盘,硬盘是磁带 2 Amdahl定律和Gustafson定律 2 万兆以太网 3 手段篇 3 一致性哈希 3 亚马逊的现状 3 算法的选择 3 Quorum NRW 3 Vector clock 3 Virtual node 3 gossip 3...

    oracle数据库dba管理手册

    4.1.2 所有数据库文件中的I/O瓶颈 59 4.1.3 后台进程中的并发I/O操作 61 4.1.4 定义系统恢复能力与性能目标 61 4.1.5 系统硬件及结构镜像的定义 62 4.1.6 识别专用于数据库的磁盘 62 4.1.7 选择正确的设计 63 4.2 I/...

    分布式数据库设计方案.doc

    SQL Server数据库的复制/订阅技术 复制/订阅数技术可以实现读、写分离,数据先写到中心数据库上,写成功即返回给应用 程序;通过复制将数据复制到只读服务器,查询时从只读服务器查。 意味着订阅端的数据和中心...

    数据库系统实现

    2.3.1 计算的I/O模型 2.3.2 辅助存储器中的数据排序 2.3.3 归并排序 2.3.4 两阶段多路归并排序 2.3.5 扩展多路归并以排序更大的关系 习题 2.4 改善辅助存储器的访问时间 2.4.1 按柱面组织数据 ...

    linux数据库主从复制

    1、从库上面启动一个I/O线程,(5.5以后多线程)连接到主服务器上面请求读取二进制(Bin-log)日志文件 2、把读取到的二进制日志写到本地的Realy-log(中继日志)里面 3、从服务器上面同时开启一个SQL线程,读取...

    java_jsp项目源码_+SQL电量监视系统设计与实现(源代码+论文).rar

    1. 实时监控:系统通过定时任务每隔一段时间(如5分钟)自动采集数据库的电量数据,包括CPU使用率、内存使用率、磁盘I/O、网络I/O等关键指标,实时展示在前端界面上,方便用户随时了解数据库的运行状态。 2. 历史...

    building_storage_networks_chsSAN存储区域网络 .rar

    既然所有这些信息都以数字化形式存在,那么我们每一个人都想享用它们。 网络世界的商业 现在,几乎没有人对网络互联的价值提出什么疑问了,可是在几年前,公司都牢牢地控制存储信息的容量及其访问范围。Internet...

    PLC系统方案设计.doc

    可扩展性 这要求工程师,在系统总体规划时,应充分考虑到用户今后生产发展和工艺改进的需要 ,在控制器计算能力和I/O端口数量上应当留有适当的裕量,同时对外要留有扩展的接口 ,以便系统扩展和监控的需要。...

    MFC应用程序在.NET框架下的扩展

    全书共分11章,内容包括正则表达式、文件I/O和注册表、数据加密、XML和DOM、ADO .NET数据库、远程处理、事件日志等。为了让读者透彻理解如何运用.NET框架来扩展MFC程序,作者为每个知识点配备了演示程序并提供了实用...

    高级UNIX编程 pdf 电子书

    全书共9章,内容包括:基本概念、基本文件I/O、高级文件I/0、终端I/O、进程与线程、基本进程间通信、高级进程间通信、网络技术与套接字,以及信号与定时器等。涉及POSIX、FreeBSD、Solaris、Linux等几大主流系统...

    MFC应用程序在.NET框架下的扩展下载

    全书共分11章,内容包括正则表达式、文件I/O和注册表、数据加密、XML和DOM、ADO .NET数据库、远程处理、事件日志等。为了让读者透彻理解如何运用.NET框架来扩展MFC程序,作者为每个知识点配备了演示程序并提供了实用...

    数据库设计方案.docx

    块则是数据库的I/O 最小的单位。本项目的数据库逻辑划分包括空间数据库和非空间数据库。 2、矢量数据逻辑设计包含了公共基础数据、林业信息资源中的矢量数据,综合对黑龙江林业数据源和功能进行分析,将矢量数据按照...

    node即学即用 (英文版) Node: Up and Running, Scalable Server-Side Code with JavaScript

    《node即学即用》讲解...内容涉及跨服务器的并发连接、非阻塞i/o 和事件驱动的编程、如何支持各种数据库和数据存储工具、node api 的使用示例等。 《node即学即用》适合对javascript 及编程有一定程度了解的读者阅读。

Global site tag (gtag.js) - Google Analytics