暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

ClickHouseInc 2025-01-09
400



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


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

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 ;


      -- 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 还提供了专属的新仪表板功能,让您可以创建更丰富的可视化效果,值得进一步探索。


                  /END/


                  注册ClickHouse中国社区大使,领取认证考试券

                  ClickHouse社区大使计划正式启动,首批过审贡献者享原厂认证考试券!


                  试用阿里云 ClickHouse企业版


                  轻松节省30%云资源成本?阿里云数据库ClickHouse 云原生架构全新升级,首次购买ClickHouse企业版计算和存储资源组合,首月消费不超过99.58元(包含最大16CCU+450G OSS用量)了解详情:https://t.aliyun.com/Kz5Z0q9G



                  征稿启示

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

                  文章转载自ClickHouseInc,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论