当前位置: 首页 > news >正文

如何选用持久化存储方案--一些需要考虑的问题

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    以三种持久化存储方案为例:KahaDB、LevelDB、关系型数据库。其中KahaDB和LevelDB的工作原理基本类似,都采用内存+磁盘介质的方案:内存用于存放信息的位置索引,磁盘介质上存放消息内容。而关系型数据库的方案,通过JDBC对数据库进行操作完成消息的存储和修改。

    KahaDB基于文件系统,其次KahaDB支持事务。KahaDB主要元素包括:一个内存Metadata Cache用来在内存中检索消息的存储位置、若干用于记录消息内容的Data log文件、一个在磁盘上检索消息存储位置的Metadata Store、还有一个用于在系统异常关闭后恢复Btree结构的redo文件。

    LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ 程序库,由Google发起并开源。LevelDB只能由本操作系统的其他进程调用,所以它不具有网络性。如果您需要网络上的远程进程操作LevelDB,那么就要自行封装服务层。

    但我们在选择使用何种存储介质时,需要如网络上一些资料所说的那样,一定要对三种持久化存储方案的速度做比较后,选择最快的那种存储方案么?这里面至少有两个误区:

  1. 某种存储方案的速度一定比另一种存储方案的速度快。
  2. 一定要选择速度快的那种存储方案。

但是真正决定存储速度的因素,未必与软件的实现机制有绝对关系。我们详细的讨论一下:

  • 根据不同的硬件层配置,同一种持久化存储方案的性能是完全不一样的。例如在单节点计算的情况下,选用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这样的“内存+存储介质”这样的持久化方案而言,使用关系型数据库作为持久化方案绝对不能说“性能”最好,但是在大多数情况下这个持久化方案也不会成为整个顶层架构的设计瓶颈(因为关系型数据库一般都有自己的热备和负载方案)。所以很多团队还是会使用这样的持久化方案,很大一部分原因就是这些团队对关系型数据库有更丰富的使用经验,且有专门的数据库管理人员。

转载于:https://my.oschina.net/blacklands/blog/875049

相关文章:

  • C语言求最小公倍数和最大公约数三种算法(经典)
  • 搜索:文本的匹配算法
  • 应用解决告诉你什么时候该用ajax
  • 1154: 零起点学算法61——矩阵转置
  • 20155224 实验一《Java开发环境的熟悉》实验报告
  • 奇偶排序
  • Oracle分组取第一条数据
  • 听说你叫Java(二)–Servlet请求
  • BZOJ 3172 Tjoi2013 单词 后缀数组
  • C#基础_MD5
  • Protobuf3 语法指南
  • Oracle数据库服务器IO高的分析方案和案例探讨
  • yii2清空模态框表单的数据,每次点击开始之前让数据清空
  • 依赖类型语言Idris发布1.0版本
  • asp.net请求处理过程
  • python3.6+scrapy+mysql 爬虫实战
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • CentOS6 编译安装 redis-3.2.3
  • Docker容器管理
  • IDEA 插件开发入门教程
  • iOS编译提示和导航提示
  • JavaScript对象详解
  • Java小白进阶笔记(3)-初级面向对象
  • java中具有继承关系的类及其对象初始化顺序
  • Redis中的lru算法实现
  • springMvc学习笔记(2)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • v-if和v-for连用出现的问题
  • Vue2.x学习三:事件处理生命周期钩子
  • 产品三维模型在线预览
  • 从setTimeout-setInterval看JS线程
  • 飞驰在Mesos的涡轮引擎上
  • 关于List、List?、ListObject的区别
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 微信小程序:实现悬浮返回和分享按钮
  • 一个SAP顾问在美国的这些年
  • 译自由幺半群
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 数据结构
  • $(function(){})与(function($){....})(jQuery)的区别
  • (C语言)fread与fwrite详解
  • (C语言)二分查找 超详细
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (二)WCF的Binding模型
  • (九)One-Wire总线-DS18B20
  • (四)c52学习之旅-流水LED灯
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)EXC_BREAKPOINT僵尸错误
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core和.Net Standard直观理解
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net mvc总结