深入浅出jcr之十二 key-value存储系统

简介:
      在写文章方面,惰性心理无时无刻不折磨着我,文章的标题已经列在那里很长时间,可是我就是不愿意打开,不愿意把心中所想描绘出来。类似的情况可能也折磨着很多的其他同学。虽然jackrabbit是一个小众的框架,看的人和想看的人非常的少,但是其中确实包含了很多值得我们学习和研究的技术和实现,当然也有很多不足,需要我们去改进。所以我强迫自己继续写下去。

上一篇文章讲到高亮和及时搜索的问题,在文章的最后我也提出了一些问题,就是如果将高亮去掉,那么势必会带来一个问题,那就是小文本文件的存储问题,一般有大型网络经验的人都知道,小文本存储在磁盘上,读取性能是非常低的,原因就是当前的磁盘的构造决定的。

当前市面的磁盘由磁头和磁片组成,数据都通过磁头写到磁片上,而写在磁片上又是根据磁道来划分,如果我们的小文件是单独存储的,那么一个磁头会将它们写在不同的磁道上,下次在读取的时候,磁头就需要不停的寻道,找到它想读取到的文件。寻道有两个过程,第一个是找到正确的磁道,而第二个过程是找到磁道上正确的起始位置。尤其是第一过程,寻道过程在大并发的情况下,磁头需要不停的进行寻道的工作,这个寻道是非常的消耗时间的。
所以小文件存储讲究的合并,即将小文件合并成大文件。

同样,在jackrabbit中,由于二进制文档数据被提取之后,是放到索引文件的,所以带来的一个问题是索引文件的大小成倍增加,在索引同步的时候,代价明显增大,这一点ahuaxuan在前文中也有较为相信的描述。而现在,我们就是要解决这个问题,提取之后的文本数据究竟应该放在什么地方。

是单独放在目录里面吗?对目录进行分级,一般多个大文件,比如视频文件之类的都会采取这种做法。对于一个平均长度是100kb-200kb的文本数据来说,如果也采取目录分级的方法来存放的话,那势必会存在非常多的这种文件,一旦又涉及到集群,那么对于jackrabbit来说,这一定是一场噩梦。

最好的方法是能够将这些小文件存储到一个大文件中,而且可以通过nodeid直接取到这样的小文本。这个时候我们就自然而然的想到使用key-value数据存储系统。比如市面上有tc,bdb,等等,但是他们都是local的,还是做不了数据的共享,无法使用到集群的场景下,一个clustorNode的数据无法和其他clustorNode共享。

这个时候我们又自然而然的想到memcachedb, tt+tc, mina+bdb.通过在local的key-value存储系统上套一个socket服务,一个local的key-value存储系统变成了一个remote的key-value系统,任何人都可以调用它们的服务。即使是在集群的环境下,也没有问题了。

大的方向确定之后,就是做各种性能测试。第一个排除的是memcachedb,之前有人跟我讲它的性能不是很好,我还不相信,经过自己的一轮测试下来,发现,在100kb文本的情况下,50000次save操作,耗时超过了我吃饭的时间。调整参数之后再测,稍微快一点,但是还是太慢了,有空整理一下我的测试结果。

为了确保bdb没有这么差的性能,我开始测试java版本的bdb在100k文本下的性能,经过多次测试,在我这块7000转的磁盘上,每秒钟的写入速度可以达到23m/s,读取速度38m/s,每秒钟读取100kb文本可以到350requests/second,这证明bdb是没有问题的。

那么memcachedb不够快应该是其本身的问题(当然也不排除我的参数配置不准确,即使不准确,也不应该差这么多)。

于是,我自定义了一个简单二进制协议,用mina+bdb,实现java版本的memcachedb,同样的测试,结果为写入14m/s,读取17m/s,每秒平均请求数为150 requests/s.

显然,这里有很大的优化的余地。至少网络io上不应该成为瓶颈。而且可以大胆的预测,在真正的存储系统中,磁盘将会是主要性能瓶颈。支持多磁盘的key-value存储系统可以有效的提高系统的整体读写性能。

同样我也测试过tc+tt,50000次100kb的save,耗时1300秒,在大文本的情况下性能也不咋滴。而且它还不支持多磁盘。更正,上面的结果是受网络环境的限制。我的测试网络带宽一会4m,一会20m,晕倒,等会把测试代码放到tc+tt server上测试

同时也希望使用过memcachedb存储大文本的同学出来说说它的性能到底如何。
目录
相关文章
|
8月前
|
API 数据库 Swift
【Swift开发专栏】Swift中的数据持久化:Core Data与Realm
【4月更文挑战第30天】本文探讨了Swift中两种流行的数据持久化框架——Core Data和Realm。数据持久化是保持应用数据在不同运行周期间一致性的关键。Core Data,苹果的ORM系统,适合处理复杂数据关系,提供与iOS生态系统的无缝集成。使用Core Data涉及定义数据模型、生成NSManagedObject子类、配置持久化容器及执行数据操作。而 Realm,一个轻量级数据库,以其高性能、易于使用的API和实时数据同步适用于跨平台项目。在Swift中使用Realm,需定义数据模型、配置Realm实例、执行数据操作并观察数据变化。理解这两者能帮助开发者构建更高效、可靠的应用。
212 0
|
8月前
|
存储 NoSQL Redis
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)(三)
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)
86 0
|
8月前
|
存储 NoSQL 安全
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)(二)
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)
91 0
|
8月前
|
存储 NoSQL API
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)(一)
作者推荐 |【Redis技术进阶之路】「原理系列开篇」揭秘高效存储模型与数据结构底层实现(SDS)
81 0
|
8月前
|
存储 机器学习/深度学习 NoSQL
作者推荐 |【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)(二)
作者推荐 |【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)
90 0
|
8月前
|
存储 缓存 NoSQL
作者推荐 |【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)(一)
作者推荐 |【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)
70 0
|
存储 NoSQL 算法
【评论抽奖xdm】redis 学习十五,redis sds数据结构和底层设计原理
redis 是 C 语言写的,那么我们思考一下 redis 是如何表示一个字符串的?redis 的数据结构和 C 语言的数据结构是一样的吗?
|
存储 缓存 NoSQL
分布式ID彻底把它搞懂
《分布式》系列
567 0
分布式ID彻底把它搞懂
|
存储 缓存 负载均衡
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
344 0
【算法技术专题】如何用Java实现一致性 hash 算法( consistent hashing )(上)
|
JSON 网络协议 Dubbo
lagou 爪哇 3-1 分布式理论、架构设计(自定义RPC)笔记
分布式系统概念 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。俗的理解,所谓分布式系统,就是一个业务拆分成多个子业务,分布在不同的服务器节点,共同构成的系统称为分布式系统,同一个分布式系统中的服务器节点在空间部署上是可以随意分布的,这些服务器可能放在不同的机柜中,也可能在不同的机房中,甚至分布在不同的城市。 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技 术,例如:RMI、Hessian、SOAP、ESB和JMS等,它们背后到底是基于什么原理实现的呢
140 0
lagou 爪哇 3-1 分布式理论、架构设计(自定义RPC)笔记

热门文章

最新文章

下一篇
开通oss服务