草庐IT

mongodb - 没有文件系统的键值存储?

coder 2023-11-02 原文

我正在开发一个应用程序,我们正在编写大量键值对。在生产中,数据库大小将达到数百 TB,甚至数 PB。键为 20 个字节,值最大为 128 KB,很少小于 4 KB。现在我们正在使用 MongoDB。性能不是很好,因为显然这里有很多开销。 MongoDB 写入文件系统,文件系统写入 LVM,LVM 进一步写入 RAID 6 阵列。

由于我们的要求非常基本,我认为使用通用数据库系统会影响性能。我正在考虑实现一个简单的数据库系统,我们可以在其中将文档(或“值”)直接放入原始驱动器(实际上是 RAID 阵列),并存储键(以及指向原始值所在位置的指针驱动器)在由 SSD 支持的快速内存数据库中。这也将加快读取速度,因为不会有任何碎片(与使用文件系统相反。)

虽然文档很少被删除,但我们仍然需要在设备上维护一个可用空间池(文件系统本应提供的)。

我的问题是,这真的会带来任何重大改进吗?另外,是否有任何文档存储系统可以执行类似的操作?或任何类似的东西,我们可以用作起始点?

最佳答案

Apache Cassandra 跃入脑海。在涉及大规模扩展的情况下,它是当前选择的 NoSQL 解决方案。它在 several large companies with massive scaling requirements. 处看到生产使用情况稍微使用过它之后,我可以说需要一点时间来重新考虑您的数据模型以适应它如何安排其存储引擎。著名引用文章"WTF is a supercolumn"对此进行了合理的介绍。警告:只有当您计划存储庞大的数据集并且没有单点故障的分发是一项关键任务要求时,Cassandra 才真正有意义。按照您解释数据的方式,这听起来很合适。

此外,您是否研究过 Redis,至少是为了保存关键引用?您的内存需求远远超过单个实例能够处理的内存需求,但 Redis 也可以配置为分片。这不是它的主要用例,但它 sees production use at both Craigslist and Groupon

此外,您是否已尽一切可能优化 mongo,尤其是研究如何改进索引? Mongo 确实会保存到磁盘,但如果可以的话,在优化以将集合中 HitTest 的部分保留在内存中时应该具有相对的性能。

如果数据不太短暂,是否可以缓存该数据?

我会完全警告你不要自己动手。只是一个公平的警告。这不是对你或其他任何人的打击,只是我个人不得不维护由内部开发人员编写的自定义“数据索引”,这些开发人员之前遇到了麻烦。在我的工作中,我们有一个大量 磁盘键值存储,这是我们系统中的一个主要性能瓶颈,它是由一位后来离开公司的开发人员编写的。在当今激动人心的 NoSQL 机会中遇到这样的解决方案是令人沮丧的。像我上面引用的那些项目利用开源社区的整体力量来证明和优化它们的使用。除非您投入大量时间、精力和晋升,否则您无法通过自己的解决方案实现这一目标。至少I'd encourage you to look at all your nosql options也许找到一个你可以贡献的项目,而不是自己动手。编写数据库服务器本身绝对是一项非常重要的任务,需要一个庞大的团队,尤其是在您提出的要求下(但如果您最终这样做,我祝您好运!=))

关于mongodb - 没有文件系统的键值存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15524705/

有关mongodb - 没有文件系统的键值存储?的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

随机推荐