内存数据库,顾名思义就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。
内存数据库抛弃了磁盘数据管理的传统方式,基于全部数据都在内存中重新设计了体系结构,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比传统数据库的数据处理速度要快很多,一般都在10倍以上。内存数据库的最大特点是其“主拷贝”或“工作版本”常驻内存,即活动事务只与实时内存数据库的内存拷贝打交道。
定义:设有数据库系统DBS,DB为DBS中的数据库,DBM(t)为在时刻t,DB在内存的数据集,DBM(t)属于DB。TS为DBS中所有可能的事务构成的集合。AT(t)为在时刻t处于活动状态的事务集,AT(t)属于TS。Dt(T)为事务T在时刻t所操作的数据集,
Dt(T)属于DB。若在任意时刻t,均有:
任意T属于AT(t) Dt(T)属于DBM(t)
成立,则称DBS为一个内存数据库系统,简称为MMDBS;DB为一个内存数据库,简称为MMDB。
MMDB除了具有一般数据库的特征外,又具有自己的特殊性质,其关键技术的实现具有特殊性。
MMDB关键技术有:⑴数据结构;⑵MMDB索引技术;⑶查询处理与优化;⑷事务管理;⑸并发控制;⑹数据恢复。
MMDB不同于DRDB,DRDB技术在内存数据库中不再适用,要对这些关键技术进行新的研究。
存储性能要求
在许多的数据库应用系统中,尤其在电话程控交换领域,对数据的访问性能有很高的要求。这类应用一般都有很高的事务量,又要求有很低的事务响应延迟,而且对数据库的可靠性有很高的要求,例如一个电话交换的应用,每秒钟会对数据库有数千个查询或者更新请求,每个请求要求有低于50毫秒的响应延迟,并且在一年中数据库只能有数分钟的停机时间。MMDB系统能够满足这些数据库应用的要求,但是这需要MMDB系统的各个部件在实现方式和策略上,为应用做最大的优化。
存储方案
MMDB中的存储模型比DRDB更加灵活。在传统的MMDB中,为了考虑对内存空间的利用,在系统中专门开辟一块空间来存放记录中各个属性的值,同时,将记录中属性值用指针来替换,指针实际指向存储在堆中的属性值。这种存储方案,在使用初期确实节省了大量的内存空间。尤其在记录中有大量重复值的情况下。并且由于记录中各个字段只存放4个字节长(32位环境下)的指针,因此记录可以很好的支持变长记录的存储,不需要再像DRDB系统中那样,在记录头部存放偏移量来支持变长字段的存储。但是这种存储方案没有很好的考虑到对处理器缓存的利用。通过指针间接访问数据,几乎相当于在内存空间中的随机访问,严重影响了缓存的利用率。尤其在64位的计算环境不断普及,内存的容量理论上可以达到无限,同时内存的价格在不断下降,但是内存的访问速度仍然没有达到处理器的速度的情况下。因此。在传统MMDB系统中,这种利用指针来节省内存空间,却忽视缓存作用的存储模式,在现在的应用环境下,反而有点得不偿失。
可以说,先进的数据库应用程序越来越注重对内存的访问效率,高性能的数据库系统因而必须最大限度的利用处理器缓存,将可能被用到的数据缓存在多层次的缓存中。数据放置的位置对于缓存的利用优化尤其重要。选择好的数据存放方案,改进数据分布的空间局部性,能够提高对缓存的利用率,提升性能。目前新的数据存储方案的设计思路集中于对记录内部各个属性值的存储布局做调整,能够按照需求访问记录中的部分属性,从而消除不必要的内存访问所带来的内存延迟。因此,在本文中,提出一种在MMDB系统中使用的数据存储方法。它仍然在记录中存放实际的值,但是为缓存的利用做了优化。
电信的二次批价和实时累账是计费系统中的两个必备功能。所谓二次批价是相对于一次批价来说的。一次批价是按照国家标准资费来进行价格计算,比如: 全球通每分钟本地通话为0.4元,在一次批价完成后,会根据这个用户的套餐进行再一次的计算。以北京全球通用户接听4分钟的电话为例,一次批价完成后,这条话单的价格是1.6元,如果这个用户参加了10元包月接听套餐,那么在二次批价后,这次通话的费用就为0元。一次批价是用于各大运营商之间结算的,而二次批价是针对用户个人的。
实时累账是将用户从每月1号到目前为止的所有费用累加起来,也就是用户目前可以通过10086查到截止到前一天的实时话费。累账值可以帮助用户控制高额话费或是供用户即时查询消费信息。
二次批价和实时累账过程涉及用户资料、用户套餐等与用户相关的信息,电信支撑系统在开始批价时必须加载这些数据。稍大一点的省级运营商的这些数据就会超过1000万条,计费处理模型也由于套餐的组合、产品的组合以及不同的优惠规则变得相当复杂,加载这部分数据对系统而言是一笔不小的开销,这就使得现在的计费处理速度比较慢,而且很难做到对数据的实时更新。内存数据库的引入在一定程度上解决了这个问题。
在计费二次批价过程中数据量最大的是详单数据,这部分数据不用放在内存数据库中,每处理完一个话单文件或达到设定的提交记录数时直接操作磁盘数据库,不会影响系统性能。最急切的是将用户资料、套餐、营业套餐和计费套餐对应关系数据、计费套餐模型数据及用户累计数据放到内存数据库中,这部分数据查询操作远比数据新增和更新操作要频繁。除了这些数据外,当然还有应用需要的其他数据也都可以加载到内存数据库。
在采用内存数据库后,用户通过营业部或客户查询实时话费的时候完全可以做到实时,比目前只能提供查询到前一天的实时话费在业务上有了质的飞跃。因为系统在处理这部分数据时查询流程和以前的完全一样,但系统省去了以往内存中的数据和磁盘数据库数据同步的环节,所以就能做到了实时查询。对于信控来说也同样,以往系统在累完账后要按照一定周期刷新信控数据,这就存在一个时间差,不能够完全做到实时。
而采用内存数据库后,信控可以直接取得内存数据库中的实时话费累计表中的数据,完全实现实时预警、停机。二次批价和累账中采用内存数据库后,对防欺诈、收入保障系统也有相当大的好处,这样能够充分保证运营商的切身利益。
另外,在采用内存数据库后,整体提高了系统批价、累账的处理速度,大大缓解访问磁盘数据库的压力,提高数据查询、修改、删除的效率,也为后付费和预付费的融合提供了可能。
电信营业数据和计费系统中的数据总是在不断的变化中,这就涉及内存数据库中的数据和磁盘数据库数据的同步问题(为了描述清楚,这里的磁盘数据库以Oracle DB为例来说明)。数据同步包括两部分: 从内存数据库到Oracle DB数据同步和从Oracle DB到内存数据库的同步。
Oracle DB到内存数据库同步
这部分数据同步采用增量表的方式,营业系统或CRM新增或更新的数据将生成到Oracle的增量表中,计费后台程序先到这些增量表中查询数据。如果能在这些增量表中查到数据就把这些数据更新到内存数据库对应表中,如果查不到,就直接从内存数据库中直接查询,从而保证了数据的完整性和实时性。由于增量表的数据量一般会很小,所以这部分操作不会影响系统的性能。
内存数据库到Oracle DB同步
由于Oracle的计费后台批价、累账数据几乎都加载到了内存数据库中,所以Oracle数据库对应的数据表将主要用于对内存数据库的数据备份。
用户最新的实时话费等信息都保存在内存数据库中,实时话费查询将直接连接到内存数据库中查询,保证用户得到最新的费用信息。信控也直接从内存数据库查询数据,因此对Oracle中的这部分数据已经没有实时性的要求。这时内存数据库到Oracle的同步可以由应用程序生成文件,定时地往Oracle数据库中同步备份,或者采用Oracle存储过程在系统相对空闲时间段进行数据导入就可以了。
内存数据库与传统数据库的异同
传统的数据库系统是关系型数据库,开发这种数据库的目的,是处理永久、稳定的数据。关系数据库强调维护数据的完整性、一致性,但很难顾及有关数据及其处理的定时限制,不能满足工业生产管理实时应用的需要,因为实时事务要求系统能较准确地预报事务的运行时间。
对磁盘数据库而言,由于磁盘存取、内外存的数据传递、缓冲区管理、排队等待及锁的延迟等使得事务实际平均执行时间与估算的最坏情况执行时间相差很大,如果将整个数据库或其主要的“工作”部分放入内存,使每个事务在执行过程中没有I/O,则为系统较准确估算和安排事务的运行时间,使之具有较好的动态可预报性提供了有力的支持,同时也为实现事务的定时限制打下了基础。这就是内存数据库出现的主要原因。
内存数据库所处理的数据通常是“短暂”的,即有一定的有效时间,过时则有新的数据产生,而当前的决策推导变成无效。所以,实际应用中采用内存数据库来处理实时性强的业务逻辑处理数据。而传统数据库旨在处理永久、稳定的数据,其性能目标是高的系统吞吐量和低的代价,处理数据的实时性就要考虑的相对少一些。实际应用中利用传统数据库这一特性存放相对实时性要求不高的数据。
在实际应用中这两种数据库常常结合使用,而不是以内存数据库替代传统数据库。
而内存数据库也分全内存计算和热内存计算。全内存计算,即数据需要全部装载到内存中进行计算,对硬件要求高,譬如QlikView等产品。热内存计算,部分数据加载到内存中即可以进行计算,硬盘和内存会有数据交换来计算未加载的数据,譬如Yonghong Z-Suite。
(1)采用复杂的数据模型表示数据结构,数据冗余小,易扩充,实现了数据共享。
(2)具有较高的数据和程序独立性,数据库的独立性有物理独立性和逻辑独立性。
(3)内存数据库为用户提供了方便的用户接口。
(4)内存数据库提供4个方面的数据控制功能,分别是并发控制、恢复、完整性和安全性。数据库中各个应用程序所使用的数据由数据库统一规定,按照一定的数据模型组织和建立,由系统统一管理和集中控制。
(5)增加了系统的灵活性。
要解决持久性问题,内存数据库也有相应的解决方案。这其中包括在集群里保存额外的数据副本,然后对数据库进行横向扩展,让系统能够在运行中不断将更新数据复制到一个或多个备用系统当中。
一些数据库系统还会定期将数据复制到磁盘系统,就是为了应对上述突然断电或系统宕机的情况。当然这时候就要在额外的负载和数据可恢复性方面做出权衡。
由于内存数据库的风险比传统OLTP数据库要大,所以要对它所支撑的应用系统有一个更清楚的认识。目前从整体来看,传统的OLTP应用系统往往会避免使用内存数据库技术,它更多地应用在特定的数据类型或者分析应用(包括批处理报表系统)当中,这些系统的数据远没有OLTP系统重要。
另一方面也是出于成本预算的考虑,DRAM相比于传统磁盘甚至闪存来说都是更昂贵的。
存数据库和磁盘数据库
MMDB与DRDB之间主要区别在于MMDB的主数据库常驻内存,体系结构设计的优化目标是提高内存和CPU使用效率[6,24]。与DRDB相比,MMDB的优点如下:
完成同样的功能,所需机器指令大大降低;
事务处理无需I/O,极大提高了系统性能;
不再需要缓冲区管理器,消除了磁盘和内存之间数据拷贝开销;
在数据组织与管理中,广泛使用指针,简化了内存管理,降低了空间开销 。
1、
2、
- 杂项-DB:Druid
ylbtech-杂项-DB:Druid Apache Druid (incubating) is a high performance analytics data store for event-d ...
- 杂项-DB:时序数据库
ylbtech-杂项-DB:时序数据库 1.返回顶部 1. 时序数据库全称为时间序列数据库.时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间 ...
- 杂项-DB:OLAP(联机分析处理)
ylbtech-杂项-DB:OLAP(联机分析处理) 联机分析处理OLAP是一种软件技术,它使分析人员能够迅速.一致.交互地从各个方面观察信息,以达到深入理解数据的目的.它具有FASMI(Fast A ...
- 杂项-DB:DW/DWH(数据仓库)
ylbtech-杂项-DB:DW/DWH(数据仓库) 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合. ...
- 杂项-DB:数据挖掘
ylbtech-杂项-DB:数据挖掘 数据挖掘(Data mining)又译为资料探勘.数据采矿.它是数据库知识发现(英语:Knowledge-Discovery in Databases,简称:KD ...
- 杂项-DB:ETL(数据库仓库技术)
ylbtech-杂项-DB:ETL(数据库仓库技术) ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract).交互转换(transfor ...
- 杂项-DB:数据库
ylbtech-杂项-DB:数据库 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增.截取.更新.删除等操作. 所谓“数据库”是以一定方式储存在一起.能与 ...
- 一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子
一个简单的NoSQL内存数据库—Berkeley DB基本操作的例子 最近,由于云计算的发展,数据库技术也从结构式数据库发展到NoSQL数据库,存储模式从结构化的关系存储到现在如火如荼的key/val ...
- In-Memory:内存数据库
在逝去的2016后半年,由于项目需要支持数据的快速更新和多用户的高并发负载,我试水SQL Server 2016的In-Memory OLTP,创建内存数据库实现项目的负载需求,现在项目接近尾声,系统 ...
随机推荐
- centos7环境配置
CentOS-7-64bit 配置Apache + MySQL + PHP :http://blog.itpub.net/29773961/viewspace-1261417/ 上面教程可以正常安装阿 ...
- vux配置i18n
根据使用文档,先引入i18n import VueI18n from 'vue-i18n'; Vue.use(VueI18n) const i18n = new VueI18n({ locale: ' ...
- New Concept English Two 33 94
$课文92 自找麻烦 1016. It must have been about two in the morning when I returned home. 我回到家时,肯定已是凌晨两点左右了 ...
- Python中函数装饰器及练习
)]) ,,],)
- 【PL/SQL编程】条件语句
1. if...then语句 if <condition_expression> then plsql_sentence; end if; declare -- Local variabl ...
- == 和 equals 的用法
在java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型,其余都是引用类型. “==”是比较两个变量的值是否相等, “equals” ...
- sql server不能删除数据库,显示错误:正在使用
解决办法: use mastergoalter database database_name set single_user with rollback immediate --将数据库回滚到原始配置 ...
- maven搭建ssm框架问题总结
1. Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:compile (default-comp ...
- CF1130E Wrong Answer
E Wrong Answer 注意到 \(n\geq 2\) 时才可能有解,可以按如下方式构造一个 \(a_{1,2\dots n}\): 令 \(a_1=-1\) ,而后面的数都为正.记 \(s=\ ...
- 将美化进行到底,把 PowerShell 做成 oh-my-zsh 的样子
不知你有没有看过 Linux 上 oh-my-zsh 的样子?看过之后你一定会惊叹,原来命令行还能这么玩!然而 Windows 下能这么玩吗?答案是可行的,接下来就来看看怎么玩. Windows 下我 ...