【问题标题】:How to query Cassandra from a certain node and get the data from only that node own?如何从某个节点查询 Cassandra 并仅从该节点自己获取数据?
【发布时间】:2018-11-01 00:33:45
【问题描述】:

Cassandra 使用一致性哈希来管理数据,我们使用 Cassandra 驱动连接集群后,我们连接的节点可能会从集群中的其他节点查询得到结果。但是对于我目前的情况,我正在对我的算法做一些测试,我想给某个tokenRange并查询tokenRange中和某个节点上的数据,如果tokenRange中的某些数据不在这个节点中,我不希望节点查询其他节点得到结果。是否有可能以及如何实现? 我找到了Cassandra Python driver: force using a single node,但是这个解决方案只提供客户端的连接池连接到某个节点,该节点仍然会查询其他节点。

【问题讨论】:

标签: cassandra bigdata


【解决方案1】:

使用WhiteListRoundRobinPolicy 和 CL.ONE like 在其他问题中链接。

您还可以扩展语句以包含主机和自定义负载平衡策略,以将请求发送到包装器中的主机。扩展一个策略并覆盖make_query_plan,类似于(未经测试只是从头开始,考虑遵循伪代码)

class StatementSingleHostRouting(DCAwareRoundRobinPolicy):
  def make_query_plan(self, working_keyspace=None, query=None):
    if query.host:
      return [query.host]
    return DCAwareRoundRobinPolicy.make_query_plan(self, working_keyspace, query)

如果该主机不拥有数据,它仍会查询其他副本。

【讨论】:

  • 感谢您的回答,但是如果我希望主机不要查询其他副本,是否有任何较低级别的api可以用来实现这一点?我认为例如,devops 可能也需要此功能来查找系统是否有问题。
  • 您需要在 cassandra 中调整自定义复制因子。如果您向任何主机发送查询,该主机将充当协调器,将读取发送到适当的副本。没有办法告诉 cassandra 不要那样做。 Devops 可以使用nodetool getendpoints 来查找副本,并且可以在其中一台主机上执行 cqlsh 并使用 TRACE ON;它将准确地告诉他们哪些主机和 sstables 参与了查询。如果在副本上使用 CL.ONE,它将只是该主机。如果使用上面的代码,你可以通过在定义语句时获取副本来实现。
  • 顺便说一句,我是一名 Cassandra devops 人员,我经常这样做(getendpoints/trace)。
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多