避免Cassandra全表扫描交叉DC

问题描述 投票:0回答:1

我有分布在2个数据中心的Cassandra集群节点。每个数据中心有6个节点,共12个节点

我的键空间定义:

CREATE KEYSPACE my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '3', 'dc2': '3'} AND durable_writes = true;

在每个节点中,我有64个令牌。

我正在使用Cassandra驱动程序连接到群集并使用默认负载平衡策略DCAwareRoundRobinPolicy并仅使用dc1节点作为联系点。所以,我假设dc2节点将有HostDistance IGNORED,我的应用程序将无法连接到它们。

注意:对于我的所有读写操作,我使用相同的配置

我的用例是进行全表扫描。但是,我不能使用Spark。所以,相反,我通过使用metadata.getTokenRanges()获取所有令牌范围并在多个线程中查询这些令牌范围来实现此目的。

一切正常。但是,metadata.getTokenRanges()返回768令牌(64 * 12)。这意味着它给了我所有12个节点的令牌范围。

因为我必须遍历所有令牌范围。即使有多个线程,这个过程也很慢。 有什么办法可以获得只有一个数据中心的令牌范围。我甚至尝试使用metadata.getTokenRanges("my_keyspace", host from dc1)获取令牌范围。我获得的令牌数量较少(517),但是当我使用此列表时,我获得的数据更少。

如何获得仅1 DC的令牌范围?

编辑:我检查了两个集群中的读/写延迟。我没有看到在dc2上执行任何操作,而我可以在dc1数据中心看到明显的峰值。

这对我来说更令人费解。如果从未询问dc2我是如何获得64*12 +1令牌范围的?为什么不64*6+1

cassandra datastax cassandra-3.0
1个回答
0
投票

你的replication_factor3+3=6。所以你可能有6倍的实际数据。 dc1中有3个副本,dc2中有3个副本。

每个节点有64个vnode,所以64*12 =768 vnodes。

因此,如果您想要进行完整的表扫描,那么您可能必须查询所有令牌范围,即768.您缺少的是,由于复制,所有令牌范围的数据将驻留在dc1中。因此,您可以从dc1本身获取所有数据。

如果您正在使用DCAwareRoundRobinPolicy并将.withLocalDc()设置为dc1和一致性级别LOCAL_*,那么您只能从dc1读取。 dc1将拥有所有数据,因为dc1的replication_factor为3。

© www.soinside.com 2019 - 2024. All rights reserved.