我有分布在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
?
你的replication_factor
是3+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。