首页 > 解决方案 > Mongo DB 或任何 nosql DB(Hbase、Cassandra)如何比传统的 RDBMS 具有可扩展性和优势?

问题描述

我仍然无法实时说明 nosql 是如何有益的,而我们在传统 RDBMS 中也有索引。如果有人可以建议列式数据库在实际应用中的优势,特别是在使用结构化、半结构化或非结构化数据方面。

标签: mongodbcassandranosqlhbase

解决方案


在很大程度上,这取决于您希望数据存储做什么。如果您希望能够扩展以满足存储或运营需求,RDBMS 只能带您到此为止。

它归结为您如何扩展以满足需求。RDBMS 实际上只能垂直扩展。也就是说,添加更多 RAM、添加更多磁盘等。分布式 (NoSQL) 数据库允许您添加更多机器实例,从而使扩展更容易。这称为水平缩放。

这是一个使用 Cassandra 的示例:

假设我有一个 3 节点集群,并且我的密钥空间(数据库)也配置了 3 的复制因子(RF)。这意味着每个节点负责 100% 的数据。我加载了我的数据,它占用了 100GB 的磁盘空间(在每个节点上)。现在,虽然我的集群中可能总共有 300GB 的数据,但我的数据的单个副本是 100GB。

所以我的产品团队来找我,说他们需要将他们拥有的数据量翻倍。我知道我用 200GB 驱动器构建了他们的 3 节点集群。如果我什么都不做,这些驱动器几乎会被填满(如果不这样做,它们就不会为其他东西留出空间)。

现在由我来扩展集群以满足他们的空间需求。我将首先向集群添加 3 个新节点(总共 6 个),但我会将我的 RF 设置为 3。这使得每个节点负责 50% 的数据,即 50GB。当我的产品团队加载更多数据以满足他们的“加倍”要求时,每个节点应该回升到大约 100GB。数据的单个副本现在为 200GB。但是每个节点负责 50%,每个 200GB 的驱动器仍然只有 100GB。

示例 #2:

假设上面有 6 个节点的集群能够支持每秒 10,000 次操作 (ops) 的操作负载。我的产品团队再次来找我,说他们预计在假期期间需要支持 20,000 个操作。由于当前集群只能支持一半,在高吞吐量下会窒息,一个或多个节点可能会崩溃。

随着 Cassandra 线性扩展,实现这一目标的方法是(再次)将集群大小翻倍。所以我将它从 6 个节点增加到 12 个节点,同时仍然保持我的 RF 为 3。在运行了一些性能测试后,他们验证它确实可以支持 20,000 个操作。由于我的数据的单个副本为 200GB,因此总数据占用空间仍为 600GB。有了 12 个节点,每个节点现在只负责 25% 的数据,即 50GB。

所以可扩展性是优势。但是如何对数据进行建模呢?分布式数据库建模的主要思想有两个:

  1. 建立一个以良好分布为关键的表结构。我们不希望每个节点上的数据量不均。
  2. 在表上构建键,使其符合我们的查询要求。

NoSQL 数据库的缺点之一是您的查询模式受到限制。为了减少网络时间,您希望确保您的查询可以由单个节点提供服务。

这通常意味着使用自然键,因为它们更符合您对数据的要求。代理键(字母、数字或两者兼有)分布良好,但对于查询并不是真正有用。在我的系统中,用户“Bob Jones”的 ID 可能是“3582346556230”。但是当我想查询 Bob 的数据时,我可能永远不想通过“3582346556230”来查询它,因为这对应用程序或使用数据的上下文没有任何意义。

此外,您希望您的数据具有结构。非结构化数据是不可查询的数据。就那么简单。如果您希望非结构化数据可查询,则需要解析其标识方面以用作键。您不想“搜索”或运行SELECT * FROM查询。NoSQL 数据库中的全表扫描比它们的 RDBMS 对应物更消耗资源,因为它们必须检查每个节点,对副本进行排序,因此会产生额外的网络时间。

NoSQL 数据库使您能够扩展(用于增加数据或需求)。但重要的是要注意,它们的可伸缩性会使某些事情(RDBMS 可能擅长)变得比您习惯的更困难。


推荐阅读