【问题标题】:How is the coordinator node in cassandra determined by a client driver? [duplicate]cassandra 中的协调器节点如何由客户端驱动程序确定? [复制]
【发布时间】:2019-05-30 10:12:21
【问题描述】:

我不了解 cassandra 中的负载平衡算法。

似乎TokenAwarePolicy 可用于将我的请求路由到保存数据的协调节点。特别是,文档指出 (https://docs.datastax.com/en/developer/java-driver/3.6/manual/load_balancing/) 当驱动程序能够自动计算路由键时它可以工作。如果可以,我被路由到保存数据的协调节点,如果不是,我被路由到另一个节点。如果我真的想在没有任何额外跃点的情况下访问数据,我仍然可以自己指定路由密钥。

什么对我来说没有意义:

如果驱动程序不能自动计算路由键,那么协调器为什么可以这样做呢?它是否比客户端驱动程序具有更多信息?或者协调节点是否代表我询问集群中的每个其他节点?这样就无法扩展了,对吧?

我认为 gossip 协议用于在所有节点(以及客户端驱动程序)之间共享环的拓扑。客户端驱动程序具有完整的“环”结构,应该等于任何“跳”节点。

当客户端驱动程序确定保存数据的 N 个副本,然后对它们进行优先级排序(主机距离等)时,负载平衡对我来说很有意义,但是当我到达一个随机节点时,这对我来说没有意义不太可能有我的数据。

【问题讨论】:

  • 我在问“如果驱动程序不能自动计算路由键,那么协调器为什么可以这样做?”。您链接的答案没有解释这一点。它对我来说仍然很神奇。示例:如果我正在查找 ID=42 的数据,但无法计算 routing-key,那么为什么协调器 Node 可以计算出数据应该在节点 123 上?我唯一知道的是 ID=42,这也是协调节点拥有的唯一信息。

标签: cassandra


【解决方案1】:

令牌感知负载平衡仅适用于能够保存路由信息的语句。例如,对于准备好的查询,驱动程序从集群接收有关查询中字段的信息,并具有有关分区键的信息,因此它能够计算数据的令牌,并选择节点。也可以自己指定routing key,驱动会向对应的节点发送请求。

documentation里都有解释:

对于简单的语句,路由信息永远不会自动计算

对于构建语句,如果在构建查询时提供了键空间,则它是可用的;只有当语句是使用表元数据构建的并且分区键的所有组件都出现在查询中时,路由键才可用

对于绑定语句,键空间始终可用;仅当分区键的所有组件都绑定为变量时,路由键才可用

对于批处理语句,检查每个子语句的路由信息​​;第一个非空的keyspace作为batch的keyspace,第一个非空的routing key作为它的routing key

当语句没有路由信息时,请求被发送到嵌套负载均衡策略选择的节点,节点协调器对语句进行解析,提取必要的信息并计算token,并将请求转发到更正节点。

【讨论】:

  • 为什么node-coordinator可以计算token而TokenAwarePolicy不能?如果令牌是我请求的函数,为什么不能在客户端计算?让我困惑的是节点协调器可以做驱动程序不能做的事情。他们拥有相同的信息。
  • 例如,当您使用“简单语句”时,可能会发生这种情况 - 驱动程序没有完整的 CQL 解析器,而只是将语句文本发送到具有完整 CQL 解析器的协调器。在准备好的语句中 - 它是相同的 - 驱动程序向协调器发送请求,但它返回有关已解析语句的信息 - 哪些字段类型,绑定等。
猜你喜欢
  • 2014-11-07
  • 2015-12-28
  • 2018-11-05
  • 2023-04-01
  • 2018-07-17
  • 1970-01-01
  • 2016-11-17
  • 2022-07-31
  • 2020-05-19
相关资源
最近更新 更多