高可用性& Cassandra中二级索引的性能考虑因素

时间:2018-02-11 07:17:18

标签: apache indexing cassandra cassandra-3.0

我有 设置 :5个Cassandra节点群集,RF = 3,我为表'user'中的列执行了二级索引,

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

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

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

  CREATE INDEX username_idx ON user (user_name);

在此表格设置中,

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

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

上述两个查询将通过多少个节点(在5节点集群中)执行以及这两个查询的性能如何不同?

已编辑:

说我有一张如下表格,

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 :从nodestat中选择*,其中uniqueId ='test'AND flashMode ='yes'

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

1 个答案:

答案 0 :(得分:3)

重新审核你的问题1:

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

二级索引在群集的每个节点中都可用,它基于该节点中的数据构建,并且只是该节点的本地数据。也就是说,它只知道该特定节点中的主键。您可以将辅助索引想象成一个查找表,其中包含对该节点上主键的引用。

所以每个节点都建立自己的二级索引(在你的情况下全部为5),但不知道彼此的引用。

如果用户表中没有RF = 3,那么二级索引表有多少个节点可用?

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

注意你的问题2:

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

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

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

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

此查询与前一个查询相比性能更好,因为它在分区键上有过滤器。在上面的表定义中没有聚类列,因此该查询只会过滤主键,因为每个分区只有一行。因此二级指数没有太大改善。总的来说,它不是分散聚集类型的查询,因此表现更好。

编辑解释query3

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

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

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