用Prometheus和Grafana监视本地板条簇
#database #visualization #monitoring #crated

如果您在生产环境中运行CRATEDB,您可能想知道是什么是监视服务器在问题之前识别问题并收集可以用于容量计划的统计数据的最佳方法。

我们建议配对两种著名的OSS解决方案Prometheus,该解决方案是一种收集和存储性能指标的系统,而Grafana是一个创建仪表板的系统。

对于CratedB环境,我们感兴趣:

  • cratedb特定的指标,例如碎片数量或失败的查询数
  • 和OS指标,例如可用的磁盘空间,内存使用或CPU使用

对于CratedB特异性指标的涉及的内容,我们建议通过使用Crate JMX HTTP ExporterPrometheus SQL Exporter将其用于Prometheus。对于OS指标,在Linux环境中,我们建议使用Prometheus Node Exporter

当然,如果您使用的是容器,或者您正在使用完全管理的云托管CrateDB Cloud,但是让我们看看所有这些如何在本地安装上工作一起。

首先我们需要一个板条簇

首先,我们需要一个cratedb群集,您可能已经拥有一个,这很棒,但是如果您不这样做,我们可以快速起床。

您可以在https://crate.io/docs/crate/tutorials/en/latest/self-hosted/index.htmlhttps://crate.io/docs/crate/howtos/en/latest/clustering/multi-node-setup.html上查看安装文档。

就我而言,我正在使用ubuntu,我这样做了,首先是我到第一台机器并运行:

nano /etc/default/crate

这是CRATEDB将使用的配置文件,我们只需要一行即可在此处配置内存设置(这是必需的步骤,否则我们将失败Bootstrap检查):

CRATE_HEAP_SIZE=4G

我们还需要创建另一个配置文件:

mkdir /etc/crate
nano /etc/crate/crate.yml

在我的情况下,我使用以下值:

network.host: _local_,_site_

这告诉cratedb响应Localhost和本地网络的请求。

discovery.seed_hosts:
    - ubuntuvm1:4300
    - ubuntuvm2:4300

这列出了组成我们群集的所有机器,在这里我只有2个,但是对于生产使用,我们建议至少有3个节点,以便在网络分区中建立一个Quorum,以避免使用分裂脑场景。

cluster.initial_master_nodes:
    - ubuntuvm1
    - ubuntuvm2

这列出了有资格在引导过程中充当主节点的节点。

auth.host_based.enabled: true
auth:
  host_based:
    config:
      0:
        user: crate
        address: _local_
        method: trust
      99:
        method: password

这表明crate超级用户将用于本地连接,但其他机器的连接将需要用户名和密码。

gateway.recover_after_data_nodes: 2
gateway.expected_data_nodes: 2

这需要两个节点可以在这种情况下可供群集运行,但是有了更多的节点,我们可以将recover_after_data_nodes设置为小于节点总数的值。

现在让我们安装cratedB:

wget https://cdn.crate.io/downloads/deb/DEB-GPG-KEY-crate
apt-key add DEB-GPG-KEY-crate
add-apt-repository "deb https://cdn.crate.io/downloads/deb/stable/ $(lsb_release -cs) main"
apt update
apt install crate -o Dpkg::Options::="--force-confold"

force-confold用于保留我们之前创建的配置文件)

在另一个节点上重复上述步骤。

板条箱JMX HTTP出口商的设置

这很简单,在每个节点上运行以下内容:

cd /usr/share/crate/lib
wget https://repo1.maven.org/maven2/io/crate/crate-jmx-exporter/1.0.0/crate-jmx-exporter-1.0.0.jar
nano /etc/default/crate

然后将CRATE_JAVA_OPTS行的删除并将其值更改为:

CRATE_JAVA_OPTS="-javaagent:/usr/share/crate/lib/crate-jmx-exporter-1.0.0.jar=8080"

并重新启动板条箱守护程序:

systemctl restart crate

Prometheus节点出口商

可以使用单线设置:

apt install prometheus-node-exporter

Prometheus SQL出口商

