Cassandra 不适合这项任务还是我误解了文档?
Posted
技术标签:
【中文标题】Cassandra 不适合这项任务还是我误解了文档?【英文标题】:Is Cassandra not suitable for the task or I'm misunderstanding documentation? 【发布时间】:2016-03-18 08:51:42 【问题描述】:我打算在这个任务中替换 Oracle SQL:
-数十亿行(n * 10 亿)
-100% 操作是简单的选择
但是选择数据有 10 种不同的标准。它们也结合在一起。例如。
search1 - "select ... where name = 'x' and birth = 'y'"
search2 - "select ... where name = 'x' and phone = 'y'"
等等
令人惊讶的是,发现在 Cassandra 中进行此类查询非常痛苦。 特别是关于 20 亿个 cell 的限制,并且我们没有计划巨大的集群。起初它会在一台服务器上工作,所以这种对分区的划分不会带来任何好处,但需要时间来克服。
所以,问题是:
- 一台(或两台,如果 Oracle 也很慢的话)服务器会比一台 RDBMS 服务器快得多吗?
-我的任务是否存在正确(不丑陋)的数据模型,或者它根本不适合 Cassandra?
-也许其他 NOSQL 数据库更适合?
【问题讨论】:
Cassandras 的主要优势是水平可扩展性,即数据分布和并行化。如果您只有一两个节点,那么您就无法发挥这种优势,而 RDBMS 更适合。不过,这并不是一个很好的 SO 问题,所以我投票结束。 我完全不同意。问题 1:8 节点 Cassandra 将撕裂 RDBMS 的事实并不意味着在 1-2 节点上它不会快两倍或三倍。请记住,我不需要酸。问题 2:这不是常见问题 - 我应该如何划分我的数据以适应 cassandra 的 2B 限制。我应该创建大约 100 个表来包含具有 10 个可搜索条件的数十亿行吗?这种划分的共同策略是什么? 2B 单元限制是每个分区(每个节点负责许多分区),您的分区也应该小于 ~100MB,因此考虑 2B 可能远远超出您实际应该的范围无论如何都要在实践中做。通常,当人们使用 C* 时,他们会在表中使用不同的主键为不同的查询提供重复的数据。 我仍然不明白如何使用 Cassandra 存储数十亿条记录。我的搜索条件组合成组,所以我必须创建大约 10 个不同的表,每个表有 2 或 3 个主键。 Cassandra 数据模型可以吗?而且 - 如果我应该在每个表中有数十亿行,我如何将分区拆分为 100MB?制作表格,如 table_search_by_name_and_birth_name_starts_aa、table_search_by_name_and_birth_name_starts_ab、table_search_by_name_and_birth_name_starts_ac ???这看起来很糟糕。 【参考方案1】:Cassandra CQL 不太适合进行表扫描或即席查询。
Cassandra CQL 在您执行针对一行或一组集群行(在一个分区内)的事务查询时效果最佳。
因此,在您的示例中,如果您想按名称对数据进行分区,然后一次处理一个名称,Cassandra 就可以工作。通过添加更多节点,这将扩展到数十亿个名称。
但是,如果您想在所有名称中搜索特定的选择条件,那么这是一个表扫描,您必须将 Cassandra 与 spark 之类的东西配对才能高效。
因此,对于您的用例,使用关系数据库可能比使用 Cassandra 更好。如果您想使用 Cassandra,您可能需要创建多个包含重复数据的表,其中每个表都使用一个专为一种或两种不同查询类型而设计的键。
【讨论】:
抱歉,仍然不清楚如何“按名称对数据进行分区”。用 RDBMS 术语思考,我有 10 列(名字、姓氏、出生、地址、电话等)的行,我必须能够按以下方式搜索:姓名+电话或姓+名+出生或姓+名+地址。搜索通常只会返回 1 条记录。可以将所有 10 列添加到主键吗?那么表的限制是 2 亿行吗?为了存储数十亿条记录,我应该创建数十张表吗?但是分离的策略是什么?我是否也应该在应用程序(进行搜索)中实现这种分离算法? 我认为您需要对 Cassandra 中分区键和集群键的含义进行一些背景阅读。您正在尝试在分区键值存储数据库中使用关系方法,但这是行不通的。 Cassandra 中的数据建模是一个非常不同的野兽,它不支持您想要执行的那种表扫描和即席查询。因此,您可能需要查看 Datastax Academy 网站上的一些教程视频,因为它是一个相当复杂的主题。 好的,我会试着找到一些东西。今天花了所有时间阅读有关 C* 数据模型和限制的内容,但我发现的所有内容都是简单的用例。【参考方案2】:进一步搜索表明,MongoDB 非常适合该任务,并且比 Oracle SQL 快大约 10 倍。
【讨论】:
以上是关于Cassandra 不适合这项任务还是我误解了文档?的主要内容,如果未能解决你的问题,请参考以下文章