database - 可扩展的数据库技术和架构

标签 database scalability rdbms distributed nosql

我一直在尝试了解有关分布式系统中的数据库扩展的更多信息,但我陷入了 RDBMS 和 NoSQL 之间。

网上的一些文章表明 NoSQL 是现代大数据的解决方案。其他人则说 NoSQL 只是一种炒作,RDBMS 通过良好的设计也可以实现可扩展,并且它提供了良好的数据结构。

我不想阅读别人的意见,而是想自己判断这两者,但我不明白可扩展的 RDBMS 和可扩展的 NoSQL 究竟需要什么。

我对 RDBMS 进行了更多阅读,似乎该解决方案需要利用内存缓存和分片来减少数据库大小和数据库查询数量。还有其他技巧吗?您还可以使用具有多列的表格吗?或者使用更少的列和更多的连接?

对于 NoSQL,我读过一些有关 MongoDB 的内容。我知道它鼓励数据聚合。但这如何使其更具可扩展性呢?我也开始学习 Cassandra,因为我读到它的扩展性比 MongoDB 好得多,但我不知道它如何更具扩展性。

我非常感谢有关扩展 RDBMS 和 NoSQL 的基本(或高级,如果您有耐心将其打印出来)简明且深入核心的解释,或者解释该主题的优秀在线文章或书籍。 :)

最佳答案

我不会介绍通过自己实现事物并在其间放置内存缓存服务器来扩展的方法,...我只会介绍开箱即用的内容...

让我们首先从RDBMS开始:

我认为设置 RDBMS 集群比 NoSQL 集群更复杂,但这只是我的观点。通常你拥有的是一个Master和多个Slave。您必须将所有写入发送到主站,并且可以从任何您想要的从站读取。由于您拥有 RDBMS 和 ACID,系统应该以某种方式向您保证,您不会读取旧数据。所以这里的问题是,您假设您的应用程序写入一次并经常读取(通常情况就是如此)。出于这些目的,一台用于读/写的服务器和多台用于读的服务器是很好的。问题是,如果您的写入过于频繁,以至于您无法再在一台机器上跟上它们。那是你的瓶颈。除了 Oracle 的内置解决方案(例如,规模庞大)之外,还有 http://www.scalearc.com/它可以缓存查询,...并为您处理缩放。

NoSQL:

不存在所有数据库都实现的 1 个 NoSQL 模式。每个系统都有点不同。例如,MongoDB 与 RDBMS 非常相似,它也只有一个主服务器和多个可以复制数据的从服务器,但此外你还可以创建分片。数据在分片之间分割,并复制到从属设备。所以你可以有多个不同的主人来负责较小的零件。之后,当您读取时,您可以选择是否要从多个从站、从主站或从任何从站读取 - 取决于您需要最新数据的紧急程度。

另一方面,Cassandra 的工作方式完全不同。我不确定是否可以写入多个服务器或其工作原理,但基本上服务器会保留所有写入的日志。因此,即使它们无法立即处理写入,它们也会存储在日志中,以便仍然为您提供快速响应。之后当你阅读的时候,你可以再说一遍你想要多么迫切地想要新的数据,如果你真的想要最新的最新数据,Cassandra将需要检查日志,是否有任何更新写入,这将花费你一个很多时间。

ElasticSearch、CouchDB、CouchBase 等键值存储的工作方式又有所不同。这里,该项目的值被散列,并基于散列,发送到负责该项目的一个节点。这样,当您在写入 key 后读取时,您将再次获得最新信息,因为您将从同一节点读取。这种设计的想法是,没有一个 key 会引起每个人的兴趣,但负载会被分配。我认为这些也是可扩展性最好的数据库,并且最容易向集群添加更多服务器,但是您会失去复杂查询的能力,就像 MongoDB 和 Cassandra 中的那样 - 当然还有 RDBMS。 ElasticSearch有一些简单的搜索查询,而CouchDB和CouchBase只有MapReduce生成的 View ,您可以在其中获取您想要的数据(如果它适合 View )。否则您只能通过 key 访问它。

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis - 非常全面地总结了最常见的NoSQL DB,它们的优点和缺点是什么,以及最常见的使用场景。


最后的问题是,为什么要扩展?数据库中有多少条记录?几百万根本不是问题。对于足够强大的服务器上的大多数 RDBMS 来说,几亿也不是问题。如果数据库及其索引设计得当,即使每年 10 亿条记录也应该没问题。

关于database - 可扩展的数据库技术和架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23852376/

相关文章:

database - 防止 PostgreSQL 有时选择错误的查询计划

url - 为什么有些网站分布在 www2、www3 子域,而有些网站却没有它来管理扩展?

performance - 如何使RabbitMQ具有可扩展性?

mysql - int (id) 或基于文本的层次结构?

sql - oracle中更新查询需要很长时间

php - mysql中简单的html dom重复条目

php - 如何在 Laravel 中获取平均时间

database - 跨分片搜索?

mysql - 附加两个具有相同字段的 sql 查询的结果

database - 如何将 R 绘图图像保存到数据库?