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" 列。
我有一个设置: 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" 列。