内存数据库

Author: Rainny

最近也大概了解了一下这个稍微有点生辟的东东,下面浅谈一下我的理解。

内存数据库(in-memory database),顾名思义,就是装在内存中的数据库,它和传统的磁盘数据库在某些方面既有区别,又有互相借鉴的地方。

首先来谈两者的区别:

磁盘数据库:这是目前占绝对主流的数据库,也是商业上应用最多,发展时间长,比较成熟的数据库产品。ORACLEDB2SQL SERVER等,都属于磁盘数据库。磁盘数据库的数据主要是存放在磁盘中,以物理文件的形式(数据文件)存储。当读取数据时,数据块需要从磁盘中加载(也可说是复制或拷贝)到内存中。更改数据时,也是先更改数据库缓存(内存)中的数据块副本(内存中被更改的数据块称之为脏内存),然后再以同步,或异步的方式将内存中更改的数据写入到磁盘。所以,在磁盘数据库中,数据的读取和修改,都存在着大量的I/O,包括随机的I/O(数据的写入)和顺序的I/O(重做日志的写入)。由于数据主要是存放于磁盘中,所以,磁盘数据库可以存储海量数据,几百T甚至上千T,这取决于磁盘阵列的容量。

内存数据库:这是新发展的技术,在商业上的应用不是太多,发展时间不长(才十几年),产品的成熟度相比磁盘数据库来说差太远,主要应用于一些实时响应度要求比较高和性能要求比较高的系统,内存数据库在电信行业用的比较多,如电信的业务支撑系统(BSS),计费系统(BOSS)等等。像雷达的坐标,以及火箭发射时的高度,倾斜度等参数都是一些实时数据,对于处理这种类型的数据,以传统的磁盘数据库的响应速度,是胜任不了性能要求的。对于微秒级的响应速度,一般是采用内存数据库。内存数据库整个数据库构建于内存当中,也就是说,数据库的结构,各种对象(表,索引等),数据,都是完全驻留于内存中的。这和磁盘数据库的缓存和应用程序的缓存稍微有点区别,磁盘数据库的缓存本质上只是暂时的存放数据,数据的永久存储是在磁盘的数据文件中。而内存数据库的数据不是暂时的缓存在内存中,而是永久的存储在内存中,所以,读取数据和更改数据,都是直接在内存中完成,不需要磁盘I/O。再者,内存数据库是一个独立的数据库系统,它的设计,如数据的访问方式等都是以内存为主进行了优化,而磁盘数据库中的缓存技术并不能脱离磁盘数据库的底层框架,它只是为了提高磁盘数据库性能的一种辅助解决方案。在早先,也有很多技术人员尝试过通过尽量将磁盘数据库的数据缓存到内存来提升数据库的性能,但这种实现方式充其量只能算是和内存数据库的概念耦合,最多算是用应用程序来实现的内存数据库的原型或者是雏形。而内存数据库是抛开了磁盘数据库的羁绊而发展出来的独立数据库产品。所以内存数据库在实现上有可能和磁盘数据库完全不同(如数据的存储方式,索引的结构,数据的访问方式,CPU的使用,系统的调用等)

由于内存的存储量相比磁盘而言小得多,虽然现在几十G,甚至上百G的内存容量已经实现,但由于受物理内存存储量的限制,内存数据库管理的数据量还是比磁盘数据库小得多,一般而言,内存数据库能够管理十几20G的数据量已经算是比较大的数据库了。所以,在使用上,一般是将经常频繁读取的数据才存放于内存数据库中。在实际的项目中,磁盘数据库和内存数据库并存(很少只单独使用内存数据库的CASE)。在这种架构中磁盘数据库用于存储可异步处理的数据,内存数据库用于存储必须快速处理,及时响应的数据(如电信计费系统,呼叫中心等一些业务支撑系统,用户的资料信息和费用信息等一些数据量不大的数据都存放于内存数据库中,举个例子,当客户打入电话进行话费充值时,马上就能查出用户的资料信息和费用信息并作出快速的响应,让用户能够在几秒之间完成充值,而将话费充值记录记入历史表等操作一般是在磁盘数据库完成)。

由于内存和磁盘在物理上的差别, 磁盘上读写数据是进行磁头的机械移动,从内存中读写数据则是电信号的移动,两者速度完全不在一个数量级上,所以内存数据库和磁盘数据库的性能也不在一个档次上,根据来自于一些实际项目的普遍反应,内存数据库比磁盘数据库快10倍以上。

接下来再谈谈相同点,或者说互相有借鉴的地方:

