【发布时间】:2019-07-17 13:26:51
【问题描述】:
我的 Cassandra 集群节点分布在 2 个数据中心。每个数据中心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?
【问题讨论】:
-
您在哪个一致性级别触发查询?在 Local-* 的情况下,很明显会在一个 dc 上看到尖峰。
-
默认 LOCAL_ONE
标签: cassandra datastax cassandra-3.0