Ceph Newstore存储引擎介绍
在Ceph被越来越多地应用于各项存储业务过程中,其性能及调优策略也成为用户密切关注讨论的话题,影响性能表现关键因素之一即OSD存储引擎实现;Ceph基础组件RADOS是强一致、对象存储系统,其OSD底层支持的存储引擎如下图所示:

其中,ObjectStore层封装了下层存储引擎的所有IO操作,向上层提供对象(object)、事务(Transaction)语义的接口,MemStore为基于内存的实现;KeyValueStore主要基于KV数据库(如leveldb, rocksdb等)实现接口功能,事务实现也基于KV数据库自身;FileStore是Ceph目前默认的存储引擎(也是目前使用最多的存储引擎),其事务实现基于Journal机制(Journal文件或块设备);除了支持事务特性(consistency、atomic等)外,Journal还可将多个小IO写合并为顺序写Journal,以提升性能。
在社区使用过程中,FileStore也暴露了若干问题:(1)Journal机制使一次写请求在OSD端变为两次写操作(同步写Journal,异步写入object);(2)对前一个问题,社区通常做法是使用专门设备(如SSD)用作Journal以解耦Journal和object写操作的相互影响,但持续循环写入Journal会降低SSD设备的使用寿命;(3)写入的每个object都一一对应OSD本地文件系统的一个物理文件,对于大量小object存储场景,OSD端无法缓存本地所有文件的inode等元数据,使读写操作可能需要多次本地IO,系统性能差;(4)object对应的本地物理文件的文件名,包含了object name、rados namespaces、object name hash、snapshot等信息,可能会超过本地文件系统对文件名长度的限制。
面对上述问题,新的存储引擎NewStore(又被称为KeyFileStore)出现,其关键数据结构如下图所示:

