我需要一个可以在Windows Azure上运行的NoSQL数据库,该数据库适用于以下参数。目前,Azure Table Storage、HBase 和 Cassandra 似乎是最有前途的选择。
- 10 亿个实体
- 每秒最多 100 次读取,尽管缓存通常会使其减少很多
- 每秒大约 10 - 50 次写入
强一致性将是一个加分项,所以也许HBase在这方面会比Cassandra更好。
查询通常会在具有各种索引的辅助内存数据库上完成,此外还有用于全文搜索和某些过滤的 ElasticSearch 或 Windows Azure 搜索。
Azure 表存储看起来不错,但据我所知,Azure 表存储和 HBase 之间的最大区别在于 HBase 支持一次更新和读取单个属性而不是整个实体的值。我想HBase一定有一些缺点,但我不确定在这种情况下它们会是什么。
我也认为 crate.io 看起来可能很有趣,但我想知道是否存在不可预见的问题。
在这种情况下,任何人都对不同数据库的优缺点有任何其他想法,如果由于某种原因它们中的任何一个真的不适合?
我目前与Cassandra合作,我可能会帮助解决一些优点和缺点。
要求
Cassandra可以轻松处理这3个要求。它旨在具有快速读取和写入功能。事实上,Cassandra在写作方面非常快,主要是因为你不用读书就可以写。
此外,Cassandra将其一些数据保存在内存中,因此您甚至可以避免使用辅助数据库。
一致性
在 Cassandra 中,您可以选择您所做的每个查询的一致性,因此您可以根据需要获得一致的数据。通常您使用:
-
ONE - 只有一个节点必须获取或接受更改。这意味着快速读取/写入,但一致性低(您可以让其他机器在未实现一致性的情况下提供较旧的信息)。
-
法定人数 - 51% 的节点必须获取或接受更改。这意味着读取和写入速度不快,但是如果您在读取和写入中使用它,您将获得完全的一致性。这是因为,如果超过一半的节点在您插入/更新/删除后拥有您的数据,那么,当从一半以上的节点读取数据时,至少有一个节点将具有最新信息,这将是要传递的信息。
建议使用这两个选项,因为它们可以避免单点故障。如果所有计算机都必须接受,如果一个节点关闭或繁忙,您将无法查询。
优点
Cassandra是性能,线性可扩展性和避免单点故障的解决方案(您可以关闭机器,其他人将承担工作)。它会自动完成大部分管理工作。您无需管理数据分发、复制等。
缺点
Cassandra的缺点在于建模和查询。
使用关系数据库,您可以围绕实体及其之间的关系进行建模。通常,您并不真正关心将进行哪些查询,而是努力将其规范化。
对于Cassandra,策略就不同了。对表进行建模以提供查询。发生这种情况是因为您无法加入,也无法以任何您想要的方式过滤数据(只能通过其主键)。因此,如果您有一个拥有杂货店的公司的数据库,并且您想要进行一个返回某个商店(例如:纽约市)的所有产品的查询,以及另一个返回某个部门的所有产品的查询(例如:计算机),您将有两个表"ProductsByStore"和"ProductsByDepartment"具有相同的数据, 但组织方式不同以提供查询。
物化视图可以帮助解决这个问题,避免在多个表中进行更改的需要,但它是为了显示 Cassandra 的工作方式如何不同。
非规范化在 Cassandra 中也很常见,原因相同:性能。