避免cassandra全表扫描交叉dc

mu0hgdu0  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(387)

我有分布在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 ?

lkaoscv7

lkaoscv71#

你的 replication_factor3+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。

相关问题