【问题标题】:Health check for Cassandra connection (using hector)?Cassandra 连接的健康检查(使用赫克托)?
【发布时间】:2012-05-02 01:01:12
【问题描述】:

对于我的应用程序的操作监控,我正在寻找类似于常用的“SQL 连接验证”查询的东西

选择 1;

在 Cassandra 中,使用 Hector 驱动程序。我尝试过查看 Cluster.getKnownPoolHosts() 和 .getConnectionManager().getActivePools() 之类的方法。但似乎它们的状态并没有持续更新,只有当我实际尝试通过查询访问 Cassandra 时。

我希望我的运行状况检查独立于任何需要存在的键空间或用户 CF,因此仅运行“虚拟”查询似乎很困难(反对什么?)。当然,它不应该占用大量内存或产生任何重大负载。

我可以强制 Hector 在不运行实际查询的情况下以某种方式更新其连接池状态吗?

(顺便说一句:CQL 甚至不接受“SELECT 1”作为有效查询。)

【问题讨论】:

  • 你找到答案了吗?我正在尝试做同样的事情
  • 是的,我找到了一种似乎对我很有效的方法。请参阅下面的答案。

标签: cassandra hector


【解决方案1】:

对于 CQL3,我使用以下查询:

SELECT now() FROM system.local;

如果用户由于某种原因无法访问system 键空间或local 列族,最好去掉 FROM 子句以使其通用。但与其他答案一样,至少这不应该给出误报。

【讨论】:

  • 您实际上是如何进行这项检查的?您是否发现了一些异常或检查 QueryResult 对象?
  • 是的,只是检查这个没有抛出异常。还可以验证查询是否确实返回了某些内容,但我发现这是不必要的。
  • 我们有什么更好的解决方案,因为它是非常古老的 cmets
  • 此查询返回一个时间戳,我无法将其转换为任何 Java 类型。对我有用并返回字符串的替代查询是SELECT release_version FROM system.local;
【解决方案2】:

我目前使用的解决方案似乎是迄今为止最强大的解决方案(使用 Cassandra 1.1 和 1.2 测试)是对“系统”的简单查询:

Query<String> query = Query.selectQuery("*", "system", null, 1, consistencyLevel, StringSerializer.get());

这不是我想要的,因为它是一个“真实的”查询,但另一方面它不会给出任何误报。

【讨论】:

  • 我可能是错的,但我认为这种方法将始终调用相同的节点——根据一致性级别,您将始终调用 RF 的 1、Q 或所有节点。如果你想监控连接是否处于活动状态,你可以这样做,如果你想监控环状态,我会在你的 java 应用程序中使用 nodetool
  • 这是一个连接检查,而不是 Cassandra 集群的操作检查。
  • @HansMari,您实际上是如何进行此项检查的?你检查一些查询属性吗?
  • 如果查询正常,则连接已建立。实际查询结果无关紧要。
  • 所以如果没有异常,我们认为连接已经建立。对吗?
【解决方案3】:

Eemeli Kantola's query 返回一个时间戳,我无法将其转换为任何 Java 类型。对我有用并返回字符串的替代查询是SELECT release_version FROM system.local;

【讨论】:

    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2018-12-25
    • 2021-04-24
    • 2021-03-08
    • 1970-01-01
    • 2013-05-01
    • 2016-08-22
    • 2014-10-02
    相关资源
    最近更新 更多