SQL Exporter允许针对CratedB群集运行任意SQL语句以检索其他信息。由于群集包含来自每个节点的信息,因此我们不需要在每个节点上安装SQL Exporter。相反,我们将其集中安装在同一机器的机器上。

请注意,在Grafana中设置数据源并不相同,指向cratedb,以实时显示查询的输出,以便使用Prometheus随时间收集这些值。

安装软件包是直接的:

apt install prometheus-sql-exporter

要使SQL Exporter连接到群集,我们需要创建一个新的用户sql_exporter。我们授予用户阅读对sys架构的访问。在任何cratedb节点上运行以下命令:

curl -H 'Content-Type: application/json' -X POST 'http://localhost:4200/_sql' -d '{"stmt":"CREATE USER sql_exporter WITH (password = '\''insert_password'\'');"}'
curl -H 'Content-Type: application/json' -X POST 'http://localhost:4200/_sql' -d '{"stmt":"GRANT DQL ON SCHEMA sys TO sql_exporter;"}'

然后,我们在/etc/prometheus-sql-exporter.yml中创建一个配置文件,并带有一个示例查询,该查询可以检索每个节点的碎片数:

jobs:
- name: "global"
  interval: '5m'
  connections: ['postgres://sql_exporter:insert_password@ubuntuvm1:5433?sslmode=disable']
  queries:
  - name: "shard_distribution"
    help: "Number of shards per node"
    labels: ["node_name"]
    values: ["shards"]
    query: |
      SELECT node['name'] AS node_name, COUNT(*) AS shards
      FROM sys.shards
      GROUP BY 1;
    allow_zero_rows: true

  - name: "heap_usage"
    help: "Used heap space per node"
    labels: ["node_name"]
    values: ["heap_used"]
    query: |
      SELECT name AS node_name, heap['used'] / heap['max']::DOUBLE AS heap_used
      FROM sys.nodes;

  - name: "global_translog"
    help: "Global translog statistics"
    values: ["translog_uncommitted_size"]
    query: |
      SELECT COALESCE(SUM(translog_stats['uncommitted_size']), 0) AS translog_uncommitted_size
      FROM sys.shards;

  - name: "checkpoints"
    help: "Maximum global/local checkpoint delta"
    values: ["max_checkpoint_delta"]
    query: |
      SELECT COALESCE(MAX(seq_no_stats['local_checkpoint'] - seq_no_stats['global_checkpoint']), 0) AS max_checkpoint_delta
      FROM sys.shards;

  - name: "shard_allocation_issues"
    help: "Shard allocation issues"
    labels: ["shard_type"]
    values: ["shards"]
    query: |
        SELECT IF(s.primary = TRUE, 'primary', 'replica') AS shard_type, COALESCE(shards, 0) AS shards
        FROM UNNEST([true, false]) s(primary)
        LEFT JOIN (
          SELECT primary, COUNT(*) AS shards
          FROM sys.allocations
          WHERE current_state <> 'STARTED'
          GROUP BY 1
        ) a ON s.primary = a.primary;

请注意:SQL出口商存在两个实现:burningalchemist/sql_exporterjustwatchcom/sql_exporter。他们没有共享相同的配置选项。
我们的示例基于使用Ubuntu软件包发货的实现,即JustWatchcom/sql_exporter。

要应用新配置,我们重新启动服务:

systemctl restart prometheus-sql-exporter

SQL导出也可用于监视任何业务指标,但要定期运行昂贵的查询。以下是两个更高级的监控查询,可能是有用的:

/* Time since the last successful snapshot (backup) */
SELECT (NOW() - MAX(started)) / 60000 AS MinutesSinceLastSuccessfulSnapshot
FROM sys.snapshots
WHERE "state" = 'SUCCESS';

Prometheus设置

您将在不属于CRATEDB群集的一部分的机器上运行此操作,并且可以安装:

apt install prometheus --no-install-recommends

请注意,默认情况下,这将立即在端口9090上可用,而无需认证要求,您可以使用policy-rcd-declarative来防止安装后立即开始服务,您可以使用basic_auth_users定义YAML Web配置文件,然后参考此处。在/etc/default/prometheus中文件。

