提问



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



  • Cassandra(表格,用Java编写,由Cisco,WebEx,Digg,Facebook,IBM,Mahalo,Rackspace,Reddit和Twitter使用)

  • CouchDB(文档,用Erlang编写,BBC和Engine Yard使用)

  • Dynomite(键值,用Erlang编写,由Powerset使用)

  • HBase(键值,用Java编写,Bing使用)

  • Hypertable(表格,用C ++编写,百度使用)

  • Kai(键值,用Erlang编写)

  • MemcacheDB(键值,用C编写,Reddit使用)

  • MongoDB(文档,用C ++编写,由Electronic Arts,Github,NY Times和Sourceforge使用)

  • Neo4j(图形,用Java编写,一些瑞典大学使用)

  • Project Voldemort(键值,用Java编写,由LinkedIn使用)

  • Redis(键值,用C语言编写,Craigslist,Engine Yard和Github使用)

  • Riak(键值,用Erlang编写,Comcast和Mochi Media使用)

  • Ringo(键值,用Erlang编写,诺基亚使用)

  • Scalaris(键值,用Erlang编写,由OnScale使用)

  • Terrastore(文档,用Java编写)

  • ThruDB(文档,用C ++编写,JunkDepot.com使用)

  • 东京内阁/东京暴君(键盘,用C语言编写,由Mixi.jp(日本社交网站)使用)



我想知道你的具体问题 - SO读者 - 使用数据存储和你使用的NoSQL数据存储解决了。[4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20]


问题:



  • 您使用NoSQL数据存储解决了哪些可扩展性问题?

  • 你使用了什么NoSQL数据存储?

  • 在切换到NoSQL数据存储之前,您使用了哪些数据库?



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

最佳参考


我已经将一个小的子项目从MySQL切换到CouchDB,以便能够处理负载。结果令人惊讶。


大约2年前,我们已经在http://www.ubuntuusers.de/(可能是德国最大的Linux社区网站)上发布了自编软件。该网站是用Python编写的,我们已经添加了一个WSGI中间件它能够捕获所有异常并将它们发送到另一个小型MySQL驱动的网站。这个小网站使用哈希来确定不同的错误,并存储出现次数和最后一次出现。[21]


不幸的是,在发布后不久,traceback-logger网站就不再响应。我们的主站点的生产数据库存在一些锁定问题,几乎每个请求都会抛出异常,还有其他几个错误,我们还没有在测试阶段探索。我们主站点的服务器集群,称为traceback-logger提交页面,每秒几次k次。这对于托管回溯记录器的小型服务器来说太过分了(它已经是旧服务器,仅用于开发目的)。


此时CouchDB相当受欢迎,因此我决定尝试一下并用它编写一个小型的追溯记录器。新的记录器只包含一个python文件,它提供了一个包含排序和过滤器选项的错误列表以及一个提交页面。在后台我开始了CouchDB流程。新软件对所有请求的响应速度非常快,我们能够查看大量的自动错误报告。


一个有趣的事情是,之前的解决方案是在旧的专用服务器上运行,另一方面,新的基于CouchDB的站点仅在资源非常有限的共享xen实例上运行。而且我甚至没有使用键值存储的强度来横向扩展.CouchDB/Erlang OTP处理并发请求而不锁定任何东西的能力已足以满足需求。


现在,快速编写的CouchDB-traceback记录器仍在运行,是探索主网站上的错误的有用方法。无论如何,大约每月一次数据库变得太大而CouchDB进程被杀死了。但是,CouchDB的compact-db命令再次将大小从几GB减小到一些KB,并且数据库再次启动并运行(也许我应该考虑在那里添加一个cronjob ... 0o)。


在总结中,CouchDB肯定是这个子项目的最佳选择(或者至少是比MySQL更好的选择)并且它的工作做得很好。

其它参考1


我当前的项目实际上。


在规范化结构中存储18,000个对象:8个不同表中的90,000行。花了1分钟检索并将它们映射到我们的Java对象模型,即所有内容都正确索引等。


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


在业务方面:第一种选择是不可行的。第二个选项意味着我们的应用程


技术细节:在MySQL上运行SQL和NoSQL!坚持使用MySQL获得良好的事务支持,性能和可靠的跟踪记录,以便不破坏数据,扩展相当好,支持群集等。


我们在MySQL中的数据模型现在只是关键字段(整数)和大值字段:基本上只是一个大的TEXT字段。


