Database 使用NoSQL数据存储时遇到了哪些可伸缩性问题?

Database 使用NoSQL数据存储时遇到了哪些可伸缩性问题?,database,nosql,key-value-store,graph-databases,distributed-database,Database,Nosql,Key Value Store,Graph Databases,Distributed Database,NoSQL指的是与关系数据库和ACID保证的历史不同的非关系数据存储。流行的开源NoSQL数据存储包括: (表格格式,用Java编写,由Cisco、WebEx、Digg、Facebook、IBM、Mahalo、Rackspace、Reddit和Twitter使用) (文件,以Erlang编写,由BBC和Engine Yard使用) (键值,用Erlang编写,由Powerset使用) (键值,用Java编写,Bing使用) (表格,C++编写,百度使用)< /LI> (键值,用Erlang编写

NoSQL指的是与关系数据库和ACID保证的历史不同的非关系数据存储。流行的开源NoSQL数据存储包括:

  • (表格格式,用Java编写,由Cisco、WebEx、Digg、Facebook、IBM、Mahalo、Rackspace、Reddit和Twitter使用)
  • (文件,以Erlang编写,由BBC和Engine Yard使用)
  • (键值,用Erlang编写,由Powerset使用)
  • (键值,用Java编写,Bing使用)
  • (表格,C++编写,百度使用)< /LI>
  • (键值,用Erlang编写)
  • (键值,用C编写,由Reddit使用)
  • (C++编写的文件,电子艺术、GITHUB、纽约时报和SooCurFrand)
  • (图,用Java编写,一些瑞典大学使用)
  • (键值,用Java编写,由LinkedIn使用)
  • (键值,用C编写,由Craigslist、Engine Yard和Github使用)
  • (键值,以Erlang编写,由Comcast和Mochi Media使用)
  • (键值,用Erlang编写,诺基亚使用)
  • (键值,用Erlang编写,OnScale使用)
  • (文档,用Java编写)
  • (文件,C++编写,由JunkDuff.com使用)
  • (键值,用C编写,由Mixi.jp(日本社交网站)使用)
我想知道您(SO读者)使用数据存储解决的具体问题,以及您使用的NoSQL数据存储

问题:

  • 您使用NoSQL数据存储解决了哪些可伸缩性问题
  • 您使用了什么NoSQL数据存储
  • 在切换到NoSQL数据存储之前,您使用了什么数据库

我在寻找第一手经验,所以除非你有,否则请不要回答。

我没有。我想使用一个简单和免费的键值存储,我可以在进程中调用,但这样的东西在Windows平台上并不存在。现在我使用Sqlite,但我想使用类似Tokyo Cabinet的东西。伯克利DB有许可证“问题”

但是,如果您想使用Windows操作系统,您对NoSQL数据库的选择是有限的。而且并不总是有一个C#提供者


我确实试过MongoDB,它比Sqlite快40倍,所以也许我应该使用它。但我仍然希望有一个简单的过程中解决方案

我没有第一手经验,但我发现博客条目非常有趣。

我使用redis跨机器存储日志消息。它很容易实现,而且非常有用。Redis真的很震撼

我很抱歉反对你的粗体文本,因为我没有任何第一手经验,但这组博客文章是解决CouchDB问题的一个很好的例子


本质上,应用程序使用CouchDB来处理其爆炸性的数据问题。他们发现SQL速度太慢,无法处理大量存档数据,于是将其转移到CouchDB。这本书读得很好,他讨论了找出CouchDB可以解决哪些问题以及这些问题最终如何解决的整个过程。

实际上,我目前的项目

在标准化结构中存储18000个对象:在8个不同的表中存储90000行。检索它们并将它们映射到我们的Java对象模型需要1分钟,所有内容都正确索引,等等

使用轻量级文本表示将它们存储为键/值对:1个表,18000行,用3秒钟检索它们并重建Java对象

从商业角度来看:第一种选择是不可行的。第二种选择意味着我们的应用程序可以工作

技术细节:在MySQL上运行SQL和NoSQL!坚持使用MySQL,以获得良好的事务支持、性能,并在不破坏数据、可伸缩性良好、支持集群等方面取得了良好的业绩记录

MySQL中的数据模型现在只是关键字段(整数)和大的“值”字段:基本上只是一个大的文本字段

我们没有选择任何新玩家(CouchDB、Cassandra、MongoDB等),因为尽管他们各自都提供了出色的功能/性能,但在我们的环境中总是存在缺点(例如缺少/不成熟的Java支持)

(ab)使用MySQL的额外好处——我们的模型中的相关部分可以很容易地链接到我们的键/值存储数据

更新:这是一个我们如何表示文本内容的示例,而不是我们的实际业务领域(我们不处理“产品”),因为我的老板会向我开枪,但传达了这个想法,包括递归方面(一个实体,这里是产品,“包含”其他实体)。希望很清楚,在正常化结构中,这可能是相当多的表格,例如,将一种产品加入其口味范围,包含哪些其他产品,等等

Name=An Example Product
Type=CategoryAProduct
Colour=Blue
Size=Large
Flavours={nice,lovely,unpleasant,foul}
Contains=[
Name=Product2
Type=CategoryBProduct
Size=medium
Flavours={yuck}
------
Name=Product3
Type=CategoryCProduct
Size=Small
Flavours={sublime}
]
托德·霍夫(Todd Hoff's)对NoSQL有大量的报道,包括一些案例研究

商业专栏DBMS可能适合您的用途(即使它支持SQL):与传统的关系DBMS相比,它在分析查询方面速度非常快。参见Stonebraker等人的对比Vertica和map reduce

更新:还有其他几个,包括HBase、伏地魔、MongoDB、MemcacheDB、Redis和HyperTable


更新2:Rick Cattell刚刚发表了一篇文章,比较了美国的几种NoSQL系统。highscalability.com对Rick论文的看法是。

为了能够处理负载,我将一个小的子项目从MySQL切换到了CouchDB。结果是惊人的

大约2年前,我们在上发布了一个自行编写的软件(这可能是德国最大的Linux社区网站)。该站点是用Python编写的,我们添加了一个WSGI中间件,它能够捕获所有异常并将它们发送到另一个支持MySQL的小型网站。这个小网站使用散列来确定不同的bug,并存储出现的次数和最后一次出现的次数

不幸的是,发布后不久,回溯记录器网站就没有了
var customers = redis.Lists["customers"]; //Implements IList<Customer>
customers.Add(new Customer { Name = "Mr Customer" });
var errors = redis.List["combined:errors"];
errors.Insert(0, new Error { Name = ex.GetType().Name, Message = ex.Message, StackTrace = ex.StackTrace});
redis.TrimList(errors, 1000);