Cassandra 二级索引的高可用性和性能考虑

High Availability & Performance consideration with secondary index in Cassandra

我有一个设置: 5 Cassandra node cluster with RF =3, I performed a secondary index for a column in table 'user',

1) 根据我使用 link 对二级索引的研究: https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive 我了解到二级索引将存储在本地节点中。这是否意味着在五节点集群中只有一个节点的二级索引可用?如果不在 user table 的 RF =3 中,二级索引 table 将在多少个节点中可用?

2) 下面两个查询在执行上有何不同?

   CREATE TABLE user(
    user_group int PRIMARY KEY,
    user_name text,
    user_phone varint
   );

  CREATE INDEX username_idx ON user (user_name);

在此 table 设置中,

查询 1 : SELECT * 来自用户 WHERE user_name = 'test';

查询 2 : SELECT * FROM user WHERE user_group = 1 AND user_name = 'test';

以上两个查询会经过多少个节点(在5节点集群中)执行,这两个查询在性能上有何不同?

已编辑:

假设我有一个 table 如下所示,

CREATE TABLE nodestat (
    uniqueId text,
    totalCapacity int,
    physicalUsage int,
    flashMode text,
    timestamp timestamp,
    primary key (uniqueId, timestamp)) 
    with clustering order by (timestamp desc);

CREATE CUSTOM INDEX nodeIp_idx ON nodestat(flashMode)

查询 3:select * 来自 nodestat,其中 uniqueId = 'test' AND flashMode = 'yes'

所以在这种情况下,我总是在 table 中只有一个分区,那么与没有分区键的二级索引相比,二级索引搜索有何不同?效率如何?

请注册您的问题 1:

这是否意味着在五节点集群中只有一个节点可用二级索引?

二级索引在集群的每个节点中都可用,它建立在该节点中的数据之上,并且它只是该节点的本地数据。也就是说,它只知道该特定节点中的主键。您可以将二级索引想象成一个查找 table 并引用该节点上的主键。

所以每个节点都建立自己的二级索引(在你的例子中是所有 5 个),但不知道彼此的引用。

如果不在用户 table 的 RF =3 中,二级索引 table 将在多少个节点中可用?

二级索引没有复制因子,因为它对每个节点都是本地的。由于您的数据已经被复制 RF = 3,因此每个节点中的二级索引都将被编入索引。

请注册您的问题 2:

Query 1 : SELECT * FROM user WHERE user_name = 'test';

此查询将在集群中的所有节点上执行分散收集。由于二级索引对于每个节点都是本地的,因此每个节点(在您的情况下都是 5 个节点)都必须执行查询 -> 执行二级索引查找以找出分区键 -> 然后将实际结果取回协调器。

随着table变大,查询经常会超时。在极端情况下,它可以关闭节点(就像 "select *" 没有分区键)。 因此在 Cassandra 中通常不鼓励二级索引和这种类型的查询(没有分区键),最好避免它们

Query 2 : SELECT * FROM user WHERE user_group = 1 AND user_name = 'test';

与上一个查询相比,此查询的性能会更好,因为它对分区键进行了筛选。在上面的 table 定义中没有聚簇列,所以这个查询将只过滤主键,因为每个分区只有一行。因此,二级索引没有太大改进。总的来说,它不是一种分散聚集的查询类型,因此性能要好得多。

已编辑以解释查询 3

Query 3 : select * from nodestat where uniqueId = 'test' AND flashMode = 'yes'

在此查询中,二级索引与分区键结合使用。如果给定的分区键存在 1000 个集群列并且我们希望快速缩小结果集的范围,则此二级索引会有所帮助。请记住,二级索引存储整个主键(分区键 + 集群列引用)。因此,在宽分区的情况下,当与分区键一起使用时,这个二级索引被证明是有用的。

例如,在您的情况下,假设只有一个分区 uniqueId = 'test'。但是在那个分区 'test' 中,假设有 10000 个不同的时间戳值(聚类列)。因此 "flashMode" 可能有 10000 个不同的值。此二级索引将有助于缩小到分区 'test' 中 10000 个匹配项中具有值 "yes" 的 "flashMode" 列。