对于您还使用Prometheus监视其他系统的大型部署,您可能还需要使用CratedB群集作为所有Prometheus指标的存储空间,您可以在CrateDB Prometheus Adapter上阅读有关此信息的更多信息。

现在,我们将配置Prometheus从CratedB机器中的节点资源管理器刮擦指标,并从Crate JMX HTTP Exporter中配置指标:

nano /etc/prometheus/prometheus.yml

它说:

- job_name: 'node'
  static_configs:
    - targets: ['localhost:9100']

我们将其替换为以下配置,该配置反映了端口8080(板条板JMX导出器),端口9100(Prometheus Node Exporter),端口9237(Prometheus SQL Exporter)以及端口9100(Prometheus Node Exporter)。 >

- job_name: 'node'
  static_configs:
    - targets: ['ubuntuvm1:9100', 'ubuntuvm2:9100']
- job_name: 'cratedb_jmx'
  static_configs:
    - targets: ['ubuntuvm1:8080', 'ubuntuvm2:8080']
- job_name: 'sql_exporter'
  static_configs:
    - targets: ['localhost:9237']

如果已经启动了prometheus守护程序(systemctl restart prometheus)。

Grafana设置

可以将其安装在您拥有Prometheus的同一台计算机上,可以安装:

echo "deb https://packages.grafana.com/oss/deb stable main" | tee -a /etc/apt/sources.list.d/grafana.list
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
apt update
apt install grafana
systemctl start grafana-server

如果您现在将浏览器指向 http:// :3000 ,您将受到Grafana登录屏幕的欢迎,您第一次可以使用Admin登录,这两种用户名和密码,请确保立即更改此密码。

单击“添加您的第一个数据源”,然后单击“ Prometheus”,然后输入URL http:// :9090

如果您为Prometheus配置了基本身份验证,这是您需要输入凭据的地方。

单击“保存和测试”。

基于讨论的设置的示例仪表板可在grafana.com上轻松导入。在您的Grafana安装中,在左侧,悬停在仪表板图标上,然后选择“导入”。指定ID 17174并加载仪表板。在下一个屏幕上,通过选择您先前创建的Prometheus数据源来最终确定设置。

Grafana dashboard

替代实现

如果您决定构建自己的仪表板或使用完全不同的监视方法,我们建议您仍涵盖本文所讨论的类似指标。下面的列表是故障排除大多数操作问题的好起点:

  • CRATEDB指标(例如,基于板条箱JMX HTTP导出器的Prometheus查询)
    • 拒绝线程池:sum(rate(crate_threadpools{property="rejected"}[5m])) by (name)
    • 线程池队列大小:sum(crate_threadpools{property="queueSize"}) by (name)
    • 线程池活动:sum(crate_threadpools{property="active"}) by (name)
    • 查询每秒:sum(rate(crate_query_total_count[5m])) by (query)
    • 查询错误率:sum(rate(crate_query_failed_count[5m])) by (query)
    • 最近5分钟的平均查询持续时间:sum(rate(crate_query_sum_of_durations_millis[5m])) by (query) / sum(rate(crate_query_total_count[5m])) by (query)
    • 使用中的断路器内存:sum(crate_circuitbreakers{property="used"}) by (name)
    • 碎片数:crate_node{name="shard_stats",property="total"}
    • 垃圾收集器费率:sum(rate(jvm_gc_collection_seconds_count[5m])) by (gc)
    • 线程池队列大小:crate_threadpools{property="queueSize"}
    • 线程池拒绝操作:crate_threadpools{property="rejected"}
  • 操作系统指标
    • CPU利用率
    • 内存用法
    • 打开文件描述符
    • 磁盘用法
    • 磁盘读/写操作和吞吐量
    • 接收和传输网络流量

包起来

我们得到了一个Grafana仪表板,使我们能够在CratedB群集中查看有关性能和容量指标的实时数据和历史数据,这说明了一种可能的设置。您可以根据环境和偏好使用不同的工具。尽管如此,我们建议您使用板条箱JMX HTTP出口商的接口收集CratedB特异性指标,并且您还始终在OS级别监视环境的健康状况,就像我们在此处使用Prometheus Node Exporter所做的那样。