热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

另一条路去IOE:全内存数据库弯道超车

文何鸿凌,作者就职于中国移动集团公司业务支撑系统部,从事大数据平台规划工作,微博@BigData分析老祖宗留下了《易经》这本书,告诉我们世界的本质是“变化”的,“变化”之间有相关性。比如云计算的兴起是由于计算机的带宽快速增加引起的,大数据的兴

文 / 何鸿凌,作者就职于中国移动集团公司业务支撑系统部,从事大数据平台规划工作,微博@BigData分析 老祖宗留下了《易经》这本书,告诉我们世界的本质是“变化”的,“变化”之间有相关性。比如云计算的兴起是由于计算机的带宽快速增加引起的,大数据的兴

文 / 何鸿凌,作者就职于中国移动集团公司业务支撑系统部,从事大数据平台规划工作,微博@BigData分析

  老祖宗留下了《易经》这本书,告诉我们世界的本质是“变化”的,“变化”之间有相关性。比如云计算的兴起是由于计算机的带宽快速增加引起的,大数据的兴起是由于数字化进程引发的。

  当今的IT界最重要的“变化”就是摩尔定律。曾几何时,程序员们沉醉于用C语言精妙的语句节省了数KB内存空间,现在大家都用上了逻辑更加清楚、更易于大规模协作的JAVA,而对语言效率看得不那么重要。计算和存储能力变得越来越廉价的“变化”引发了其上软件产品的“变化”。

  软件产品构建在以CPU、内存、外存(磁盘)为边的三角形之上。摩尔定律对三条边的影响程度各有不同。内存的性价比每15个月倍增,CPU的性价比每18个月倍增,但磁盘存储(主要的外存)的性价比增长并不遵循摩尔定律(因为它是磁的不是晶体管的)。更加重要的是:内存带宽的增长是符合摩尔定律的,而磁盘的带宽(从IDE到SATA、SAS)提升速度甚至还落后于磁盘容量性价比的提升。

  因此,代表内存的那条边伸长得太快以至于三角形无法维持其形状,构建在上面的软件产品面临惨烈的“颠覆”,以ORACLE为代表的数据库软件(DBMS)首当其冲,因为它们是数据密集型的。按照数据库使用内存和外存的特点,可以分为三个时期:

  内存昂贵的时期:摩尔定律的效果还在累积,内存远比外存昂贵。大部分的数据、索引、日志和临时空间都只能放在外存磁盘之上,内存起到的作用只是缓存。ORACLE、DB2、SYBASE等皆是在这个时代的产物,遗憾的是它们似乎历史的包袱太沉重,现在大半个身子还停留于此时代,怪不得数据库大师Mike.Stonebraker称他们为30年前的技术。

  SSD外存崛起的时期:后SSD逐渐成为可选择外存之一,而SSD的容量性价比是符合摩尔定律的,带宽提升也非常快(如PCIE接口)。于是业界有一些改进尝试。比如阿里巴巴当前的交易系统在去IOE后是采用的MYSQL数据库Sharding方案,并将数据“全部”存储在PCIE接口的SSD上。各传统数据库也发展出自己的StorageGroup方式来支持支持SSD做“热”数据存储的选项。比如Oracle推出了一体机Exadata,可以选择将“部分”数据缓存到到SSD上,但其大规模的存储还是利用磁盘。另外有一些技术型公司,如沃趣科技,推出了将Oracle的“全部”数据放到SSD上的方案,取得了很好的效果。

  内存颠覆外存的时期:全内存数据库其实早就出现了,例如被Oracle收购的TimeTen、被DB2收购的SolidDB、韩国的AltiBase等,但是由于之前内存还是一个比较昂贵的选择,因此内存数据库只是小规模使用。随着摩尔定律效应的累计,内存的价格持续下降、速度持续增加,量变成为质变,VoltDB、HANA、MemSQL等一系列练就了独门功夫的内存数据库如雨后春笋般出现。他们的共同特点就是所有数据都存储在内存中。这其中每个数据库又有自己的特点,比如VoltDB颠覆了原有数据库设计理论,通过全局时钟和预编译的方法来进行并发控制,避免了锁等开销,很好地适应了OLTP类应用;HANA通过内存列存储和极限压缩来支持更快的大数据分析任务;MemSQL重新设计了Mysql的存储引擎部分,使之更加适应内存。

  我们现在已经可以清楚地看到内存替代外存的趋势,因此可以断言:今后内存将是存取数据、索引的主要发生地,而不仅仅是缓存某些数据。SSD可能会作为快速数据持久化的手段,保证断电以后当前数据的安全。而速度更慢的机械磁盘可能作为备份的手段,替代磁带保证历史数据的可用性。

  如果认可而摩尔定律推导的这个趋势,就必须审视它会对未来的系统架构和软件带来何种的影响。预写日志、日志检查点、回滚和前滚、B树索引等现有数据库特性都是基于使用机械磁盘的假设。机械磁盘寻道时间长故随机存取速度慢,这与SSD和内存等高速随机存取器有非常大的差别。为了适应机械磁盘的特点,数据库管理系统(DBMS)利用了大量的代码将随机存取变成顺序存取。比如日志,一个事务写一次日志很自然,但是为了要顺序存取,就要缓存一批日志再一次性写入磁盘。这就又带来了事务持久化的新问题,因此需要大量的代码为之服务。B树索引也是为磁盘顺序存取优化的,在SSD和内存等随机存取器中显得完全没有必要。

  如果要使用高速且随机存取的内存作为主要存储器,那么最好对整个数据库的架构进行全新的设计。可以看到VoltDB和HANA正是这样做的,抛弃了很多传统的包袱,轻装上阵。Oracle和DB2的历史包袱太沉重,他们不可能抛弃自己的遗产,只能采取优化的方式,比如ORACLE12c中也推出了内存列存储,DB2新的BLU特性也允许激进地使用内存,但其底层的数据存储,还是为机械磁盘来优化的。

凯文.凯利说颠覆总是从边缘开始,因为只有抛弃传统、独辟蹊径,才能发现新的技术范式,在数据库领域也是如此。可以预测要不了几年,内存数据库就会从事务处理系统开始全面取代磁盘数据库的领先地位。很高兴的是,我们看到联想、华为、南大通用等国内的软件公司已经认识到这一点,已经在内存数据库方面进行了颇多的探索,有的已经有了相应的产品。南大通用最近准备筹资5000万用于内存数据库产品的进一步研发。

  看到未来的趋势,顺应潮流,拥抱变化的世界,这种方式的“去IOE”是弯道超车。这是《易经》告诉我们的道理。

推荐阅读
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
author-avatar
涩味122_508
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有