【问题标题】:Avoid Cassandra full table scan cross DC避免 Cassandra 全表扫描跨 DC
【发布时间】: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


【解决方案1】:

您的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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多