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数据存储.
问题:
您使用NoSQL数据存储解决了哪些可扩展性问题?
您使用了什么NoSQL数据存储?
在切换到NoSQL数据存储之前,您使用了什么数据库?
我正在寻找第一手经验,所以除非你有这个经验,否则请不要回答.
我当前的项目实际上.
在规范化结构中存储18,000个对象:8个不同表中的90,000行.花了1分钟检索并将它们映射到我们的Java对象模型,即所有内容都正确索引等.
使用轻量级文本表示将它们存储为键/值对:1个表,18,000行,3秒,以检索它们并重建Java对象.
在业务方面:第一种选择是不可行的.第二个选项意味着我们的应用程
技术细节:在MySQL上运行SQL和NoSQL!坚持使用MySQL获得良好的事务支持,性能和可靠的跟踪记录,以便不破坏数据,扩展相当好,支持群集等.
我们在MySQL中的数据模型现在只是关键字段(整数)和大"值"字段:基本上只是一个大的TEXT字段.
我们没有与任何新球员(CouchDB的,卡桑德拉,MongoDB的,等等)去,因为尽管他们各自在自己的权利提供了极大的功能/性能,总有弊端我们的情况下(如缺少/不成熟的Java支持).
使用MySQL(AB)的额外的好处-我们的模型的位不相关地工作,可以很容易地联系到我们的键/值存储数据.
更新:这里有我们如何表示的文本内容,而不是我们的实际业务领域的例子作为我boss'd拍我(我们不以"产品"工作),但传达的理念,包括递归方面(一个实体,在这里一种产品,"包含"其他产品).希望很清楚,在标准化结构中,这可能是相当多的表格,例如将产品加入到其各种口味中,包含其他产品等等
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} ]
我已经将一个小的子项目从MySQL切换到CouchDB,以便能够处理负载.结果令人惊讶.
大约2年前,我们在http://www.ubuntuusers.de/上发布了一个自编软件(这可能是德国最大的Linux社区网站).该站点是用Python编写的,我们添加了一个WSGI中间件,它能够捕获所有异常,并将它们发送到另一个小型的MySQL网站.这个小网站使用哈希来确定不同的错误并存储出现次数和最后一次出现次数.
不幸的是,在发布后不久,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更好的选择)并且它的工作做得很好.
Todd Hoff的highscalability.com有很多关于NoSQL的报道,包括一些案例研究.
商业版Vertica柱状DBMS可能适合您的目的(即使它支持SQL):与传统的关系DBMS相比,它的分析查询速度非常快.请参阅Stonebraker等人最近的CACM论文,将Vertica与map-reduce进行对比.
更新:Twitter选择Cassandra而不是其他几个,包括HBase,Voldemort,MongoDB,MemcacheDB,Redis和HyperTable.
更新2:Rick Cattell刚刚发布了高性能数据存储中几个NoSQL系统的比较.而highscalability.com对Rick的论文的看法就在这里.
我们将部分数据从mysql移动到mongodb,不仅仅是为了扩展性,而是因为它更适合文件和非表格数据.
在生产中我们目前存储:
25万个文件(60GB)
1.3亿其他"文件"(350GB)
每日营业额约10GB.
使用mongodb python api(pymongo),使用apache/wsgi/python客户端在两个节点(6x450GB sas raid10)上以"配对"配置部署数据库.磁盘设置可能有点过分,但这就是我们用于mysql的东西.
除了pymongo线程池的一些问题和mongodb服务器的阻塞性质,它是一个很好的体验.
我为违反您的大胆文本而道歉,因为我没有任何第一手经验,但这组博客文章是解决CouchDB问题的一个很好的例子.
CouchDB:案例研究
从本质上讲,textme应用程序使用CouchDB来处理它们爆炸性的数据问题.他们发现SQL处理大量存档数据的速度太慢,并将其移至CouchDB.这是一个很好的阅读,他讨论了整个过程,找出CouchDB可以解决的问题以及他们最终如何解决这些问题.
我们将用于存储在Postgresql和Memcached中的一些数据移动到Redis中.键值存储更适合存储分层对象数据.与使用ORM将blob映射到RDBMS相比,您可以更快地存储blob数据,并且开发时间和精力更少.
我有一个开源的c#redis客户端,允许您使用1行存储和检索任何POCO对象:
var customers = redis.Lists["customers"]; //Implements IListcustomers.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);