利用高级监控仪表板解决常见数据库问题

图片

本文字数:8293;估计阅读时间:21分钟

作者: Lionel Palacin

本文在公众号【ClickHouseInc】首发

图片

在生产环境中,数据库系统的监控是不可或缺的。了解部署的健康状况是避免中断或快速解决问题的关键。

ClickHouse 深知这一点,因此默认提供了一组预配置的高级监控仪表板。高级仪表板是一款轻量级工具,可深入分析 ClickHouse 系统及其运行环境,帮助您提前识别性能瓶颈、系统故障以及低效操作,从而保持系统高效运行。

无论您是处理高查询负载的数据工程师,还是保障 ClickHouse 高可用性的站点稳定性工程师 (SRE),高级仪表板都能为您提供高效的监控和故障排查能力。该工具支持 ClickHouse OSS(开源软件)和 ClickHouse Cloud 环境。

快速上手高级监控仪表板

高级仪表板无需额外安装即可使用。根据您的运行环境,可能需要启用指标日志和异步指标日志来生成默认的可视化效果。如果您使用的是 ClickHouse Cloud,这些功能已默认启用,无需额外配置。

若需手动启用,请参考全球设置文档,修改服务器配置文件 /etc/clickhouse-server/config.d/metric_log.xml:

<clickhouse>
    <metric_log>
        <database>system</database>
        <table>metric_log</table>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
        <collect_interval_milliseconds>1000</collect_interval_milliseconds>
        <max_size_rows>1048576</max_size_rows>
        <reserved_size_rows>8192</reserved_size_rows>
        <buffer_size_rows_flush_threshold>524288</buffer_size_rows_flush_threshold>
        <flush_on_crash>false</flush_on_crash>
    </metric_log>
    <asynchronous_metric_log>
        <database>system</database>
        <table>asynchronous_metric_log</table>
        <flush_interval_milliseconds>7500</flush_interval_milliseconds>
        <collect_interval_milliseconds>1000</collect_interval_milliseconds>
        <max_size_rows>1048576</max_size_rows>
        <reserved_size_rows>8192</reserved_size_rows>
        <buffer_size_rows_flush_threshold>524288</buffer_size_rows_flush_threshold>
        <flush_on_crash>false</flush_on_crash>
    </asynchronous_metric_log>
</clickhouse>

启动 ClickHouse 服务器后,您可以通过以下地址访问高级监控仪表板:

‍‍‍<your_clickhouse_url>/dashboard‍‍‍

图片

默认情况下,您可以使用系统的默认用户登录访问仪表板。但为了安全起见,建议为此专门创建一个独立的用户。

要正常运行默认的可视化功能,该用户需要具备以下表的读取权限:

  • system.dashboards:存储仪表板的可视化定义。

  • system.metric_log:记录来自 system.metrics 和 system.events 表的历史指标值。

  • system.asynchronous_metric_log:保存 system.asynchronous_metrics 的历史数据。

同时,用户还需要以下两个特殊权限:CREATE TEMPORARY TABLE ON *.* 和 REMOTE ON *.*。

下面,我们为实验创建一个仪表板专用用户:

-- Create dashboard user
CREATE USER dashboard_user IDENTIFIED BY ;

-- Create dashboard role and assign to dashboard_user
CREATE ROLE dashboard;
GRANT dashboard TO dashboard_user;

-- Grant rights to access advanced dashboards
GRANT REMOTE ON *.* to dashboard;
GRANT CREATE TEMPORARY TABLE on *.* to dashboard;
GRANT SELECT ON system.metric_log to dashboard;
GRANT SELECT ON system.asynchronous_metric_log to dashboard;
GRANT SELECT ON system.dashboards to dashboard;

您可以通过在 URL 中添加用户名参数的方式访问,例如:  

‍<your_clickhouse_url>/dashboard?user=dashboard‍

图片

登录时,输入创建仪表板用户时设置的密码。

