【问题标题】:High Availability & Performance consideration with secondary index in CassandraCassandra 中二级索引的高可用性和性能考虑
【发布时间】:2018-07-21 14:33:23
【问题描述】:

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

1) 根据我使用链接对二级索引的研究:https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive 我知道二级索引将存储在本地节点中。这是否意味着在五节点集群中只有一个节点可以使用二级索引?如果 user 表的 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:select * from nodestat where uniqueId = 'test' AND flashMode = 'yes'

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

【问题讨论】:

标签: indexing cassandra cassandra-3.0


【解决方案1】:

Regd 你的问题 1:

是不是说五节点集群中只有一个节点才有二级索引?

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

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

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

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

Regd 你的问题 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';

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

编辑解释查询3

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

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

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

【讨论】:

  • 我也发现如果提供了分区键,我没有看到二级索引表的使用,据我了解它仅用于从提供的值/搜索字符串中获取分区节点?
  • 另外我明白了,如果不创建索引,我们将无法对非主键值进行搜索,那么提供分区键的二级索引有什么用?
  • 编辑了我的答案以包括对查询 3 的解释。记住二级索引存储整个主键(分区键 + 集群列)。因此,它将有助于缩小到可能与给定分区列匹配的 1000 个集群列中的确切主键。
  • 很棒的解释看起来很理智,所以带有二级索引的分区 ID 是一个很好的解决方案,:) 如果有二级索引可用,写入也会对性能产生影响吗?
  • 是的,维护这个额外的二级索引(查找表)需要写入开销。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 2014-03-05
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2011-07-01
  • 1970-01-01
相关资源
最近更新 更多