跳到主要内容
版本:4.x

自定义巡检

下面介绍如何增加自定义巡检项操作。

前置条件

所有巡检脚本路径位于 webserver 部署路径下的 inspection/script 目录,如下图,新增的巡检项可以在 json 列表中自定义。

图片展示了SelectDB Enterprise Manager巡检脚本目录结构。在webserver部署路径下的inspection/script目录下,有多个巡检脚本文件,如belimits.sh、check_bad_tablet.sh等,还有inspection-item-en.json和inspection-item.json等JSON文件,以及jdbc_driver.jar等其他文件。该图片与上下文紧密相关,直观呈现了巡检脚本的存放位置,为后续介绍巡检项自定义操作提供了路径参考。

自定义集群巡检

集群巡检主要是连接 Doris 集群进行 SQL 查询,对关键参数进行分析判断,来反应出巡检项的状态。下面以新增「集群是否关闭了 cluster balance」为例进行介绍。

  • 在 inspection-item(-en).json 中新增中英文的巡检项

    ...,
    {
    "taskId": 15,
    "taskName": "集群是否关闭了 cluster balance",
    "taskType": "性能与规范",
    "referenceValue": "true",
    "inspectionReason": "# 为什么要做这个巡检?\n查看集群集平衡状态是否正常,影响集群磁盘的使用率\n# 如何查看?\n在 mysql client 执行 ADMIN SHOW FRONTEND CONFIG like '%balance%';命令查看集群平衡情况,disable_balance 和 disable_tablet_scheduler 值都为 false 的话,均衡正常开启",
    "repairAction": "在 mysql client 执行 ADMIN SHOW FRONTEND CONFIG like '%balance%';命令查看集群平衡情况,disable_balance 和 disable_tablet_scheduler 值都为 false 的话,均衡正常开启",
    "scope": "cluster",
    "module": "",
    "shell": "check_balance.sh"
    },
    ...
  • 在 webserver/inspection/script 目录新增 check_balance.sh 内容如下

    1. JDBC 连接串 包括发起查询的目标 FE 的 host, ip, user 和 password,以及JDK和 JDBC_DRIVER的路径,这些都是预留字段,在实际发起查询时,webserver 会根据集群的实际参数进行默认填充,因此只需要即将连接串加到巡检项开头即可,不需要进修改
    2. 查询 SQL 为实际运行的查询语句,这里需要自行编辑 QUERY 参数
    3. RESULT 参数为查询结果,输出位 CSV 格式,用空格符分隔
    4. 对查询结果值进行分析(shell/python等),并输出巡检结果格式为 JSON 字符串,格式为 {"status":"info","value":"true"},巡检项状态 status: info/warn/error, 分别对应 正常/提示/警告
    #!/bin/bash

    # ------ JDBC 连接串(请勿修改)------
    HOST={{host}} # fe 节点 IP
    PORT={{port}} # fe 节点 query_port
    USER={{user}} # 发起查询的 doris 用户 root
    PASSWORD={{password}} # doris root 用户的密码
    JDK_PATH={{jdk_path}} # jdk 的绝对路径,在 webserver/deps 下
    JDBC_DRIVER_PATH={{jdbc_driver_path}} # jdbc_driver.jar 路径,默认和巡检脚本在同一级目录

    # ------查询 SQL (自定义)------
    QUERY="ADMIN SHOW FRONTEND CONFIG like '%balance%';"

    # 输出格式为 CSV,使用空格分隔,和 MySQL 客户端查询的输出格式一致
    # 执行MySQL查询并提取值为Total的行中的TabletNum的的值
    # -d 指定查询的 database,默认为 information_schema
    # -s 指定分隔符,默认为' '
    RESULT=$(${JDK_PATH} -jar "$JDBC_DRIVER_PATH" -h "$HOST" -P "$PORT" -d information_schema -u "$USER" -p "$PASSWORD" -e "$QUERY" -s " ")

    # RESULT 结果示例
    #Key Value Type IsMutable MasterOnly Comment
    #diagnose_balance_max_tablet_num_ratio 1.1 double true true
    #disable_balance false boolean true true
    #disable_colocate_balance false boolean true true
    #disable_colocate_balance_between_groups false boolean true true
    #disable_disk_balance false boolean true true
    #enable_disk_balance_for_single_replica false boolean true true
    #enable_urgent_balance_no_low_backend true boolean true true

    # shell 直接分析
    # 使用awk来查找并提取值为disable_balance的值
    disable_balance=$(echo "$RESULT" | awk '$1=="disable_balance" {print $2}')
    # 使用awk来查找并提取值为disable_disk_balance值
    disable_disk_balance=$(echo "$RESULT" | awk '$1=="disable_disk_balance" {print $2}')

    # 或者使用嵌套 python 来对 RESULT 进行分析
    # 1. 直接运行 python 脚本
    VALUE=$(python ./a.py)
    # 2. 直接在脚本中运行脚本
    VALUE=`
    python -c 'import sys; print("Hello", sys.argv[1])' ${RESULT}
    `
    echo ${VALUE}

    # ------ 查询结果分析(自定义)------
    # 输出为 JSON 字符串,格式为 {"status":"info","value":"true"}
    # 巡检项状态 status: info/warn/error, 分别对应 正常/提示/警告
    # 巡检项返回值 value: 字符串类型,可以填写期望在页面上展示的返回值,如检查各节点 numa node 的节点数(int类型),balance 是否开启(true/false)等

    # 判断cluster_balance的状态并输出
    if [ "$disable_balance" == "false" ] && [ "$disable_disk_balance" == "false" ]; then
    echo '{"status":"info","value":"true"}'
    else
    echo '{"status":"info","value":"false"}'
    fi

机器参数检查

