闪存数据库
① 闪存中能存储什么样的数据库Access 或者 MySQL.这二个行不行
Access
② android 数据存储的几种方式
总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络。其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式;数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等;网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理。 对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络。但从开发者的角度来讲它可以分为以下五种方式: 1.SharedPreferences共享偏好 2.Internal Storage内部存储空间 3.External Storage外部存储空间 4.SQLite Database数据库 5.Internet网络 这几种方式各自有各自的优点和缺点,要根据不同的实际情况来选择,而无法给出统一的标准。下面就各种方式谈谈它们的优缺点,以及最合适的使用情况: 1.Shared Preferences共享偏好 SharedPreferences是用来存储一些Key/Value类似的成对的基本数据类型,注意,它只能存储基本数据类型,也即int, long, boolean, String, float。事实上它完全相当于一个HashMap,唯一不同的就是HashMap中的Value可以是任何对象,而SharedPreferences中的值只能存储基本数据类型(primitive types)。 对于它的使用方法,可以参考Android Developer Guide,这里不重复。 如此来看,最适合SharedPreferences的地方就是保存配置信息,因为很多配置信息都是Key/Value。事实上,在Android当中SharedPreferences使用最多的地方也是用来保存配置(Settings)信息,系统中的Settings中这样,各个应用中的Settings也是这样。并且,Android中为了方便的使用SharedPreferences保存配置信息,它来专门有PreferenceActivity用来封装。也就是说如果你想在应用程序中创建配置(Settings),你可以直接使用PreferenceActivity和一些相关的专门为Preference封装的组件,而不用再直接去创建,读取和保存SharedPreference,Framework中的这些组件会为你做这些事。 再谈谈一些使用SharedPreference时的技巧,它只能保存基本数据类型,但假如我想保存一个数组,怎么办?可以把数据进行处理,把它转化成一个String,取出的时候再还原就好了;再如,如想保存一个对象,怎么办,同样,可以把对象序列化成为字符序列,或转成String(Object.toString()),或是把它的HashCode(Object.hashCode())当成Value保存进去。 总之,SharedPreferences使用起来十分的方便,可以灵活应用,因为它简单方便,所以能用它就尽量不要用文件或是数据库。 1.Internal Storage内部存储空间 所谓的内部存储与外部存储,是指是否是手机内置。手机内置的存储空间,称为内部存储,它是手机一旦出厂就无法改变,它也是手机的硬件指标之一,通常来讲手机内置存储空间越大意味着手机价格会越贵(很多地方把它称为手机内存,但我们做软件的知道,这并不准确,内存是指手机运行时存储程序,数据和指令的地方;这里应该是手机内部存储的简称为内存,而并非严格意义上的内存)。 内部存储空间十分有限,因而显得可贵,所以我们要尽可能避免使用;另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。上面所谈到的Shared Preferences和下面要谈到的SQLite数据库也都是存储在内部存储空间上的。 Android本身来讲是一个Linux操作系统,所以它的内部存储空间,对于应用程序和用户来讲就是“/data/data"目录。它与其他的(外部的存储)相比有着比较稳定,存储方便,操作简单,更加安全(因为可以控制访问权限)等优点。而它唯一的缺点就是它比较有限,比较可贵。 虽然,可以非常容易的知道程序本身的数据所在路径,所有的应用程序的数据路径都是“/data/data/app-package-name/”,所有的程序用到的数据,比如libs库,SharedPreferences都是存放在这个路径下面。但我们在使用的时候最好不要,或是千万不要直接引用这个路径。 使用内部存储主要有二个方式,一个是文件操作,一个是文件夹操作。无论哪种方式,Context中都提供了相应的函数来支持,使用Context不但操作简单方便,最重要的是Context会帮助我们管理这些文件,也可以方便帮助我们控制文件的访问权限。先来系统的说下Context中关于文件和文件夹操作的函数有哪些。 a. 创建一个文件,并打开成一个文件输出流,需要提供一个String,作为文件名 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); 2.output.write(data);// use output to write whatever you like 3.output.close(); 1.FileOutputStream output = Context.openOutputFile(filename, Context.MODE_PRIVATE); output.write(data);// use output to write whatever you like output.close(); b. 同样,想打开一个文件作为输入的话,也是只需要提供文件名 1.FileInputStream input = Context.openInputFile(filename); 2.input.read(); 3.input.close(); 1.FileInputStream input = Context.openInputFile(filename); input.read(); input.close(); c. 列出所有的已创建的文件 1.String[] files = Context.fileList(); 2.for (String file : files) { 3. Log.e(TAG, "file is " + file); 4.} 1.String[] files = Context.fileList(); for (String file : files) { Log.e(TAG, "file is " + file); } d. 删除文件,能创建就要能够删除,当然也会提供了删除文件的接口,它也非常简单,只需要提供文件名 1.if (Context.deleteFile(filename)) { 2. Log.e(TAG, "delete file " + filename + " sucessfully“); 3.} else { 4. Log.e(TAG, "failed to delete file " + filename); 5.} 1.if (Context.deleteFile(filename)) { Log.e(TAG, "delete file " + filename + " sucessfully“); } else { Log.e(TAG, "failed to delete file " + filename); } e. 获取文件已创建文件的路径,它返回一个文件对象用于操作路径 1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); 1.File fileDir = Context.getFileDir(); Log.e(TAG, "fileDir " + fileDir.getAbsolutePath(); f. 创建一个目录,需要传入目录名称,它返回 一个文件对象用到操作路径 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG, "workdir " + workDir.getAbsolutePath(); 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); Log.e(TAG, "workdir " + workDir.getAbsolutePath(); g. 以File对象方式查看所创建文件,需要传入文件名,会返回文件对象 1.File store = Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length()); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length()); h. 获取Cache路径,无需要传入参数,返回文件对象 1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 1.File cachedir = Context.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath()); 总结一下文件相关操作,可以得出以下三个特点: 1. 文件操作只需要向函数提供文件名,所以程序自己只需要维护文件名即可; 2. 不用自己去创建文件对象和输入、输出流,提供文件名就可以返回File对象或输入输出流 3. 对于路径操作返回的都是文件对象。 如前所述,内部存储空间有限,可贵,安全,稳定,所以应该用来保存比较重要的数据,比如用户信息资料,口令秘码等不需要与其他应用程序共享的数据。也可以用来创建临时文件,但一定要注意及时删除。另外,对于内部存储还有一个非常重要的特点,那就是在应用程序被卸载时,应用程序在内部存储空间的文件数据将全部被删除。系统这样做的原因很简单,就是因为内部存储很有限,它必须保证它的可用性,因为一旦添满,系统将无法再正常工作。 1.External Storage外部存储空间 再来谈谈手机外部存储空间,与内部存储空间相对,外部存储空间是指手机出厂的时候不存在,用户在使用时候可以自由添加的外部存储介质比如TS卡,SD卡等闪存储介质。这些闪存介质由最初的空间小价格贵,到现在的大容量价格便宜,所以几乎每个支持外部存储的手机上面都有大容量(大于等于2G)的闪存卡。 Android也是不例外,它完全支持外部存储介质。其实更确切的说,它是要依赖于外部存储卡的,因为对于Android系统,如果没有外部存储卡,很多的系统应用无法使用,比如多媒体相关的应用程序无法使用。虽然Android很依赖,但是外部存储卡也有它自身的特点,它最大的优点就是存储空间大,基本上你可无限制的使用,也不怎么担心去清除数据。就目前来看,很多程序都在使用外部存储卡,但很少有程序去主动清理数据,所以无论你的SD卡有多大,它的可用空间却越来越少。与内部存储不同的是,当程序卸载时,它在外部存储所创建的文件数据是不会被清除的。所以清理外部存储空间的责任丢给了用户自己,每隔一段时间就去查看下SD卡,发现无用数据立马删除。外部存储的缺点就是不是很稳定,对于Android手机来讲可以说,很不稳定,本身闪存介质就容易出问题,SD卡处于不能正常使用的状态十分多。 先来说说外部存储相关的使用方法和API: a. Check media availability检查介质的可用性 如前所述,外部存储介质的稳定性十分的差,所以在使用之前一定要先检查它的可用性,如果可用再去用 view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); 2.if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } view plain to clipboardprint? 1.final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } final String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED) || state.equals(Environment.MEDIA_READ_ONLY)) {// sd card is ready to us } b. Get the directory获取外部存储卡的路径 事实上,外部存储卡的路径是“/mnt/sdcard",所以你直接这样写去访问也能访问的到。鉴于可读性和可移植性的考虑,建议这样写: view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); view plain to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDirectory(); File sdcardDir = Environment.getExternalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用API 8(Android 2.2)或者更高,那么SDK中又多了几个操作外部存储文件和路径的接口,文档中也建议开始者更加规范的使用SD卡。比如,创建相应的目录去存储相应的数据,Music,Picture,Video等。应用程序目录也变成了"/Android/data/package-name/data"。具体的使用可以参考文档,这里不重复。当然,就像编程规范一样,这里只是规范,你完全可以不遵守它,但出于可读性和可移植性,还是建议按照文档建议的去做。 下面总结一下使用时应该注意的一些和外部存储的特点: a. 外部存储卡不是随时想用就能够用的,所以一定要记得在使用之前检查它的可用性 b. 存储在外部存储卡上的数据是所有应用程序都可见,用户也可见(使用FileManager),所以安全性不是很好,虽然文档声称可以在外部存储卡上写程序私有数据,但貌似没用,用FileManager仍然可以删除或编辑文件(Market上面的FileManager功能都十分的强大,能让用户看到SD卡中的所有文件,和操作能看到的文件)。 c. Android手机支持把外部存储卡Mount至PC做为U盘,当连接数据线时,这时SD卡变成了U盘连接到了另外的操作系统中。什么意思,就是在Android当中虽然有的文件属性(隐藏,私有等),到了PC上就不一定管用了,用户在PC上可以随意操作文件(这就是第二点中所提及的)。 d. 如果使用外部存储卡保存数据,一定要额外做好异常处理:外部存储卡不可用时把数据存入哪里;可用的时候再怎么同步数据(这是比较头疼的地方,可行的做法就是当SD卡不可用时不准用户写数据,但这用户体验又不是很好,但如你所知,很多应用都这么干);你的数据被破坏了。当然常见的异常也要考虑,比如空间满了,无法写入,磁盘坏道等。 1.SQLite Database数据库 Android对数据库的支持很好,它本身集成了SQLite数据库,每个应用都可以方便的使用它,或者更确切的说,Android完全依赖于SQLite数据库,它所有的系统数据和用到的结构化数据都存储在数据库中。 它具有以下优点: a. 效率出众,这是无可否认的 b. 十分适合存储结构化数据 c. 方便在不同的Activity,甚至不同的应用之间传递数据 先前有一篇文章讲到了不同Activity和不同应用之间传递数据的麻烦,特别是对于大型数据结构,因为Activity虽是Java对象,但去无法像使用其他类对象那样去创建一个实例然后使用它,更无法给Activity加上Setters和Getters(虽然这样做了没有编译错误)。比较好的解决方案就是把结构化数据写入数据库,然后在不同的Activity之间传递它们的Uri。 d. 由专门的ContentProvider来帮忙管理和维护数据库 e. 可以方便的设置访问权限,私有还是都可见 f. 操作方便,使用标准的CRUDE语句,ContentResolver.query(), update(), delete() insert(),详见ContentResolver g. 良好的可移植性和通用性,用标准的SQL语句就能实现CRUDE 对于它的使用方法可以去参考文档,这里也说不清楚。 1.Internet网络 网络是比较不靠谱的一个,因为移动终端的网络稳定性,以及所产生的流量让人伤不起,用户更伤不起。但若是对于非常重要的实时数据,或是需要发送给远端服务器处理的,也可以考虑使用网络实时发送。这已经有先例了,Apple和Google就是这样,iPhone设备和Android设备都会在用户不知情的情况 下收集用户的信息,然后又在用户不知情的情况 下发送到Apple和Google的服务器上,也就是所谓的“跟踪门”。除此之外,智能手机(特别是Android和火热的iPhone)上面的应用程序都会偷偷的在后台运行,收集用户数据,然后再偷偷的发服务器,直接伤害是用户流量,请看先前的文章。 对比这几种方式,可以总结下: 1. 简单数据和配置信息,SharedPreference是首选; 2. 如果SharedPreferences不够用,那么就创建一个数据库 3. 结构化数据,一定要创建数据库,虽然这稍显烦锁,但是好处无穷 4. 文件就是用来存储文件(也即非配置信息或结构化数据),如文本文件,二进制文件,PC文件,多媒体文件,下载的文件等等。 5. 尽量不要创建文件 6. 如果创建文件,如果是私密文件或是重要文件,就存储在内部存储,否则放到外部存储 7. 不要收集用户数据,更不要发到网络上,虽然你们也有很多无奈。用户也无奈,也无辜,但更无助 平台为开发者准备了这么多的方式固然是一件好事,但我们要认清每一种的优点和缺点,根据实际情况选择最合适的。还有一个原则就是最简单原则,也就是说能用简单的方式处理,就不要用复杂的方式。
③ 全闪存有哪些应用
全闪存主要应用在数据库加速(OracleOLTP)、VDI(VMware)、服务器虚拟化(VMware)、SAPHANATDI解决方案等场景。华为OceanStorDoradoV3企业级全闪存存储系统,满足数据库、虚拟化等企业级应用对高性能、高可靠、高效率存储的需求,助力金融、制造、运营商等行业向闪存时代平滑演进。
④ 条码打印机的内存和闪存的作用是什么
内存是用来运作主机发送指令的临时储存设备,打印机一关机指令就消失了,比如电脑的内存大小会影响它的工作量大小。而闪存就相当于电脑的硬盘,它可以永久性的储存一些东西,例如厂商给条码打印机安装的一些字库之类的。通俗的理解就是,内存只能运行临时数据,而闪存可以永久保存。
⑤ 数据存储的介质
(1)结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业ERP、财务系统;医疗HIS数据库;政府行政审批;其他核心数据库等。这些应用需要哪些存储方案呢?基本包括高速存储应用需求、数据备份需求、数据共享需求以及数据容灾需求。
(2)非结构化数据库是指其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它不仅可以处理结构化数据(如数字、符号等信息)而且更适合处理非结构化数据(全文文本、图像、声音、影视、超媒体等信息)。
面对海量非结构数据存储,杉岩海量对象存储MOS,提供完整解决方案,采用去中心化、分布式技术架构,支持百亿级文件及EB级容量存储,具备高效的数据检索、智能化标签和分析能力,轻松应对大数据和云时代的存储挑战,为企业发展提供智能决策。
⑥ 华为全闪存在数据库加速场景的应用
Oracle是当前主流大型企业最常用的数据库软件,承载企业大多数业务系统的关键数据,如今的信息爆炸给Oracle数据库系统带来了性能和成本的巨大挑战。华为OceanStorDoradoV3全闪存数据库加速方案提供强劲性能,帮助在线交易类业务规模提升3倍,减少I/O等待时间,提升存储和服务器的资源利用率,显着减少OracleLicense费用。采用横向扩展架构提供可预测的线性增长性能,满足未来不可预期的业务增长。提供丰富的数据保护服务,保障核心应用7x24稳定在线。
⑦ 存储器的类型
根据存储材料的性能及使用方法的不同,存储器有几种不同的分类方法。1、按存储介质分类:半导体存储器:用半导体器件组成的存储器。磁表面存储器:用磁性材料做成的存储器。
下面我们就来了解一下存储器的相关知识。
存储器大体分为两大类,一类是掉电后存储信息就会丢失,另一类是掉电后存储信息依然保留,前者专业术语称之为“易失性存储器”,后者称之为“非易失性存储器”。
1 RAM
易失性存储器的代表就是RAM(随机存储器),RAM又分SRAM(静态随机存储器)和DRAM(动态随机存储器)。
SRAM
SRAM保存数据是靠晶体管锁存的,SRAM的工艺复杂,生产成本高,但SRAM速度较快,所以一般被用作Cashe,作为CPU和内存之间通信的桥梁,例如处理器中的一级缓存L1 Cashe, 二级缓存L2 Cashe,由于工艺特点,SRAM的集成度不是很高,所以一般都做不大,所以缓存一般也都比较小。
DRAM
DRAM(动态随机存储器)保存数据靠电容充电来维持,DRAM的应用比SRAM更普遍,电脑里面用的内存条就是DRAM,随着技术的发展DRAM又发展为SDRAM(同步动态随机存储器)DDR SDRAM(双倍速率同步动态随机存储器),SDRAM只在时钟的上升沿表示一个数据,而DDR SDRAM能在上升沿和下降沿都表示一个数据。
DDR又发展为DDR2,DDR3,DDR4,在此基础上为了适应移动设备低功耗的要求,又发展出LPDDR(Low Power Double Data Rate SDRAM),对应DDR技术的发展分别又有了LPDDR2, LPDDR3, LPDDR4。
目前手机中运行内存应用最多的就是 LPDDR3和LPDDR4,主流配置为3G或4G容量,如果达到6G或以上,就属于高端产品。
2 ROM
ROM(Read Only Memory)在以前就指的是只读存储器,这种存储器只能读取它里面的数据无法向里面写数据。所以这种存储器就是厂家造好了写入数据,后面不能再次修改,常见的应用就是电脑里的BIOS。
后来,随着技术的发展,ROM也可以写数据,但是名字保留了下来。
ROM中比较常见的是EPROM和EEPROM。
EPROM
EPROM(Easerable Programable ROM)是一种具有可擦除功能,擦除后即可进行再编程的ROM内存,写入前必须先把里面的内容用紫外线照射IC上的透明视窗的方式来清除掉。这一类芯片比较容易识别,其封装中包含有“石英玻璃窗”,一个编程后的EPROM芯片的“玻璃窗”一般使用黑色不干胶纸盖住, 以防止遭到紫外线照射。
EPROM (Easerable Programable ROM)
EPROM存储器就可以多次擦除然后多次写入了。但是要在特定环境紫外线下擦除,所以这种存储器也不方便写入。
EEPROM
EEPROM(Eelectrically Easerable Programable ROM),电可擦除ROM,现在使用的比较多,因为只要有电就可擦除数据,再重新写入数据,在使用的时候可频繁地反复编程。
FLASH
FLASH ROM也是一种可以反复写入和读取的存储器,也叫闪存,FLASH是EEPROM的变种,与EEPROM不同的是,EEPROM能在字节水平上进行删除和重写而不是整个芯片擦写,而FLASH的大部分芯片需要块擦除。和EEPROM相比,FLASH的存储容量更大。
FLASH目前应用非常广泛,U盘、CF卡、SM卡、SD/MMC卡、记忆棒、XD卡、MS卡、TF卡等等都属于FLASH,SSD固态硬盘也属于FLASH。
NOR FLAHS & NAND FLASH
Flash又分为Nor Flash和Nand Flash。
Intel于1988年首先开发出Nor Flash 技术,彻底改变了原先由EPROM和EEPROM一统天下的局面;随后,1989年,东芝公司发表了Nand Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。
Nor Flash与Nand Flash不同,Nor Flash更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而Nand Flash更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一样,而且Nand Flash与Nor Flash相比,成本要低一些,而容量大得多。
如果闪存只是用来存储少量的代码,这时Nor Flash更适合一些。而Nand Flash则是大量数据存储的理想解决方案。
因此,Nor Flash型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,Nand Flash型闪存主要用来存储资料,我们常用的闪存产品,如U盘、存储卡都是用Nand Flash型闪存。
在Nor Flash上运行代码不需要任何的软件支持,在Nand Flash上进行同样操作时,通常需要驱动程序。
目前手机中的机身内存容量都比较大,主流配置已经有32G~128G存储空间,用的通常就是Nand Flash,另外手机的外置扩展存储卡也是Nand Flash。
⑧ 如何在数据库应用中发挥SSD的优势
利用固态硬盘(SSD)技术的优势设计数据库应用架构是非常有吸引力的一件事。特别值得注意的是,固态硬盘并行访问数据的能力已经有了很大的提升。这些提升使得固态硬盘对于许多类型的数据库应用几乎能达到了随机访问内存存储的性能,而成本只是其八分之一。
在过去的几年里,固态硬盘的性能得到了突飞猛进的增长,同时相比于传统硬盘和RAM,其成本却在持续降低。但是要利用好这些改进的优势,需要掌握存储特性选择合适的AWS实例大小,理解应用特性并利用合适的编程语言。
掌握AWS选项
AWS IaaS EC2实例可以配置不同级别的存储:
A)内存。对应于传统物理计算机的RAM。
B)实例存储。也称为临时存储。它对应于传统物理计算机的磁盘大小。
C)灵活的持久化补充存储(比如EBS和S3)。基本上可以把它视为物理PC的网络存储。
Amazon现在把SSD作为部署临时存储和通用存储的默认配置,也是EBS的默认配置(早期的实例类型默认不是SSD)。EBS的其它好处是存储系统可以在数据库服务器本身退役以后仍然继续可用。
此外,AWS还提供SSD存储作为Amazon DynamoDB的默认选项。SSD同时也是Amazon RDS和Amazon
Redshift的可选配置。这个配置非常好,它可以降低数据库应用需要的开发代价。但是,如果企业需要部署其它数据库,也有很多其它可配置项可以帮助他
们利用到SSD的并行特性。
并行存储的物理原理
物理计算机通常设置有三种主要存储类型。RAM安装在主板上,紧挨着CPU,它提供最高的性能,成本代价也最高,计算机关闭以后内容不会保存。
SSD和传统硬盘是连接到计算机上的补充存储,通过PCI-e,SCSI和SATA线缆连接,或者在网络上通过eSATA或者光纤通道连接。
传统硬盘包含有一个物理读写头,一次可以跨多个物理盘片读取数据流。如果数据可以顺序读取(比如读取较大的多媒体视频音频文件),或者对于一些
数据库分析应用(比如Hadoop应用),这种模式都非常合适。然而,如果读取数据要搜索盘片的多个扇区,那么传统硬盘读写头的性能会急剧下降。
与此相反,闪存驱动的物理构成就是成百上千个可以随机访问的块,是由分散的许多芯片组成的,读取哪一块的数据不会影响访问性能。闪存盘有两个瓶颈:第一就是计算机处理器和个体芯片储存区之间的存储控制器;第二是不能从单个芯片上的不同块区同时读取随机数据。
当今时代的大部分数据库引擎都没有利用闪存盘访问数据随机位的功能优势。其结果是,数据库都比较慢,或者虽然其访问模式可以被缓存,但需要更多
RAM才能实现同样的性能效果。而RAM存储肯定比闪存盘速度快,不过对于相同数量的存储空间,RAM的成本是闪存盘的十倍。在物理层面上,RAM比
SSD有更好的IO处理能力,但是成本也是其大约三到四倍。这些相对成本也被反映到了Amazon Web服务上可用的不同计算机实例相对成本上。
写入队列
利用跨多个芯片并行访问数据能力优势的关键在于编写程序时要考虑到队列深度这一特性。在数据库应用中增加队列深度可以使应用从SSD不同个体芯片中并行读写数据,这对提高数据库性能有直接的效果。
如果队列深度设置过大,访问同一芯片中不同数据位的可能性就增大了,这也会破坏性能。因此,大部分应用的最佳队列深度是每驱动器32到64个并
发请求,尽管驱动器本身支持更多并发请求。通过优化数据库应用访问SSD的队列深度,应用程序可以花更少的代价就能达到用更昂贵RAM才能实现的更佳性能
状态。
在应用层面,开发者需要考虑如何实现应用对存储系统的请求队列化,以实现并行处理。但是,软件方面要获得较好的并行有许多陷阱。要用像
JavaScript、Ruby和Python这样的编程语言实现并行是很困难的,因为这些语言对实现多线程支持的不太好,Java和C#相对更容易一
些。
C和C++是实现高并发系统代码最合适的编程语言,因为它们直接操作操作系统核心功能。例如,互斥扩展(也叫互斥量)就是简化编程生成低级系统并行调用的语言特性。另一种选择是使用自带SSD存储优化方案的商业数据库,比如Aerospike。
为应用选择合适的架构
不是所有的数据库应用都需要闪存存储功能来并行访问随机数据。处理大量并发用户Web请求的数据库很容易看到闪存存储的最大优势。
与此相反,像Hadoop这种分析应用在某种意义上是并行的,但是通常这些应用最后都需要访问存储驱动器上的大量数据流来完成数据访问。例如,
处理一个月的用户日志来分析其行为或者分析用户,本质上都要按顺序提取数据,因此迁移到SSD并不能带来太多益处。在这两种极端场景之间,还有一些实时分
析类型的应用,它们既需要一定的随机搜索和也需要数据流处理。
专家建议,充分利用各种层次成本差异的一种方式是,配置数据库利用临时存储读取数据以获得最佳性能。这一点可以通过存储在EBS持久化数据层的数据进行备份。这种方案提供了AWS上价格和性能的最佳平衡组合。
后台进程也需要考虑
数据库应用架构师还应该考虑其它细微特征。要理解数据库软件如何利用RAM,如何把数据刷到磁盘,这些对于优化SSD应用配置非常重要。这对于
评估数据库与文件系统交互的各种方式也非常重要。最明显的读负载繁重会有大量后台IO竞争。而其他进程像报表系统、日志文件生成是需要后台维护的。
要想找到合适的平衡点,专家建议以真实世界部署的强大指标为基准进行参考。这样可以帮助企业判断部署和优化SSD系统有多大益处。不过,在RAM和SSD之间选择,最重要的考虑因素是深刻掌握要处理的数据集大小。
配置合适的SSD和RAM容量有许多种组合,会增加数据库更高的复杂度。更多的是传统数据库系统,它们会部署一台主服务器和许多备用服务器用于
故障恢复,除了在磁盘级别的情况它们的配置都很简单。另一方面,分布式数据库系统根据节点数量不同,RAM数量和网络设置的不同会有更多的变化。
尽管在大多数情况下,如果你关注技术的力量和数据库系统的可操作性作为选择硬件驱动器的考虑因素,那么你需要比较评估的系统应该相对不会很多。