【问题标题】:Using Cassandra Metrics for monitoring使用 Cassandra Metrics 进行监控
【发布时间】:2023-03-13 05:00:01
【问题描述】:

一段时间以来,我一直在使用 Cassandra 及其 C++ 驱动程序编写 API 来插入和获取数据。但是,既然我已经创建了集群,我想为我的集群开发监控工具。

我想构建一个应用程序(最好使用 C++,我不想使用第 3 方应用程序),它将存储集群管理特定属性,例如集群中每个节点的内存利用率、每个操作的延迟、空间被每个节点上的每个表占用等。我读到了“Cassandra 中的指标”(https://cassandra.apache.org/doc/latest/operating/metrics.html),但我不知道如何在构建我的应用程序时准确使用它们,因为我之前没有使用过 Java(请原谅) !)。 可以使用 C++ 构建这样的应用程序吗?如果在 C++ 中进行了大量工作,那么如果您可以共享一些 Java 代码,其中这些 Cassandra Metrics 已用于监控 Cassandra 集群,那将是非常有益的。

操作系统:RHEL Cassandra 版本:3.11.2

【问题讨论】:

  • 为什么要用 C++ 构建这个。这实际上为这项任务增加了一些复杂性。如果您的集群受到控制,您可以使用类似 jolokia 的方式,它为 MBeans cassandra 提供了一个 HTTP 接口来公开它的指标。
  • 实际上,C++ 是我迄今为止唯一使用过的编程语言。所以这就是为什么我认为这对我来说会更容易一些。
  • 指标似乎首先是为 Java 设计的。对于 C++,您可能会更深入地研究http 接口...
  • 在Cassandra目录下的lib文件夹中,有3个jar文件(好像和Cassandra Metrics有关)..metrics-core-3.1.0.jar,metrics-jvm-3.1.0 .jar,metrics-logback-3.1.0.jar ...我还发现了 conf 目录“metrics-reporter-config-sample.yaml”中的一个 yaml 文件。但我仍然不知道所有这些是如何协同工作的
  • 在你进入兔子洞之前。启动 jconsole 并将其指向您的服务器。您可能需要用户名和密码,但这会向您显示可用的指标。​​

标签: java c++ cassandra cassandra-3.0


【解决方案1】:

Cassandra 3.x 使用您提到的 drop wizard api。如果您可以将Jolokia jar 添加到您的部署服务器,这将允许您使用简单的 http 请求访问 java jmx 数据。 Jolokia 通过 rest api 公开了 java 中的所有 mbean。

【讨论】:

    【解决方案2】:

    似乎没有任何用于 JMX 的 c++ 库,但在 Java 中很容易获得 JMX 指标,您所需要的只是标准 jdk。以下代码演示了如何连接到 cassandra 节点并获取“down”节点数。

    import java.util.HashMap;
    import java.util.Map;
    
    import javax.management.MBeanServerConnection;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    
    public class Main {
        public static void main( String[] args ) throws Exception {
            String node = args[0];
            String port = args[1];
            String username = args[2];
            String password = args[3];
    
            JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://" + node + ":" + port + "/jmxrmi" );
            String[] credentials = {username, password};
    
            Map<String, String[]> environment = new HashMap<>();
            environment.put( JMXConnector.CREDENTIALS, credentials );
            JMXConnector jmxConnector = JMXConnectorFactory.connect( url, environment );
            MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();//Get metrics bean
            ObjectName oName = new ObjectName( "org.apache.cassandra.net:type=FailureDetector" );//create JMX object name
            int downNodes = (int) mbsc.getAttribute( oName, "DownEndpointCount" ); //get number of unavailable nodes
    
            System.out.println("Down node count: " + downNodes);
        }
    }
    

    有关 jmx 的更多详细信息,您可以在 Oracle documentation 中找到

    要获取JMX对象名和属性名,可以使用jdk自带的jconsole工具:

    【讨论】:

    • 正如我所提到的,Java 对我来说是新的。我听说使用 JMX 很慢。我不知道那句话有多真实,但有没有其他方法(更快的方法)我们不使用 JMX 并且仍然可以监控 Cassandra?
    • cassandra.apache.org/doc/latest/operating/metrics.html 表示“可以通过 JMX 查询指标或使用许多内置和第三方报告插件将指标推送到外部监控系统。”我想知道这些“内置和第三方报告插件”是否也在使用 JMX Mbean,或者他们正在通过其他方法(可能更快)收集指标值?
    • 正如@Chris Hinshaw 提到的,Cassandra 使用 dropwizard 来收集指标,据我所知,它不使用 JMX 来收集指标,但我可能错了。 Dropwizard 有两个用于报告指标的接口:jmx 和 http,但我不能说哪个更快。我在生产环境中有使用 jmx 的经验。我们使用 zabbix 代理通过 jmx 从 cassandra 节点收集指标,我们没有遇到任何性能问题。
    • 在这个链接 metrics.dropwizard.io/3.1.0/manual/core 中,有一条警告建议不要尝试从生产环境收集指标,因为 JMX 的 RPC API 很脆弱!
    • 据我了解,如果您有来自许多客户端的大量 jmx 连接或 jmx 调用频率很高,则 JMX 可能会成为问题。在我们的生产中,我们只为每个 cassandra 节点使用一个客户端(zabbix 代理),每分钟请求一次指标。用户通过 zabbix ui 监控指标,而不是直接通过 jmx。它对我们很有用。但如果你想使用 c++ 构建一些工具,请使用 http 记者:datastax.com/dev/blog/…
    猜你喜欢
    • 2018-05-22
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2021-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多