在页面顶部的导航栏中,您可以查看应用程序加载仪表板定义时使用的 SQL 查询。

-- Load dashboard definition
SELECT title, query FROM system.dashboards WHERE dashboard = 'Overview'

仪表板的查询过滤器默认设置为 "Overview"。不同的仪表板集适用于不同的场景:默认的 "Overview" 仪表板适合本地部署,而 "Cloud Overview" 则针对云部署环境进行了优化。

高级仪表板的默认可视化功能

高级仪表板内置了一系列默认图表,能够为您提供 ClickHouse 系统的实时运行状况和性能洞察。为了便于查看,这些图表被分为三类,分别对应不同的使用场景。

ClickHouse 专用指标

这些图表专注于监控 ClickHouse 实例的运行状况和性能表现:

  • 每秒查询数 (Queries Per Second):监控系统每秒处理的查询数量。

  • 每秒读取行数 (Selected Rows/Sec):显示查询读取的数据行数。

  • 每秒插入行数 (Inserted Rows/Sec):反映数据写入的速率。

  • MergeTree 活跃分片总数 (Total MergeTree Parts):展示 MergeTree 表中活跃的分片数,帮助识别未批量处理的插入操作。

  • 单分区最大分片数 (Max Parts for Partition):突出显示某个分区中分片数量的峰值。

  • 当前运行的查询数 (Queries Running):显示系统中正在执行的查询数目。

  • 每秒读取字节数 (Selected Bytes Per Second):显示查询读取的数据量。

系统健康状况相关指标

除了 ClickHouse 本身,底层系统的状态同样至关重要。这些图表帮助您监控相关的系统资源:

  • I/O 等待时间 (IO Wait):跟踪磁盘 I/O 操作的等待时间。

  • CPU 等待时间 (CPU Wait):测量因 CPU 争用导致的操作延迟。

  • 磁盘读取量 (Read From Disk):显示从磁盘读取的数据量。

  • 文件系统读取量 (Read From Filesystem):记录从文件系统(包括页面缓存)读取的数据量。

  • 内存使用量 (Memory tracked, bytes):展示 ClickHouse 跟踪的内存占用情况。

  • 15 分钟平均负载 (Load Average (15 minutes)):显示系统最近 15 分钟的平均负载。

  • 用户空间 CPU 使用率 (OS CPU Usage (Userspace)):监控运行用户空间代码时的 CPU 使用情况。

  • 内核空间 CPU 使用率 (OS CPU Usage (Kernel)):监控运行内核代码时的 CPU 使用情况。

 

ClickHouse Cloud 专用指标

ClickHouse Cloud 采用对象存储(如 S3 类型)保存数据。以下图表可帮助您检测相关接口的性能:

  • S3 读取等待时间 (S3 Read wait):反映对 S3 进行读取请求的延迟。

  • 每秒 S3 读取错误数 (S3 read errors per second):监控读取错误的发生频率。

  • 每秒从 S3 读取数据量 (Read From S3 (bytes/sec)):展示从 S3 存储读取数据的速率。

  • 每秒写入 S3 的请求数 (Disk S3 write req/sec):监控写入 S3 的操作频率。

  • 每秒读取 S3 的请求数 (Disk S3 read req/sec):监控从 S3 读取的操作频率。

  • 页面缓存命中率 (Page cache hit rate):评估页面缓存的使用效率。

  • 文件系统缓存命中率 (Filesystem cache hit rate):显示文件系统缓存的命中情况。

  • 文件系统缓存大小 (Filesystem cache size):记录文件系统缓存的当前大小。

  • 每秒发送的网络流量 (Network send bytes/sec):监控出站网络流量的速率。

  • 每秒接收的网络流量 (Network receive bytes/sec):监控入站网络流量的速率。

  • 并发网络连接数 (Concurrent network connections):显示当前的并发网络连接数量。

定制高级仪表板中的图表  