内存数据库和磁盘数据库一样,都是数据库产品,并且是关系型RDBMS,所以,数据库对象基本相同,有表,索引等,对象与对象之间存在诸如参考完整性约束等的关系。它们都有事务,且事务都遵循ACID原则。它们都允许多用户并发访问并有锁机制。为了确保数据的安全,它们也都有备份和恢复机制。SQL是他们的标准操作语言。内存数据库和磁盘数据库一样,都提供JDBC等用于开发的API及连接组件。

基于这些相同点,内存数据库借鉴了很多磁盘数据库的机制。比如:为了确保持久性和提供数据恢复,内存数据库也有写日志和CHECKPOINT,严格意义上来讲,内存数据库并非是完全基于内存的数据库,虽然它的数据长期驻留在内存,但由于内存在一些情况下会发生数据丢失,如断电,服务器关闭等,所以,内存数据库的数据还是需要有一份备份在磁盘中,以供在断电,服务器重启等情况下提供数据库恢复。虽然,现在有很多机制可以确保内存的数据长期不会丢失,如不断电系统(UPS),双机STANDBY(通过这些机制,据说电信某企业的内存数据库不断电平稳地运行了6),但这些机制,都不能绝对保证内存数据库的安全,所以,内存数据库的数据还是必须以异步的方式DUMP到磁盘中。这和磁盘数据库写重做日志的原理相似,所以,内存数据库还是会产生I/O,只不过是有序的I/O。在内存数据库中,随机的I/O非常少(根据磁盘的物理原理,有序的I/O比随机的I/O要快上10倍以上),所以内存数据库的性能一般也要比磁盘数据库的性能快上10倍以上。有些报道说随着固态硬盘技术(SSD)的发展,有可能磁盘数据库和内存数据库的性能差距会进一步缩小,但基于磁盘和内存的物理原理,可以肯定的是,内存数据库总是会快于磁盘数据库。

内存数据库分2种架构:

n C/S模式:这和传统的客户端/服务器模式相同,应用程序作为客户端,通过数据库连接组件(JDBC)来连接数据库服务器。C/S模式的好处是架构相对独立,扩展性强,部署方便。缺点是,既然是C/S模式,所以客户端和服务器之间一般是需要经过网络连接。经过网络连接就会受网络带宽的限制,所以性能上会受到一定的影响。

n 嵌入到应用程序层(application tier):这种方式是将内存数据库嵌入到靠近应用程序存储区如应用服务器层,这样应用程序就能更好的访问内存数据库。这种架构的好处是应用程序和内存数据库无缝接合,提供更佳的响应速度和性能。缺点是,由于要嵌入到中间层,所以部署和开发要稍微复杂一些。OracleTimesten即是这种架构。

我前面说过,内存数据库很少单独地部署到一个实际的应用系统中,一般是磁盘数据库和内存数据库并存,所以内存数据库和磁盘数据库之间就存在着数据的同步问题。数据的同步是一个非常复杂的问题。由于磁盘数据库和内存数据库的提供商往往不是同一家,所以,这两种数据库在无缝接合,数据同步,产品集成和兼容性方面做得好不好,往往是评估内存数据库产品的一个重要指标。近些年,随着ORACLEIBM等一些传统的数据库巨头开始介入内存数据库领域,一些重要的内存数据库提供商被ORACLEIBM等收购,由于内存数据库和磁盘数据库厂商通过收购合并为一家,所以,磁盘数据库和内存数据库的产品集成也越做越好,像ORACLE,就将收购的Timesten和其旗舰产品ORACLE 11GR2集成,推出了Timesten 7.0Oracle In-Memory Database Cache,可以想象,由于ORACLE会利用其本身的优势,所以其推出的内存数据库产品在和ORACLE的连接和数据同步方面可能会比其它厂商做得更好一些。当然,由于IBMIT巨头也出手收购了SolidDB,随着这些大厂商的介入,内存数据库的技术会进一步加速发展,市场竞争也将越来越激烈。

目前市场上主流的内存数据库有:

n ALTIBASE:一家韩国公司开发的内存数据库产品,据说是最早进入中国市场的内存数据库,在电信行业应用比较多。靠,居然让棒棒占了先!

n Timesten:也有十多年的研发历史了,2005年被ORACLE出手收购。

n SolidDBSolid Information Technology研发的内存数据库,后被IBM收购

n eXtremeDBMcObject公司开发的内存数据库

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/684234/viewspace-1027347/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/684234/viewspace-1027347/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值