在MySQL上使用NoSQL数据库
我有一个运行在Java堆栈(Struts 2 + Spring + Hibernate)上的Web应用程序,并保存在MySQL中。 我研究了NoSQL数据库,与RDBMS相比,他们确实很容易推理和使用。 这是一个音乐流媒体应用程序,存储艺术家信息并允许用户保存播放列表。
我想知道是否有切换到NoSQL DB(CouchDB?,MongoDB?,Cassandra?)的优势(性能?,硬件成本?,简化代码?,可扩展性?)。 切换到NoSQL数据库会损失/获得什么?
请指教。
“NoSQL”的礼貌解释已成为Not Only SQL
。 如果您的数据确实是真正的关系数据,或者您的功能取决于联接和ACIDity等事情,那么您应该以关系方式存储这些数据。 在这篇文章中,我将解释如何在两个NoSQL数据存储中使用MySQL。 现代的网络数据存储就是了解如何为工作选择最佳工具。
也就是说,NoSQL实际上是对这样一个事实的反应,即关系方法和思维方式已被应用于实际上不太适合的问题(通常是具有数千万行或更多行的巨大表)。 一旦表格变得庞大,典型的SQL“最佳实践”就是手动分割数据 - 也就是将表A中的记录1至10,000,000,B中的记录10,000,001至20,000,001等等。 然后,通常在应用程序模型层中,根据此方案执行查找。 这就是所谓的application-aware
缩放。 这是时间密集型的,容易出错,但是为了扩展长表存储而扩展某些内容,这已经成为一个标准的MO。 对于我来说,NoSQL代表了无application-unaware
替代方案。
核心价值
当我有一个MySQL原型开始变得太大以至于它本身的好处时,我个人将尽可能多的数据移动到闪电般的Membase上,Membase超越了Memcached并增加了持久性。 Membase是一个分布式键值存储,它或多或少呈线性扩展(例如Zynga使用它来处理每秒五百万次操作),方法是将更多的商品服务器添加到群集中 - 因此非常适合云时代亚马逊EC2,Joyent等。
众所周知,分布式键值存储是获得巨大线性规模的最佳途径。 关键值的弱点是可查询性和索引。 但即使在关系型世界中,可伸缩性的最佳实践也是尽可能地减轻应用程序服务器的负担,在商品应用程序服务器上进行内存连接,而不是要求中央RDB集群处理所有这些逻辑。 由于simple select
和application logic
实际上是即使在MySQL上也能实现大规模的最佳方式,所以向Membase(或其竞争对手,如Riak)的过渡并不算太糟糕。
文档商店
有时候 - 虽然我认为不如许多人想象的那么频繁 - 应用程序的设计固有地需要二级索引,范围可查询性等.NoSQL的方法是通过像MongoDB这样的document store
。 就像Membase一样,Mongo在关系数据库特别薄弱的某些领域也非常出色,例如application-unaware
缩放, auto-sharding
和maintaining flat response times even as dataset size balloons
。 它比Membase慢得多,做纯横向缩放比较麻烦,但好处是它具有高度可查询性。 您可以实时查询参数和范围,也可以使用Map / Reduce在真正庞大的数据集上执行复杂的批处理操作。
在我上面提到的使用Membase服务大量现场玩家数据的同一个项目中,我们使用MongoDB来存储分析/指标数据,这实际上是MongoDB发挥的作用。
为什么要保留SQL
我简要地谈到了“真正关系”信息应该留在关系数据库中的事实。 正如Dan K.指出的那样,我错过了讨论离开RDBMS的缺点,或者至少完全抛弃它的部分。
首先,有SQL本身。 SQL是众所周知的,并且长期以来一直是行业标准。 Google的App Engine Datastore(基于Big Table)等一些“NoSQL”数据库实现了自己的类似SQL的语言(谷歌被称为Google Query Language
GQL)。 MongoDB通过其令人愉快的JSON查询对象采用全新的方式查询问题。 尽管如此,SQL本身是一个用于从数据中获取信息的强大工具,这通常是数据库开始的关键。
留在RDBMS中最重要的原因是ACID,或Atomicity, Consistency, Isolation, Durability
。 我不会重新编写Acid-NoSQL的状态,因为它在SO上的这篇文章中得到了很好的解决。 可以这么说,有一个合理的原因,Oracle的RDBMS具有如此巨大的市场,并没有随处可见:一些数据需要纯粹的ACID合规性。 如果你的数据确实存在(如果确实如此,你可能已经意识到这一点),那么你的数据库也是如此。 保持低pH!
编辑:看看这里的Aaronaught的帖子。 他代表的企业对企业的视角比我的要好得多,部分原因是我已将我的整个职业生涯花在消费领域。
我认为这很大程度上取决于你想要在数据库中存储什么。 我没有CouchDB或Cassandra的经验,所以我会让其他人为他们说话,但我经常使用MongoDB和MySQL。
如果您正在开发需要交易的应用程序,例如计费应用程序,那么您肯定希望使用MySQL,因为它支持交易。 MySQL是ACIDic,它是原子性,一致性,隔离性和耐久性。 实质上意味着当你在MySQL中更新一行时 - 保证发生了。 然而MySQL的问题在于它不能很容易地水平扩展(通过添加越来越多的服务器)。 MySQL服务器倾向于通过增加更多内存,硬盘空间等来垂直扩展,但它们最终达到了天花板,并且可能会花费巨大的成本。
MongoDB是一个文档数据库。 它将类JSON文档存储在集合中,并且是无模式的 - 因此每个文档都可以不同。 这对于您的应用程序的灵活性非常有用。 许多开发人员说,noSql解决方案更适合程序员开发,他们往往更容易用(以我的经验)构建。 另外,MongoDB通过将数据库分块分块来水平扩展。 事实上,这现在甚至可以自动化。
但是使用MongoDB有一些缺点。 如果你在生产中使用它,你真的必须把它放在一个复制奴隶中。 这是因为MongoDB没有完整的单服务器持久性。 所以如果你遇到电源故障,你可能需要修复整个MongoDB数据库,这可能需要几个小时。 如果你的资金充足,这可能不是一件大事,但如果你是一个没有钱的新组织,那么可能很难(使用云计算?)。 另外,MongoDB不支持保证原子性和隔离性所必需的事务。 最后,MongoDB只是最终保持一致(尽管我已经看到了这个论点的几个方面) - 这意味着当写入发生时,所有其他进程都不能保证立即看到信息 - 只能最终。
在我看来,如果您要存储关于曲目的艺术家信息和元数据,那么MongoDB将是一个很好的解决方案。 如果您正在存储用户数据,账单数据等,然后将其存储在MySQL中。
对于这个问题,只有一个正确的答案:只有在遇到性能问题时,或者您预计流量会大幅增加,并测量(通过压力测试)您的体系结构不适合时,才可以更改当前的解决方案。
否则 - 无需评估替代品。
链接地址: http://www.djcxy.com/p/86389.html上一篇: Using a NoSQL database over MySQL
下一篇: Why are document stores like Lucene / Solr not included in NoSQL conversations?