搜索引擎数据库(Cassandra)和最佳实践

Search Engine Database (Cassandra) & Best Practise

我目前将排名存储在 MongoDB (+ nodejs as API) 中。它现在有 1000 万条记录,所以现在还可以,但数据集在不久的将来会急剧增长。

此时我看到两个选项:

  1. MongoDB 分片
  2. 更改数据库

对数据库执行的查询将不是文本搜索,但是例如:

  1. 域、关键字、语言、开始日期、结束日期
  2. 关键字、语言、开始日期、结束日期

排名包含: 1. 领域 2. url 3.关键词 4.关键字语言 5.位置 6. 日期 (unix)

要求是能够在不缓存的情况下查询和分析数据。例如,获取日期 y、z 之间域 x 的所有数据并分析数据。

我注意到最近性能下降,我正在研究其他数据库。似乎最适合这份工作的是 Cassandra,我做了一些测试,它看起来很有前途,性能也不错。使用 Amazon EC2 + Cassandra 似乎是一个很好的解决方案,因为它易于扩展。

由于我不是 Cassandra 方面的专家,所以我想知道 Cassandra 是否适合我。其次,什么是最佳实践/数据库模型。

为(简体)创建一个集合:

或者全部排成一行:

任何提示和见解将不胜感激。

Cassandra 严重依赖于查询驱动的建模。它在查询方式上有很大限制,但可以在这些功能中满足大量要求。对于任何大型数据库,了解您的查询很重要,但就 cassandra 而言,这几乎是至关重要的。

Cassandra 有主键的概念。每个主键由一个或多个键(读取列)组成。第一列(可能是复合列)称为分区键。 Cassandra 将一个分区的所有 "rows" 保存在同一位置(在磁盘上、在内存中等),分区是复制的单位等

主键中的附加键称为集群键。分区内的数据根据​​连续的集群键排序。例如,如果您的主键是 (a, b, c, d),那么数据将通过散列 a 进行分区,并且在分区内,数据将按 b、c 和 d 排序。

为了高效查询,您必须命中一个(或很少的)分区。所以你的查询必须有一个分区键。这必须是完全相等的(没有开头、包含等)。然后你需要过滤到你的目标。这也可以变得有趣:

您的查询可以为连续的聚类键指定完全相等的条件,并为查询中的最后一个键指定范围(或相等)。因此,在前面的示例中,这是允许的:

select * 来自 tbl,其中 a=a1 且 b=b1 且 c > c1;

这不是:

select * 来自 tbl,其中 a=a1 且 b>20 且 c=c1;

[您可以为此使用允许过滤]

select * 来自 tbl,其中 a=a1 且 c > 20;

一旦您理解了数据存储模型,这就很有意义了。 cassandra 查询速度如此之快的原因之一是它可以将数据定位在一个范围内并将其展开。如果它需要做选择,它会更慢。您可以随时抓取数据并过滤客户端。

您还可以在列上创建二级索引。这些将允许您过滤非键列上的完全相等。请注意,切勿在未指定分区键的情况下使用带有二级索引的查询。您将执行一个集群查询,该查询在实际使用中会超时。 (例外情况是,如果您使用的是 Spark 并且尊重本地性,但这完全是另一回事)。

一般来说,最好将分区大小限制在 100mb 以下或最多几百兆。任何更大的,你都会有问题。通常,需要更大的分区表明数据模型不好。

很多时候,您需要将数据非规范化到多个表中以快速满足您的所有查询。如果您的模型允许您使用尽可能少的表来查询您的所有需求,那么这就是一个非常好的模型。虽然这通常是不可能的,但非规范化是必要的。对于您的问题,是否全部排成一行的答案取决于您是否仍然可以查询它并在所有内容排成一行的情况下保持分区大小小于 100 兆。

对于 OLTP,如果您可以构建像 Cassandra 那样工作的数据模型,那么 Cassandra 将会很棒。这通常不能满足 OLAP 要求。当前选择的使用 Cassandra 数据的 OLAP 工具是 DataStax Spark 连接器 + Apache Spark。它使用起来非常简单,而且非常强大。

真是脑洞大开。但如果您打算将 Cassandra 用于实际项目,它应该会让您了解可能需要学习的内容。我不是想让你远离 Cassandra 或其他任何东西。这是一个很棒的数据存储。但是你必须了解它在做什么才能利用它的力量。它的工作方式与 Mongo 截然不同,您应该在切换时期待思维转变。这绝对不像从 mysql 切换到 sql 服务器。