我一直在尝试了解有关分布式系统中数据库扩展的更多信息,而且我陷入了RDBMS和NoSQL之间。
在线的一些文章表明,NoSQL是现代大数据的解决方案。其他人说NoSQL只是一种炒作,RDBMS可以通过良好的设计进行扩展,并提供良好的数据结构。
而不是阅读其他人'意见,我喜欢自己判断这两个,但我不明白可扩展的RDBMS和可扩展的NoSQL需要什么。
我已经对RDBMS做了更多的阅读,似乎该解决方案需要利用内存缓存和分片来减少数据库大小和数据库查询的数量。还有其他技巧吗?你还可以使用有很多列的表吗?或者使用更少的列和更多的连接?
对于NoSQL,我已经阅读了一些关于MongoDB的内容。据我所知,它鼓励数据聚合。但是,它如何使其更具可扩展性?我也开始学习Cassandra,因为我读到它比MongoDB好得多,但我不知道它的可扩展性如何。
我非常感谢基础(或高级,如果你耐心地输入它)关于扩展RDBMS和NoSQL的浓缩和下层到底的解释,或在线的好文章或解释该主题的书籍。 :)
答案 0 :(得分:2)
我不会介绍你可以通过自己实现和在内部放置一个memcache服务器来扩展的方法......我只是简单介绍开箱即用的内容......
让我们先从 RDBMS 开始:
我认为建立一个RDBMS集群比NoSQL集群更复杂,但这只是我的观点。通常你拥有的是一个主人和多个奴隶。您必须将所有写入发送到主服务器,并且可以从您想要的任何服务器读取。由于你有RDBMS和ACID,系统应该以某种方式保证你不会读取旧数据。所以这里的事情是,你假设你的应用程序写入一次并经常读取(通常是这种情况)。出于这些目的,一个用于读/写的服务器和用于读取的多个服务器是很好的。问题是,如果你经常写,你不能在一台机器上跟上它们。这是你的瓶颈。除了Oracle的内置解决方案 - 这是巨大的 - 还有http://www.scalearc.com/可以缓存查询,...并为您处理扩展。
<强>的NoSQL 强>:
没有1个NoSQL架构由所有DB实现。每个系统都有点不同。例如,MongoDB与RDBMS非常相似,它也只有一个主服务器和几个可以复制数据的从服务器,但另外你也可以创建分片。数据在分片之间分割,并复制到从属。所以你可以有多个不同的主人负责较小的部分。之后,当您阅读时,您可以选择是从主设备还是从任何从设备读取多个从设备 - 这取决于您需要最新数据的紧急程度。
另一方面,Cassandra的工作方式完全不同。我不确定你是否可以写入多个服务器或它是如何工作的,但基本上服务器会保留所有写入的日志。因此,即使他们无法立即处理写入,它们也会存储在日志中,仍能给您快速响应。之后当你阅读时,你可以再次说出你想要获得新数据的紧急程度,如果你真的想要最新的最新数据,Cassandra将需要检查日志,如果有任何更新,它将花费你一个很多时候。ElasticSearch,CouchDB,CouchBase等键值存储再次以不同的方式工作。这里对项目进行哈希处理,并根据哈希值发送给一个负责它的节点。这样,当您在写入密钥后阅读时,您将再次获得最新信息,因为您将从同一节点读取。这种设计的想法是,没有一个单一的密钥符合每个人的利益,但负载将被分配。这些也是我认为最佳扩展的数据库,并且最容易向集群添加更多服务器,但是你失去了复杂查询的强大功能,就像你在MongoDB和Cassandra中拥有它一样 - 当然还有RDBMS。 ElasticSearch有一些简单的搜索查询,而CouchDB和CouchBase只有MapReduce生成的视图,如果它适合视图,您可以在其中获取所需的数据。否则,您只能通过密钥访问它。
http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis - 是对最常见的NoSQL数据库的全面总结,它们的优点和缺点是什么,以及最常见的使用场景。
最后,问题还在于,您为什么要扩展?你将在数据库中拥有多少条记录?几乎没有数百万不是问题。对于功能强大的服务器上的大多数RDBMS来说,几千万也不是问题。如果设计数据库及其指数,即使每年十亿条记录也应该没有问题。