在高级仪表板中,每个可视化图表都由一个关联的 SQL 查询驱动,这些查询负责提供图表的数据内容。您可以通过点击图表上的铅笔图标来修改相关查询。

图片

在编辑界面中,您可以根据需求调整查询内容。此外,您还可以通过点击“添加图表 (Add chart)”按钮新增自定义图表,并在新图表中编辑对应的查询。例如,我们可以新增一个图表来跟踪主键的内存使用情况。以下是为该图表提供支持的 SQL 查询:

SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(value) FROM merge('system', '^asynchronous_metric_log') WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} AND metric = 'TotalPrimaryKeyBytesInMemory' GROUP BY t ORDER BY t WITH FILL STEP {rounding:UInt32}

需要注意,通过 Web 应用程序添加的图表是以查询参数的形式编码的,这使得它们可以方便地添加到书签中。

如果您需要一种更稳定的方式,可以将自定义图表直接存储到 ClickHouse 数据库中。操作步骤如下:

1. 创建一个与默认表 system.dashboards 架构一致的新表。

-- Create a separate database
CREATE DATABASE custom;

-- Create the custom dashboard table
CREATE TABLE custom.dashboards
(
    `dashboard` String,
    `title` String,
    `query` String
) ORDER BY ()

2. 将您的自定义可视化内容插入到新表中。

-- Total size primary keys visualization query
INSERT INTO custom.dashboards (dashboard, title, query)
VALUES (
    'Overview',
    'Total primary keys size',
    'SELECT toStartOfInterval(event_time, INTERVAL {rounding:UInt32} SECOND)::INT AS t, avg(value) FROM merge(\'system\', \'^asynchronous_metric_log\') WHERE event_date >= toDate(now() - {seconds:UInt32}) AND event_time >= now() - {seconds:UInt32} AND metric = \'TotalPrimaryKeyBytesInMemory\' GROUP BY t  ORDER BY t WITH FILL STEP  {rounding:UInt32}'
);

通过这种方式,您可以将自定义数据库中的仪表板定义与 Web 应用程序中默认的定义合并,从而实现扩展和优化。

SELECT title, query FROM merge(REGEXP('custom|system'),'dashboards') WHERE dashboard = 'Overview'

最后,请确保仪表板用户具备访问自定义数据库所需的权限。例如,用户需要对相关表拥有读取和修改的权限,以便正确加载和管理仪表板内容。

如何通过高级仪表板识别问题  

实时监控 ClickHouse 服务的运行状况,可以帮助您在问题影响业务之前及时发现和解决问题。以下是利用高级仪表板可以识别的一些常见问题。

未批量插入的数据问题  

根据最佳实践文档的建议,在 ClickHouse 中插入数据时应尽量使用批量插入。

合理的批量大小可以显著减少数据写入过程中创建的部分数量,从而优化磁盘写入效率,并降低合并操作的频率。

要判断插入操作是否优化,可以关注以下两个关键指标:每秒插入行数 (Inserted Rows/sec) 和每个分区的最大部分数 (Max Parts for Partition)。

图片

如上图所示,从 13 点到 14 点之间,每秒插入行数和每个分区的最大部分数出现了两次峰值。这表明数据摄取速度是合理的。

然而,16 点之后,我们注意到每个分区的最大部分数急剧上升,但每秒插入行数却很低。这表明数据分区的大小可能未得到有效优化。

资源密集型查询问题  

某些 SQL 查询可能会占用大量资源(如 CPU 或内存)。监控这些查询的资源消耗情况,对于保障系统整体性能至关重要。

如果资源使用量突然增加,而查询吞吐量并未显著变化,则可能是某些高成本查询导致的。这种现象可以通过高级仪表板快速发现。

以下是一个 CPU 使用率达到峰值,但每秒执行的查询数量未发生显著变化的示例:

图片

主键设计问题  

