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

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

  • Cassandra(表格,用Java编写,由思科,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(关键值,用Comcast和Mochi Media使用的Erlang编写)
  • Ringo(键值,由Erlang编写,由Nokia使用)
  • Scalaris(关键值,用Erlang编写,由OnScale使用)
  • Terrastore(文档,用Java编写)
  • ThruDB(文档,用C ++编写,由JunkDepot.com使用)
  • 东京内阁/东京暴君(键值,用C语言编写,由Mixi.jp(日本社交网站)使用)
  • 我想知道您 - SO读者 - 使用数据存储和您使用的NoSQL数据存储解决的具体问题。

    问题:

  • 您使用NoSQL数据存储解决了哪些可伸缩性问题?
  • 您使用了哪些NoSQL数据存储?
  • 在切换到NoSQL数据存储之前,您使用过哪些数据库?
  • 我正在寻找第一手经验,所以请不要回答,除非你有这个经验。


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

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

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

    此时CouchDB非常流行,所以我决定尝试一下,然后写一个小的跟踪记录器。 新的记录器只包含一个python文件,该文件提供了一个包含排序和筛选选项的缺陷列表以及一个提交页面。 在后台我开始了一个CouchDB过程。 新软件对所有请求的反应非常迅速,我们能够查看大量的自动错误报告。

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

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

    总之,对于这个子项目,CouchDB肯定是最好的选择(或者至少比MySQL更好的选择),并且它的工作很好。


    我目前的项目实际上。

    以标准化结构存储18,000个对象:跨越8个不同表的90,000行。 花了1分钟检索并将它们映射到我们的Java对象模型,这与一切正确索引等。

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

    用商业术语来说:第一种选择是不可行的。 第二个选项意味着我们的应用程序工作

    技术细节:针对SQL和NoSQL在MySQL上运行! 坚持与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}
    ]
    

    托德霍夫的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对瑞克的论文的看法就在这里。

    链接地址: http://www.djcxy.com/p/86383.html

    上一篇: What scalability problems have you encountered using a NoSQL data store?

    下一篇: ElasticSearch, Sphinx, Lucene, Solr, Xapian. Which fits for which usage?