以「最大打开文件数」为例

  • 添加巡检项说明

    {
    "taskId": 4,
    "taskName": "最大打开文件数",
    "taskType": "机器环境",
    "referenceValue": ">65535",
    "inspectionReason": "# 为什么要做这个巡检?\n在 Linux 系统中,每个进程都有一个最大打开文件数的限制,也就是它可以同时打开的文件和 Socket 的数量。这个限制可以防止程序因为错误而耗尽系统资源。\n对于数据库系统,需要提高这个限制。如果达到了最大打开文件数的限制,应用程序可能会因无法打开新的文件或 Socket 而失败。\n# 如何修复?\n您可以按照以下步骤进行操作:\n打开终端窗口(命令行界面)。\n输入以下命令:\n```\nsudo vim /etc/security/limits.conf \n* soft nofile 65536\n* hard nofile 65536 \nsysctl -p\n```",
    "repairAction": "您可以按照以下步骤进行操作:\n打开终端窗口(命令行界面)。\n输入以下命令:\nsudo vim /etc/security/limits.conf \n* soft nofile 65535\n* hard nofile 65535 \nsysctl -p",
    "scope": "node",
    "module": "all", // fe/be 节点都会进行检查
    "shell": "ulimitn.sh"
    },
  • 在 webserver/inspection/script 目录新增 ulimitn.sh 内容如下

    #!/bin/bash

    # 查询机器最大打开文件数
    ulimitn=$(/bin/bash -c 'ulimit -n')

    # 判断是否符合要求
    # 输出为 JSON 字符串,格式为 {"status":"info","value":"true"}
    # 巡检项状态 status: info/warn/error, 分别对应 正常/提示/警告
    # 巡检项返回值 value: 字符串类型,可以填写期望在页面上展示的返回值,如检查各节点 numa node 的节点数(int类型),balance 是否开启(true/false)等
    if [ $ulimitn -gt 65535 ]; then
    echo '{"status":"info","value":"'$ulimitn'"}'
    else
    echo '{"status":"warn","value":"'$ulimitn'"}'
    fi

集群参数检查

以 「集群是否开启 recovery 模式」为例

  • 新增巡检项说明

    {
    "taskId": 14,
    "taskName": "集群是否是 recovery 模式",
    "taskType": "性能与规范",
    "referenceValue": "false",
    "inspectionReason": "# 为什么要做这个巡检?\n查看集群是否处于 recovery 模式,当集群遇到故障时需要进行 recovery\n# 如何查看?\n在 fe 的conf文件中查看 metadata_failure_recovery 参数,值为 true,则开启恢复模式,false 则默认关闭,平常不建议开启",
    "repairAction": "在 fe 的conf文件中查看 metadata_failure_recovery 参数,值为 true,则开启恢复模式,false 则默认关闭,平常不建议开启",
    "scope": "node",
    "module": "fe", // 仅在 fe 节点上进行检查
    "shell": "find_metadata_failure_recovery.sh"
    },
  • 在 webserver/inspection/script 目录新增 find_metadata_failure_recovery.sh 内容如下

    1. 节点参数为 fe/be 的节点参数,包括IP,部署目录,日志目录,端口以及数据目录(待完善补充)。「节点参数」都是由 webserver进行巡检时动态填充后交由节点上 agent 执行,无需手动修改
    2. 对结果值进行分析(shell/python等),并输出巡检结果格式为 JSON 字符串,格式为 {"status":"info","value":"true"},巡检项状态 status: info/warn/error, 分别对应 正常/提示/警告
    #!/bin/bash

    # ------ 节点参数(请勿修改)------
    # 通用参数
    IP={{ip}} # fe/be 节点 IP
    DEPLOY_DIR={{deploy_dir}} # fe/be 部署路径,例如:/home/shane/doris/fe
    LOG_DIR={{log_dir}} # fe/be 日志路径,例如:/home/shane/doris/be/log
    # fe 参数
    QUERY_PORT={{query_port}}
    HTTP_PORT={{http_port}}
    EDIT_LOG_PORT={{edit_log_port}}
    RPC_PORT={{rpc_port}}
    META_DIR={{meta_dir}} # fe 元数据目录,例如:/home/shane/doris/doris-meta
    # be 参数
    BE_PORT={{be_port}}
    WEBSERVER_PORT={{webserver_port}}
    HEARTBEAT_PORT={{heartbeat_port}}
    BRPC_PORT={{brpc_port}}
    STORAGE_ROOT_PATHS={{storage_root_paths}}
    EXTERNAL_TABLE_CACHES={{external_table_caches}}

    # ------ 巡检项内容(自定义)------
    fe_conf_file=$(find ${DEPLOY_DIR} -name "fe.conf" 2>/dev/null | head -n 1)

    if [ ! -f "$fe_conf_file" ]; then
    echo '{"status":"warn","value":"not found fe.conf"}'
    exit 0
    fi

    # 使用grep命令查找metadata_failure_recovery参数的值
    metadata_failure_recovery_value=$(grep -E '^\s*metadata_failure_recovery\s*=' "$fe_conf_file" | awk -F'=' '{print $2}' | tr -d '[:space:]')

    # 检查是否找到了metadata_failure_recovery参数的值
    # 输出为 JSON 字符串,格式为 {"status":"info","value":"true"}
    # 巡检项状态 status: info/warn/error, 分别对应 正常/提示/警告
    # 巡检项返回值 value: 字符串类型,可以填写期望在页面上展示的返回值,如检查各节点 numa node 的节点数(int类型),balance 是否开启(true/false)等
    if [[ -n "$metadata_failure_recovery_value" ]]; then
    echo '{"status":"info","value":"'$metadata_failure_recovery_value'"}'
    else
    echo '{"status":"info","value":"false"}'
    fi