高级仪表板还可以帮助识别主键设计不当的问题。根据文档,针对具体使用场景选择合适的主键,能够显著提升查询性能,因为这样可以减少 ClickHouse 在查询过程中需要读取的行数。

您可以通过监控“每秒选中行数 (Selected Rows/sec)”指标来判断主键设计是否需要优化。选中行数的突然激增,可能意味着查询吞吐量的增加,也可能表明某些查询需要选中大量行来执行操作。

图片

通过时间戳过滤条件,您可以在 system.query_log 表中找到峰值时间段内执行的查询。

例如,我们可以运行以下查询,查看上午 11:20 到 11:30 之间执行的所有查询,以找出哪些查询读取了过多的行。

SELECT
    type,
    event_time,
    query_duration_ms,
    query,
    read_rows,
    tables
FROM system.query_log
WHERE has(databases, 'default') AND (event_time >= '2024-12-23 11:20:00') AND (event_time <= '2024-12-23 11:30:00') AND (type = 'QueryFinish')
ORDER BY query_duration_ms DESC
LIMIT 5
FORMAT VERTICAL

Row 1:
──────
type:              QueryFinish
event_time:        2024-12-23 11:22:55
query_duration_ms: 37407
query:             SELECT
    toStartOfMonth(review_date) AS month,
    any(product_title),
    avg(star_rating) AS avg_stars
FROM amazon_reviews_no_pk
WHERE
    product_category = 'Home'
GROUP BY
    month,
    product_id
ORDER BY
    month DESC,
    product_id ASC
LIMIT 20
read_rows:         150957260
tables:            ['default.amazon_reviews_no_pk']

Row 2:
──────
type:              QueryFinish
event_time:        2024-12-23 11:26:50
query_duration_ms: 7325
query:             SELECT
    toStartOfMonth(review_date) AS month,
    any(product_title),
    avg(star_rating) AS avg_stars
FROM amazon_reviews_no_pk
WHERE
    product_category = 'Home'
GROUP BY
    month,
    product_id
ORDER BY
    month DESC,
    product_id ASC
LIMIT 20
read_rows:         150957260
tables:            ['default.amazon_reviews_no_pk']

Row 3:
──────
type:              QueryFinish
event_time:        2024-12-23 11:24:10
query_duration_ms: 3270
query:             SELECT
    toStartOfMonth(review_date) AS month,
    any(product_title),
    avg(star_rating) AS avg_stars
FROM amazon_reviews_pk
WHERE
    product_category = 'Home'
GROUP BY
    month,
    product_id
ORDER BY
    month DESC,
    product_id ASC
LIMIT 20
read_rows:         6242304
tables:            ['default.amazon_reviews_pk']

Row 4:
──────
type:              QueryFinish
event_time:        2024-12-23 11:28:10
query_duration_ms: 2786
query:             SELECT
    toStartOfMonth(review_date) AS month,
    any(product_title),
    avg(star_rating) AS avg_stars
FROM amazon_reviews_pk
WHERE
    product_category = 'Home'
GROUP BY
    month,
    product_id
ORDER BY
    month DESC,
    product_id ASC
LIMIT 20
read_rows:         6242304
tables:            ['default.amazon_reviews_pk']

在这个示例中,我们看到同一个查询分别对 amazon_reviews_no_pk 和 amazon_reviews_pk 表进行了执行。这表明可能有人正在测试 amazon_reviews 表的主键设计选项。

总结  

通过这篇文章,我们了解了 ClickHouse 的高级仪表板功能,包括如何开始使用它,以及如何利用它识别和解决常见问题。

无论您选择哪种部署方式,这款轻量级的监控工具都可以开箱即用。如果您倾向于使用 Prometheus 等第三方监控工具,也可以参考官方文档中的示例进行配置。

此外,ClickHouse Cloud 还提供了专属的新仪表板功能,让您可以创建更丰富的可视化效果,值得进一步探索。

 征稿启示

面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值