其主要特点有:(1)解耦object与本地物理文件间的一一对应关系,通过索引结构(上图中ONode)在object和本地物理文件建立映射关系,并使用KV数据库存储索引数据;(2)在保证事务特性的同时,对于object的create/append/overwrite(fragement aligned)操作,无需Journal支持;(3)对于unaligned update操作,先同步写入write-ahead-log(简称为WAL,使用KV存储),再异步写入相应的fragement文件;(4)在KV数据库上层建立Onode数据cache以加速读取操作;(5)单个object可以有多个fragement文件,多个object也可共存于一个fragement文件;
FileStore的上述问题,在NewStore结构中已基本解决;NewStore还采用以下策略来减小WAL的性能开销:(1)在update写入fragement文件后,立即将相应WAL从KVdb中删除(WAL已完成使命,无需保存);(2)增大KVdb的write buffer,尽量将WAL保留在buffer中,避免不必要的dump;(3)在write buffer数据dump到磁盘前,强制合并多个buffer数据,以避免不必要的dump。在初步的随机读写测试中,NewStore相对于FileStore有60%的性能提升;
本博客的上篇博文《海量小文件存储与Ceph实践》从元数据管理、本地存储引擎两个方面对海量小文件存储问题进行了分析描述,并通过object class接口层对FileStore存储结构做了改进优化,虽不如NewStore彻底,但也在很大程度上优化了小文件存储性能;NewStore则直接在存储引擎层进行重新设计实现,解耦object与本地物理文件间的对应关系,并允许多个object共存于一个fragement文件;但二者对小文件本地存储引擎优化的本质思想是相通的,即合并存储+索引;不过目前NewStore还在密集开发阶段,到线上部署还需要一段时间;相信以后随着NewStore引擎的逐步部署与成熟,海量小文件存储难题也不再是难题。
另外,基于object class接口层的改进优化方案相关代码实现已放到github,欢迎测试使用及批评指正。
参考:
图片和相关内容摘自2015年6月份Beijing Ceph Day《Newstore》讲稿
http://thread.gmane.org/gmane.comp.file-systems.ceph.devel/23414/focus=23417
http://docs.ceph.com/docs/master/rados/configuration/journal-ref/
http://www.sebastien-han.fr/blog/2014/02/17/ceph-io-patterns-the-bad/
http://tracker.ceph.com/projects/ceph/wiki/Optimize_Newstore_for_massive_small_object_storage
http://www.cnblogs.com/wuhuiyuan/p/ceph-small-file-compound-storage.html
http://www.wzxue.com/ceph-filestore/
http://www.wzxue.com/ceph-keyvaluestore/
https://github.com/yxgup/ceph/tree/omap_indexed_compound
------------------------------------
http://www.cnblogs.com/wuhuiyuan/p/4907984.html
个人原创,转载请注明出处。
Ceph Newstore存储引擎介绍的更多相关文章
- [ ceph ] BlueStore 存储引擎介绍
为什么需要 BlueStore 首先,Ceph原本的FileStore需要兼容Linux下的各种文件系统,如EXT4.BtrFS.XFS.理论上每种文件系统都实现了POSIX协议,但事实上,每个文件系 ...
- 数据库 --> MySQL存储引擎介绍
MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...
- {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用
MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...
- Mysql部分存储引擎介绍
Mysql存储引擎 什么是存储引擎 mysql中建立的库 --> 文件夹 库中建立的表 --> 文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制: ...
- MySql存储引擎介绍
MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...
- MySQL的常见存储引擎介绍与参数设置调优
MySQL常用存储引擎之MyISAM 特性: 1.并发性与锁级别 2.表损坏修复 check table tablename repair table tablename 3.MyISAM表支持的索引 ...
- MySQL的常见存储引擎介绍与参数设置调优(转载)
原文地址:http://www.cnblogs.com/demon89/p/8490229.html MySQL常用存储引擎之MyISAM 特性: 1.并发性与锁级别 2.表损坏修复 check ta ...
- MySql的存储引擎介绍
下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Sl ...
- MYSQL存储引擎介绍--应用场景
MySQL存储引擎通常有哪3种?各自分别有什么特点?应用场景是哪些? MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默 ...
随机推荐
- 动态调用WebService 通用方法Moss 中 传统开发中都可用。
WebService是啥大家都知道了,这里不做过多的解释.通常我们使用WebService的做法基本都是在我们的项目中添加Web引用的方式,首先找到WebService的地址,然后定义命名空间,这样会 ...
- HW5.28
public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...
- nyoj 845 无主之地1
无主之地1 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述 子晓最近在玩无主之地1,他对这个游戏的评价不错,结合了FPS与RPG元素,可玩度很高.不过,他发现了一代的 ...
- [OC Foundation框架 - 14] NSNull
在NSDictionary中,nil代表结束,允许存入 使用NSNull代替 int main(int argc, const char * argv[]) { @autoreleasepool ...
- ISE和Modelsim联合仿真(转)
相信很多人会遇到过这个问题,不知如何让ISE调用Modelsim进行仿真.我也迷糊了不少时间,查查找找,终于弄明白了,所以有了本文,和大家分享一下.我尽量讲得详细点儿,多多上图. 我的环境:Windo ...
- 多线程基础及实例(java)
前言: 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程 ...
- C#中提供的精准测试程序运行时间的类Stopwatch
C#中提供的精准测试程序运行时间的类Stopwatch http://www.cnblogs.com/ret00100/archive/2010/08/06/1793680.html 在需要对程序的执 ...
- Remove “System Program Problem Detected” Messages From Ubuntu
One of my Ubuntu systems would pop up the following message multiple times after logging in: System ...
- C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮【转载】
使用WebBrowser控件,在documentComplete事件处理器里写 HtmlElement name = webBrowser1.Document.GetElementById(" ...
- 慎用StringEscapeUtils.escapeHtml步骤
慎用StringEscapeUtils.escapeHtml方法[转] 推荐使用Apache commons-lang的StringUtils来增强Java字符串处理功能,也一直在项目中大量使用Str ...