我有分布在2个数据中心的cassandra集群节点。每个数据中心6个节点,共12个节点
我的键空间定义:
CREATE KEYSPACE my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '3', 'dc2': '3'} AND durable_writes = true;
在每个节点中,我有64个令牌。
我使用cassandra驱动程序连接到集群,并使用默认负载平衡策略dcawarerroundrobinpolicy和 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
?
1条答案
按热度按时间lkaoscv71#
你的
replication_factor
是3+3=6
. 所以你可能有6倍的实际数据。dc1中有3份,dc2中有3份。每个节点有64个vnode,所以
64*12 =768
V节点。因此,如果您想做一个完整的表扫描,那么您可能需要查询所有的令牌范围,即768。您缺少的是,由于复制,所有令牌范围的数据都将驻留在dc1中。所以您可以从dc1本身获取所有数据。
如果您正在使用
DCAwareRoundRobinPolicy
并设置.withLocalDc()
使用dc1和一致性级别LOCAL_*
那么您只读取dc1。dc1将拥有所有数据,因为replication_factor
dc1的值是3。