我们没有使用任何新的播放器(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}
]

其它参考2


Todd Hoff的highscalability.com有很多关于NoSQL的报道,包括一些案例研究。[22]


商业版Vertica柱状DBMS可能适合您的目的(即使它支持SQL):与传统的关系DBMS相比,它在分析查询方面非常快。请参阅Stonebraker等人的最新CACM论文,将Vertica与map-reduce进行对比。[[[23] [24]


更新:Twitter选择Cassandra超过其他几个,包括HBase,Voldemort,MongoDB,MemcacheDB,Redis和HyperTable。[25]


更新2:Rick Cattell刚刚发布了高性能数据存储中几个NoSQL系统的比较。而highscalability.com对Rick的论文也在这里。[26] [27]

其它参考3


我们将部分数据从mysql移动到mongodb,不仅仅是为了扩展性,而是因为它更适合文件和非表格数据。


在生产中我们目前存储:



  • 25,000个文件(60GB)

  • 1.3亿其他文件(350GB)



每日营业额约10GB。


使用mongodb python api(pymongo),使用apache/wsgi/python客户端在两个节点(6x450GB sas raid10)上以配对配置部署数据库。磁盘设置可能有点过分,但这就是我们用于mysql的东西。


除了pymongo线程池的一些问题和mongodb服务器的阻塞性质,它是一个很好的体验。

其它参考4


我为违反您的大胆文本而道歉,因为我没有任何第一手经验,但这组博客文章是解决CouchDB问题的一个很好的例子。


CouchDB:案例研究[28]


基本上,textme应用程序使用CouchDB来处理它们爆炸性的数据问题。他们发现SQL太慢而无法处理大量的归档数据,并将其移至CouchDB。这是一个很好的阅读,他讨论了整个过程,找出CouchDB可以解决的问题以及他们最终如何解决这些问题。[29]

其它参考5


我们已将用于存储在Postgresql和Memcached中的一些数据移动到Redis中。键值存储更适合存储分层对象数据。您可以更快地存储blob数据,并且比使用更少的开发时间和精力ORM将您的blob映射到RDBMS。[30]


我有一个开源的c#redis客户端,它允许你用1行存储和检索任何POCO对象:[31]


var customers = redis.Lists["customers"]; //Implements IList<Customer>
customers.Add(new Customer { Name = "Mr Customer" });


键值存储也更容易向外扩展,因为您可以添加新服务器,然后均匀地分配负载以包含新服务器。重要的是,没有中央服务器会限制您的可扩展性。 (尽管您仍然需要一种策略来进行一致性散列来分发您的请求)。


我认为Redis是类固醇的托管文本文件,为多个客户端提供快速,并发和原子访问,因此我以前使用文本文件或嵌入式数据库的任何东西现在都使用Redis。例如为了获得我们所有服务的实时组合滚动错误日志(这对我们来说一直是一项艰巨的任务),现在只需几行就可以完成,只需将错误预先挂起到Redis服务器端列表然后修剪列表,只保留最后1000个,例如:


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);

其它参考6


我没有第一手经验。但我发现这篇博文很有意思。[32]

其它参考7


我发现将软件域对象(例如aSalesOrder,aCustomer ...)映射到二维关系数据库(行和列)的工作需要大量代码来保存/更新,然后再次从多个表中实例化域对象实例。更不用说拥有所有这些连接的性能,所有这些磁盘读取......只是为了查看/操作域对象,例如销售订单或客户记录。


我们已切换到对象数据库管理系统(ODBMS)。它们超出了列出的noSQL系统的功能。 GemStone/S(用于Smalltalk)就是这样一个例子。还有其他ODBMS解决方案,可以使用多种语言的驱动程序。一个关键的开发人员利益,您的类层次结构自动是您的数据库模式,子类和所有。只需使用面向对象的语言使对象持久化到数据库。 ODBMS系统提供ACID级别的交易完整性,因此它也适用于金融系统。

其它参考8


我不想。我想使用一个简单而免费的键值存储,我可以在进程中调用,但这样的事情在Windows平台上并不存在。现在我使用Sqlite但我想使用类似Tokyo Cabinet的东西。 BerkeleyDB有许可证问题。


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


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

其它参考9


我使用redis在机器上存储日志消息。它非常容易实现,非常有用。 Redis真的很摇滚

其它参考10


我们用CouchDB文档数据库替换了postgres数据库,因为没有固定模式对我们来说是一个很大的优势。每个文档都有可变数量的索引用于访问该文档。

其它参考11


我从MySQL(InnoDB)切换到cassandra用于M2M系统,该系统基本上为每个设备存储传感器的时间序列。每个数据都由(device_id,date)和(device_id,type_of_sensor,date)索引。 MySQL版本包含2000万行。


MySQL的:



  • 在主 - 主同步中设置。围绕失去同步几乎没有出现问题。这很紧张,特别是在开始时可能需要数小时才能解决。

  • 插入时间不是问题,但查询需要越来越多的内存随着数据的增长。问题是索引被视为一个整体。在我的情况下,我只是使用非常薄在内存中加载所需的部分索引(只有百分之几的设备经常被监控,并且它是最新的数据)。

  • 难以备份。 Rsync无法对大型InnoDB表文件进行快速备份。

  • 很快就清楚地知道无法更新繁重的表架构,因为它耗费了太多时间(小时)。

  • 导入数据需要数小时(即使最后完成索引)。最好的救援计划是始终保留一些数据库副本(数据文件+日志)。

  • 从一家托管公司迁移到另一家非常重要。必须非常小心地处理复制。



卡桑德拉:



  • 比MySQL更容易安装。

  • 需要大量内存。一个2GB的实例无法让它在第一个版本中运行,现在它可以在一个1GB的实例上工作,但它不是主意(太多的数据刷新)。在我们的情况下,给它8GB就足够了。

  • 一旦了解了如何组织数据,就可以轻松存储。请求有点复杂。但是一旦你解决它,它真的很快(除非你真的想要,否则你真的不会犯。)

  • 如果上一步操作正确,那就是并保持超快速。

  • 几乎看起来数据被组织为备份。每个新数据都将添加为新文件。我个人而言,这并不是一件好事,每晚和每次关机之前刷新数据(通常用于升级),以便恢复所需的时间更少,因为我们需要更少的日志来阅读。它不会创建很多文件,因为它们是压实。

  • 导入数据的速度很快。你拥有的主机越多越快。导出和导入千兆字节的数据不再是问题。

  • 没有架构是一件非常有趣的事情,因为您可以让您的数据发展以满足您的需求。这可能意味着在同一列系列中同时拥有不同版本的数据。

  • 添加主机很简单(虽然不是很快),但我还没有在多数据中心设置上完成。



注意:我还使用了elasticsearch(基于lucene的文档),我认为它应该被视为NoSQL数据库。它是分布式的,可靠的并且通常很快(一些复杂的查询可以执行得非常糟糕)。[33]

其它参考12


我过去使用过Couchbase,遇到了重新平衡问题和其他问题。目前我在几个生产项目中使用Redis。我使用redislabs.com,它是Redis的托管服务,负责扩展Redis集群。我已经在我的博客http://thomasjaeger.wordpress.com上发布了关于对象持久性的视频,该视频展示了如何在提供者模型中使用Redis以及如何将C#对象存储到Redis中。看看。[34]]] [35]

其它参考13


我鼓励任何阅读本书的人再次尝试使用Couchbase,因为3.0已经出门了。首发有200多个新功能。 Couchbase Server的性能,可用性,可扩展性和易管理功能使数据库非常灵活,高度可用。管理UI是内置的,API自动发现集群节点,因此不需要从应用程序到数据库的负载均衡器。
虽然我们目前没有托管服务,但您可以在AWS,RedHat Gears,Cloudera,Rackspace,像CloudSoft这样的Docker容器等运行沙发基础。关于重新平衡,这取决于您具体指的是什么,但根据设计,Couchbase在节点故障后不会自动重新平衡,但管理员可以为第一个节点故障设置自动故障转移并使用我们的API,您也可以在使它们处于Activity状态或使用RestAPI之前访问副本vbucket以进行读取您可以通过监视工具强制执行故障转移。这是一种特殊情况,但可以完成。


我们倾向于不在几乎任何模式下重新平衡,除非节点完全脱机并且永远不会返回或者新节点已准备好自动平衡。以下是一些指南,可帮助任何有兴趣了解其中一个性能最高的NoSQL数据库的人。



  1. Couchbase Server 3.0

  2. 管理指南

  3. REST API

  4. 开发人员指南



最后,我还建议您查看N1QL以进行分布式查询:[36] [37] [38] [39]



  1. N1QL教程

  2. N1QL指南



感谢您阅读,让我或其他人知道您是否需要更多帮助![40] [41]


奥斯汀