目前我们使用 mongodb 作为大型在线销售网站的主要存储,目前我们专注于多台机器之间的大可扩展性。
网站后端是用 node.js 编写的,我们使用 mongoose 作为 ODM。
我看到很多博客文章都在写很棒的 cassandra DB,我开始考虑切换到 cassandra。但我仍然不确定这是否是一个真正好的决定,因为我没有为 cassandra 和 node.js 找到任何好的 ODM/ORM 库(并且编写原始查询可能很痛苦。也可以编写经过良好测试的 ORM/ODM耗时的任务)。所以我不确定这次转换后我会有多少好处。我们正在使用 elasticsearch 作为搜索引擎,它与 mongodb 结合使用效果很好,我想我自己也能与 cassandra 结合使用。
如果您对此有任何经验,那将非常有帮助。
谢谢!
最佳答案
Cassandra 是一个设计非常漂亮的数据库,可以满足很多场景。 MongoDB 也是一个非常好的数据库引擎。因此,让我为您比较几个主要要点。
始终开启系统
当您需要在多个数据中心提供 24x7 操作时,Cassandra 真的很棒。如果你有一个以上的数据中心,每个数据中心都有多台服务器,那么 Cassandra 非常适合你。 Cassandra 可以将写入同步到多个数据中心,并在复杂的设置中保持所需的数据一致性。恢复和重新同步也很容易。
另一方面,MongoDB 易于操作。如果你有一个数据中心并且只有几台服务器,它可能是一个完美的选择(尽管随着时间的推移全局写锁可能会很痛苦)。在简单的部署中,它很容易维护和监控。
可扩展性
继续上面的陈述——Cassandra 是线性可扩展的。从字面上看,集群的大小没有限制。您的写入将始终保持快速,而读取可能会随着时间的推移变得更加复杂 - 这取决于您的数据结构。
数据的非规范化
使用 Cassandra,如果您创建一个结构来反射(reflect)您需要从数据中获取的内容,那么您的写入和读取速度会非常快。没有查询语言(好吧,有,但不完全是 SQL)可用于使用聚合、分组等重组您的结果集。是的,有些事情是可行的,有些则不是 -这是非常特定于 Cassandra 数据模型的。您将不得不自己实现很多事情并将结果写入数据库 - 即聚合计数器、不同分组等。
相比之下,MongoDB 易于使用、更容易学习且更灵活 - 无论是对于开发(随着知识曲线/努力的发展)还是对于业务逻辑的实现(随着时间/努力的考虑)。这在某种程度上是 MongoDB 有 ORM 引擎而 Cassandra 仅有一对(非常有限)的原因。
总而言之 - 两个数据库都非常好......如果你愿意接受它们的局限性。如果您只有 100GB 的数据,并且您需要灵活、易于实现的数据库引擎,我会坚持使用 MongoDB,或者看看 RethinkDB它们具有非常相似的模型和更好的方式(在我个人看来)集群/数据中心复制实现。
如果您很快需要存储数 TB 的数据,跨多个数据中心部署您的应用程序,同时接受实现相同功能和维护类似功能的额外工作成本,那么 Cassandra 是您的绝佳选择。
不要认为我在描述您的数据集时使用了仅 这个词。是的,它并不大 - 我公司这些天存储了超过 20 TB...所以是的,100GB 真的不是那么多...
为了阻止每个人指出我应该比较其他一些特征或指出这两者之间的其他一些差异 - 这只是对我认为与问题相关的事情的粗略、高级概述,而不是全面比较或分析问题。但请随时指出我遗漏的内容,我很乐意在此答案中包含新内容...
关于node.js - Cassandra 或 mongodb 或其他大型在线销售网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23832667/
我试图在一个项目中使用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时
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每
我在Rails模型中有两列相互关联:Article.bodyArticle.body_updated_on每次Article.body更新时,我想将Article.body_updated_on更改为Time.now。如果任何其他字段已更新,则无需进行任何操作。 最佳答案 只需在将回调保存到您的文章模型之前添加classArticle 关于ruby-on-rails-RubyonRails,在更新其他列值时更改列值,我们在StackOverflow上找到一个类似的问题:
使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour
例如:options={fight:true,use_item:false,run_away:false,save_game:false}我想要一个计算结果为true的bool表达式,当且仅当:fight为true,其余为false(如上图所示)。我可以一起解决这个问题,但我正在努力训练自己编写更优雅的ruby。谢谢!编辑:黑客是:(options[:fight]==true&&options.delete(:fight).values.all{|x|!x}) 最佳答案 假设所有值都是严格的bool值,它很简单:options=