2019独角兽企业重金招聘Python工程师标准>>>
以三种持久化存储方案为例:KahaDB、LevelDB、关系型数据库。其中KahaDB和LevelDB的工作原理基本类似,都采用内存+磁盘介质的方案:内存用于存放信息的位置索引,磁盘介质上存放消息内容。而关系型数据库的方案,通过JDBC对数据库进行操作完成消息的存储和修改。
KahaDB基于文件系统,其次KahaDB支持事务。KahaDB主要元素包括:一个内存Metadata Cache用来在内存中检索消息的存储位置、若干用于记录消息内容的Data log文件、一个在磁盘上检索消息存储位置的Metadata Store、还有一个用于在系统异常关闭后恢复Btree结构的redo文件。
LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库,由Google发起并开源。LevelDB只能由本操作系统的其他进程调用,所以它不具有网络性。如果您需要网络上的远程进程操作LevelDB,那么就要自行封装服务层。
但我们在选择使用何种存储介质时,需要如网络上一些资料所说的那样,一定要对三种持久化存储方案的速度做比较后,选择最快的那种存储方案么?这里面至少有两个误区:
- 某种存储方案的速度一定比另一种存储方案的速度快。
- 一定要选择速度快的那种存储方案。
但是真正决定存储速度的因素,未必与软件的实现机制有绝对关系。我们详细的讨论一下:
-
根据不同的硬件层配置,同一种持久化存储方案的性能是完全不一样的。例如在单节点计算的情况下,选用DDR 2133双通道内存组和DDR3 1333单通道内存条从理论上至少就可以多获得4Gbps的带宽;选用同样支持SATA3规范的机械硬盘和SSD固态硬盘,虽然两者理论上的对外速度都标称6Gbps,但是由于机械硬盘上单磁头的读写速度存在瓶颈,所以就算进行连续读操作,速度也只能达到200MB/s左右;但是固态硬盘的连续读速度却可以达到500MB/s左右(基本已经接近6Gbps)。
-
如果是企业级硬件存储方案,那么速度差异还会继续扩大。例如电信行业经常采用的IBM 各个系列磁盘阵列,一般都会配置诸如RAID5这样的软存储方案。这样一来,同一份文件有多个副本,并且有多个磁头负责读写。磁盘阵列的对外输出一般会采用光纤通道(FC),而光纤通道行业协会(Fibre Channel Industry Association)最新推出的(2015年实施)Gen 6第6代光纤通道标准中,设计的对外传输理论速度是128Gbps。
-
当然,除非您的公司/团队能够接受这些企业级存储方案高昂的费用。否则还是建议在生产环境搭建性价比较高的折中方案。例如采用20台左右PC Server搭建Ceph/MFS分布式存储系统。
所以某种存储方案的性能,除了这种存储方案的工作原理以外对其有直接影响外,还要考虑它的工作环境。只有根据软件团队预估的系统压力、综合建设方案、考虑后续扩容方式,来确定采用哪一种存储方案,才是科学的。
在同样的硬件资源条件下,相比KahaDB和LevelDB这样的“内存+存储介质”这样的持久化方案而言,使用关系型数据库作为持久化方案绝对不能说“性能”最好,但是在大多数情况下这个持久化方案也不会成为整个顶层架构的设计瓶颈(因为关系型数据库一般都有自己的热备和负载方案)。所以很多团队还是会使用这样的持久化方案,很大一部分原因就是这些团队对关系型数据库有更丰富的使用经验,且有专门的数据库管理人员。