TT Bigdata TT Bigdata
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)
  • 产品中心

  • 安装与使用

    • Ambari Plus 安装

    • 组件安装

    • 开启高可用

    • 权限与审计

    • Ambari Plus Monitor

      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
        • 必须 ambari plus monitor 数据库初始化文件
        • 1. 放置初始化文件
        • 2. 导入到 ambari 库
        • 3. 验证初始化结果
        • 4. 初始化 SQL
      • Monitor 安装
      • 监控与告警使用
    • 常见问题

  • 发布与支持

  • 会员与访问

目录

必须 ambari plus monitor 数据库初始化文件

必须ambari plus monitor 数据库初始化文件

Ambari Plus Monitor 会在元数据库里保存集群、主机、服务、组件、指标定义、告警规则、通知记录和同步任务等数据。安装 Monitor 服务前,必须先把这份初始化 SQL 导入到 Ambari Server 使用的同一个 ambari 库里。

必须

本文 SQL 要导入 Ambari 官方表所在的同一个库。本文示例库名是 ambari,不要单独创建 monitor、ambari_monitor 或其他库,否则 Monitor 安装后读不到平台已有的集群与租户上下文。

# 1. 放置初始化文件

把初始化文件放到 hadoop1.test.com 上,例如:

mkdir -p /data/modules/monitor
cd /data/modules/monitor
ls -lh Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql
1
2
3

我习惯把所有安装前置 SQL 放在 /data/modules 下,这样后面排查或重装时不用到处找文件。

# 2. 导入到 ambari 库

本文示例环境使用 hadoop1.test.com 上的 MySQL / MariaDB,基础演示账号为 root / root。导入时连接 ambari 库:

mysql -uroot -p ambari < Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql
1

注意

root / root 只适合教程环境快速跑通。生产环境建议创建专用数据库用户,并使用高复杂度密码和最小权限授权。

# 3. 验证初始化结果

导入后先看 Monitor 表数量,再抽查关键表和指标定义数据。

mysql -uroot -p -D ambari -N -e \
  "SELECT COUNT(*) FROM information_schema.tables \
   WHERE table_schema='ambari' AND table_name LIKE 'monitor\\_%';"

mysql -uroot -p -D ambari -N -e \
  "SHOW TABLES LIKE 'monitor_cluster'; \
   SHOW TABLES LIKE 'monitor_metric_definition'; \
   SELECT COUNT(*) FROM monitor_metric_definition;"
1
2
3
4
5
6
7
8

本文环境里可以看到 38 张 Monitor 相关表,monitor_metric_definition 里已经有指标定义数据。

Ambari Plus Monitor 元数据库初始化

# 4. 初始化 SQL

下面的 SQL 可以保存为 Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql 后执行。它只负责 Monitor 元数据结构和基线数据,库名由你执行时连接的数据库决定。

展开查看 Ambari Plus Monitor 初始化 SQL

SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_cluster` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `cluster_name` VARCHAR(128) NOT NULL,
  `display_name` VARCHAR(128) DEFAULT NULL,
  `ambari_cluster_id` VARCHAR(128) DEFAULT NULL,
  `environment` VARCHAR(64) DEFAULT NULL,
  `version` VARCHAR(64) DEFAULT NULL,
  `security_type` VARCHAR(64) DEFAULT NULL,
  `description` TEXT,
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `total_hosts` INT NOT NULL DEFAULT 0,
  `total_services` INT NOT NULL DEFAULT 0,
  `total_components` INT NOT NULL DEFAULT 0,
  `alert_count` INT NOT NULL DEFAULT 0,
  `tenant_id` BIGINT DEFAULT NULL,
  `extra_info` TEXT,
  `sync_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_cluster_name` (`cluster_name`),
  KEY `idx_cluster_tenant` (`tenant_id`),
  KEY `idx_cluster_health` (`health_status`),
  KEY `idx_cluster_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_host` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `host_name` VARCHAR(255) NOT NULL,
  `ip_address` VARCHAR(64) DEFAULT NULL,
  `cluster_id` BIGINT NOT NULL,
  `rack` VARCHAR(128) DEFAULT NULL,
  `os_type` VARCHAR(64) DEFAULT NULL,
  `cpu_arch` VARCHAR(64) DEFAULT NULL,
  `cpu_cores` INT DEFAULT NULL,
  `memory_gb` INT DEFAULT NULL,
  `disk_gb` BIGINT DEFAULT NULL,
  `agent_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `agent_heartbeat_time` DATETIME DEFAULT NULL,
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `cpu_usage` DOUBLE DEFAULT NULL,
  `memory_usage` DOUBLE DEFAULT NULL,
  `disk_usage` DOUBLE DEFAULT NULL,
  `load1` DOUBLE DEFAULT NULL,
  `load5` DOUBLE DEFAULT NULL,
  `load15` DOUBLE DEFAULT NULL,
  `running_component_count` INT NOT NULL DEFAULT 0,
  `alert_count` INT NOT NULL DEFAULT 0,
  `tenant_id` BIGINT DEFAULT NULL,
  `extra_info` TEXT,
  `sync_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_host_cluster_name` (`cluster_id`, `host_name`),
  KEY `idx_host_name` (`host_name`),
  KEY `idx_host_cluster` (`cluster_id`),
  KEY `idx_host_health` (`health_status`),
  KEY `idx_host_agent` (`agent_status`),
  KEY `idx_host_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_service` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `service_name` VARCHAR(128) NOT NULL,
  `display_name` VARCHAR(128) DEFAULT NULL,
  `cluster_id` BIGINT NOT NULL,
  `version` VARCHAR(64) DEFAULT NULL,
  `service_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `total_components` INT NOT NULL DEFAULT 0,
  `running_components` INT NOT NULL DEFAULT 0,
  `alert_count` INT NOT NULL DEFAULT 0,
  `extra_info` TEXT,
  `sync_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_service_cluster_name` (`cluster_id`, `service_name`),
  KEY `idx_service_cluster` (`cluster_id`),
  KEY `idx_service_health` (`health_status`),
  KEY `idx_service_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_component` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `component_name` VARCHAR(128) NOT NULL,
  `display_name` VARCHAR(128) DEFAULT NULL,
  `service_id` BIGINT NOT NULL,
  `cluster_id` BIGINT NOT NULL,
  `category` VARCHAR(64) DEFAULT NULL,
  `version` VARCHAR(64) DEFAULT NULL,
  `component_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `total_instances` INT NOT NULL DEFAULT 0,
  `running_instances` INT NOT NULL DEFAULT 0,
  `alert_count` INT NOT NULL DEFAULT 0,
  `dependencies` TEXT,
  `data_source_type` VARCHAR(64) DEFAULT NULL,
  `template_id` BIGINT DEFAULT NULL,
  `extra_info` TEXT,
  `sync_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_component_service_name` (`service_id`, `component_name`),
  KEY `idx_component_name` (`component_name`),
  KEY `idx_component_cluster` (`cluster_id`),
  KEY `idx_component_category` (`category`),
  KEY `idx_component_health` (`health_status`),
  KEY `idx_component_status` (`component_status`),
  KEY `idx_component_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_component_instance` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `component_id` BIGINT NOT NULL,
  `cluster_id` BIGINT NOT NULL,
  `host_id` BIGINT DEFAULT NULL,
  `host_name` VARCHAR(255) NOT NULL,
  `instance_name` VARCHAR(255) DEFAULT NULL,
  `role` VARCHAR(128) DEFAULT NULL,
  `process_id` VARCHAR(64) DEFAULT NULL,
  `port` INT DEFAULT NULL,
  `status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `heap_used_mb` BIGINT DEFAULT NULL,
  `heap_max_mb` BIGINT DEFAULT NULL,
  `cpu_usage` DOUBLE DEFAULT NULL,
  `alert_count` INT NOT NULL DEFAULT 0,
  `extra_info` TEXT,
  `sync_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_instance_component_host` (`component_id`, `host_name`),
  KEY `idx_instance_host` (`host_id`),
  KEY `idx_instance_cluster` (`cluster_id`),
  KEY `idx_instance_name` (`instance_name`),
  KEY `idx_instance_status` (`status`),
  KEY `idx_instance_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_service_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `cluster_id` BIGINT NOT NULL,
  `cluster_name` VARCHAR(128) NOT NULL,
  `service_id` BIGINT NOT NULL,
  `service_name` VARCHAR(64) NOT NULL,
  `health_score` INT DEFAULT 100,
  `risk_level` VARCHAR(16) DEFAULT 'UNKNOWN',
  `metrics_json` JSON DEFAULT NULL,
  `snapshot_time` DATETIME NOT NULL,
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_service_snapshot_time` (`cluster_id`, `service_name`, `snapshot_time`),
  KEY `idx_cluster_service` (`cluster_id`, `service_name`),
  KEY `idx_snapshot_time` (`snapshot_time`),
  KEY `idx_cluster_service_time` (`cluster_id`, `service_name`, `snapshot_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_alert_rule` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `rule_name` VARCHAR(128) NOT NULL,
  `display_name` VARCHAR(128) DEFAULT NULL,
  `rule_type` VARCHAR(64) NOT NULL,
  `rule_group_id` BIGINT DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `metric_name` VARCHAR(255) DEFAULT NULL,
  `expression` TEXT,
  `condition` VARCHAR(64) DEFAULT NULL,
  `threshold` DOUBLE DEFAULT NULL,
  `duration` INT NOT NULL DEFAULT 0,
  `severity` VARCHAR(16) NOT NULL DEFAULT 'P3',
  `message_template` TEXT,
  `description` TEXT,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `labels` TEXT,
  `annotations` TEXT,
  `extra_info` TEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_rule_enabled` (`enabled`),
  KEY `idx_rule_name` (`rule_name`),
  KEY `idx_rule_component_metric` (`component_name`, `metric_name`),
  KEY `idx_rule_severity` (`severity`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_alert_event` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `fingerprint` VARCHAR(255) NOT NULL,
  `rule_id` BIGINT DEFAULT NULL,
  `rule_name` VARCHAR(128) DEFAULT NULL,
  `severity` VARCHAR(16) NOT NULL DEFAULT 'P3',
  `status` VARCHAR(32) NOT NULL DEFAULT 'FIRING',
  `cluster_id` BIGINT DEFAULT NULL,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `host_name` VARCHAR(255) DEFAULT NULL,
  `instance_name` VARCHAR(255) DEFAULT NULL,
  `event_source` VARCHAR(32) NOT NULL DEFAULT 'THRESHOLD_ENGINE',
  `source_ref` VARCHAR(255) DEFAULT NULL,
  `source_state` VARCHAR(32) DEFAULT NULL,
  `maintenance_state` VARCHAR(32) DEFAULT NULL,
  `title` VARCHAR(255) DEFAULT NULL,
  `message` TEXT,
  `current_value` DOUBLE DEFAULT NULL,
  `threshold` DOUBLE DEFAULT NULL,
  `fired_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `resolved_time` DATETIME DEFAULT NULL,
  `acknowledged_time` DATETIME DEFAULT NULL,
  `acknowledged_by` VARCHAR(128) DEFAULT NULL,
  `labels` TEXT,
  `annotations` TEXT,
  `extra_info` TEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_event_fingerprint_status` (`fingerprint`, `status`),
  KEY `idx_event_status_severity` (`status`, `severity`),
  KEY `idx_event_cluster` (`cluster_name`),
  KEY `idx_event_service` (`service_name`),
  KEY `idx_event_component` (`component_name`),
  KEY `idx_event_host` (`host_name`),
  KEY `idx_event_source` (`event_source`, `source_ref`),
  KEY `idx_event_rule` (`rule_id`),
  KEY `idx_event_fired_time` (`fired_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_official_alert_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `cluster_name` VARCHAR(128) NOT NULL,
  `ambari_alert_id` BIGINT DEFAULT NULL,
  `definition_id` BIGINT NOT NULL,
  `definition_name` VARCHAR(255) DEFAULT NULL,
  `label` VARCHAR(255) DEFAULT NULL,
  `state` VARCHAR(32) NOT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `host_name` VARCHAR(255) NOT NULL DEFAULT '*',
  `instance_name` VARCHAR(255) NOT NULL DEFAULT '*',
  `alert_scope` VARCHAR(32) DEFAULT NULL,
  `maintenance_state` VARCHAR(32) DEFAULT NULL,
  `alert_text` TEXT,
  `original_timestamp` BIGINT DEFAULT NULL,
  `latest_timestamp` BIGINT DEFAULT NULL,
  `occurrences` INT DEFAULT NULL,
  `raw_json` TEXT,
  `sync_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_official_alert_scope` (`cluster_name`, `definition_id`, `host_name`, `instance_name`),
  KEY `idx_official_alert_state` (`cluster_name`, `state`),
  KEY `idx_official_alert_service` (`cluster_name`, `service_name`, `component_name`),
  KEY `idx_official_alert_host` (`cluster_name`, `host_name`),
  KEY `idx_official_alert_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_health_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `object_type` VARCHAR(32) NOT NULL,
  `object_id` BIGINT NOT NULL,
  `object_name` VARCHAR(255) NOT NULL,
  `cluster_id` BIGINT DEFAULT NULL,
  `health_score` INT NOT NULL DEFAULT 100,
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY',
  `availability_score` INT NOT NULL DEFAULT 0,
  `alert_score` INT NOT NULL DEFAULT 0,
  `performance_score` INT NOT NULL DEFAULT 0,
  `capacity_score` INT NOT NULL DEFAULT 0,
  `dependency_score` INT NOT NULL DEFAULT 0,
  `stability_score` INT NOT NULL DEFAULT 0,
  `alert_count` INT NOT NULL DEFAULT 0,
  `p1_count` INT NOT NULL DEFAULT 0,
  `p2_count` INT NOT NULL DEFAULT 0,
  `p3_count` INT NOT NULL DEFAULT 0,
  `p4_count` INT NOT NULL DEFAULT 0,
  `snapshot_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `extra_info` TEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_snapshot_object_time` (`object_type`, `object_id`, `snapshot_time`),
  KEY `idx_snapshot_cluster_time` (`cluster_id`, `snapshot_time`),
  KEY `idx_snapshot_status_time` (`health_status`, `snapshot_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_agent_dynamic_config` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `agent_id` VARCHAR(255) NOT NULL,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `host_name` VARCHAR(255) DEFAULT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `config_version` BIGINT NOT NULL DEFAULT 1,
  `description` VARCHAR(512) DEFAULT NULL,
  `published_by` VARCHAR(128) DEFAULT NULL,
  `published_time` DATETIME DEFAULT NULL,
  `config_content` LONGTEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_agent_dynamic_config_agent_id` (`agent_id`),
  KEY `idx_agent_dynamic_config_cluster` (`cluster_name`),
  KEY `idx_agent_dynamic_config_host` (`host_name`),
  KEY `idx_agent_dynamic_config_enabled` (`enabled`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_metric_definition` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `metric_code` VARCHAR(300) NOT NULL,
  `metric_name` VARCHAR(255) NOT NULL,
  `display_name` VARCHAR(255) DEFAULT NULL,
  `metric_group` VARCHAR(64) NOT NULL,
  `priority` VARCHAR(8) DEFAULT 'P2',
  `sub_group` VARCHAR(64) DEFAULT NULL,
  `unit` VARCHAR(64) DEFAULT NULL,
  `metric_type` VARCHAR(32) NOT NULL DEFAULT 'GAUGE',
  `metric_kind` VARCHAR(32) NOT NULL DEFAULT 'COLLECTED',
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `compute_type` VARCHAR(32) NOT NULL DEFAULT 'NONE',
  `source_profile` VARCHAR(64) NOT NULL DEFAULT 'CORE',
  `ingest_status` VARCHAR(32) NOT NULL DEFAULT 'CANDIDATE',
  `stability_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `metadata_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN',
  `metadata_source` VARCHAR(64) NOT NULL DEFAULT 'FALLBACK',
  `first_seen_time` DATETIME DEFAULT NULL,
  `last_seen_time` DATETIME DEFAULT NULL,
  `seen_count` BIGINT NOT NULL DEFAULT 0,
  `sample_path` VARCHAR(1024) DEFAULT NULL,
  `sample_labels` TEXT,
  `depends_on_metrics` TEXT,
  `compute_owner` VARCHAR(128) DEFAULT NULL,
  `compute_interval_sec` INT DEFAULT NULL,
  `reject_reason` VARCHAR(512) DEFAULT NULL,
  `value_type` VARCHAR(32) NOT NULL DEFAULT 'NUMBER',
  `aggregation_mode` VARCHAR(32) NOT NULL DEFAULT 'AVG',
  `label_keys` TEXT,
  `default_chart_type` VARCHAR(32) DEFAULT 'LINE',
  `default_time_range` VARCHAR(32) DEFAULT '1h',
  `display_order` INT NOT NULL DEFAULT 0,
  `enable_fixed_threshold` TINYINT(1) NOT NULL DEFAULT 1,
  `enable_smart_threshold` TINYINT(1) NOT NULL DEFAULT 0,
  `enable_alert` TINYINT(1) NOT NULL DEFAULT 1,
  `enable_health_score` TINYINT(1) NOT NULL DEFAULT 0,
  `health_score_weight` INT DEFAULT 0,
  `description` TEXT,
  `extra_info` TEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_code` (`metric_code`),
  UNIQUE KEY `uk_metric_name` (`metric_name`),
  KEY `idx_metric_group` (`metric_group`, `sub_group`),
  KEY `idx_metric_kind` (`metric_kind`),
  KEY `idx_metric_ingest_status` (`ingest_status`, `source_profile`),
  KEY `idx_metric_compute_type` (`metric_kind`, `compute_type`),
  KEY `idx_metric_service` (`service_name`, `component_name`),
  KEY `idx_metric_last_seen` (`last_seen_time`),
  KEY `idx_metric_metadata` (`metadata_status`, `metadata_source`),
  KEY `idx_metric_alert` (`enable_alert`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_policy` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `policy_code` VARCHAR(128) NOT NULL,
  `policy_name` VARCHAR(255) NOT NULL,
  `metric_code` VARCHAR(300) NOT NULL,
  `policy_source` VARCHAR(32) NOT NULL DEFAULT 'SYSTEM',
  `threshold_mode` VARCHAR(32) NOT NULL DEFAULT 'FIXED_ONLY',
  `merge_mode` VARCHAR(32) DEFAULT NULL,
  `condition_operator` VARCHAR(32) NOT NULL,
  `condition_value1` VARCHAR(255) DEFAULT NULL,
  `condition_value2` VARCHAR(255) DEFAULT NULL,
  `condition_value_type` VARCHAR(32) NOT NULL DEFAULT 'NUMBER',
  `condition_value_list` TEXT,
  `severity` VARCHAR(16) NOT NULL DEFAULT 'WARNING',
  `trigger_window_type` VARCHAR(32) NOT NULL DEFAULT 'CONSECUTIVE',
  `trigger_window_size` INT NOT NULL DEFAULT 1,
  `trigger_match_count` INT NOT NULL DEFAULT 1,
  `recover_window_type` VARCHAR(32) NOT NULL DEFAULT 'CONSECUTIVE',
  `recover_window_size` INT NOT NULL DEFAULT 1,
  `recover_match_count` INT NOT NULL DEFAULT 1,
  `priority` INT NOT NULL DEFAULT 100,
  `version` INT NOT NULL DEFAULT 1,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `effective_from` DATETIME DEFAULT NULL,
  `effective_to` DATETIME DEFAULT NULL,
  `description` TEXT,
  `extra_info` TEXT,
  `create_by` VARCHAR(128) DEFAULT NULL,
  `update_by` VARCHAR(128) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_policy_code` (`policy_code`),
  KEY `idx_threshold_metric` (`metric_code`),
  KEY `idx_threshold_enabled` (`enabled`, `policy_source`),
  KEY `idx_threshold_mode` (`threshold_mode`, `severity`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_policy_scope` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `policy_id` BIGINT NOT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `scope_priority` INT NOT NULL DEFAULT 100,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_policy_scope` (`policy_id`, `scope_type`, `scope_ref`(255)),
  KEY `idx_scope_lookup` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_scope_policy` (`policy_id`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `metric_code` VARCHAR(300) NOT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `policy_id` BIGINT DEFAULT NULL,
  `policy_code` VARCHAR(128) DEFAULT NULL,
  `policy_version` INT DEFAULT NULL,
  `policy_source` VARCHAR(32) DEFAULT NULL,
  `threshold_mode` VARCHAR(32) NOT NULL DEFAULT 'FIXED_ONLY',
  `merge_mode` VARCHAR(32) DEFAULT NULL,
  `fixed_upper` DOUBLE DEFAULT NULL,
  `fixed_lower` DOUBLE DEFAULT NULL,
  `smart_upper` DOUBLE DEFAULT NULL,
  `smart_lower` DOUBLE DEFAULT NULL,
  `effective_operator` VARCHAR(32) DEFAULT NULL,
  `effective_value1` VARCHAR(255) DEFAULT NULL,
  `effective_value2` VARCHAR(255) DEFAULT NULL,
  `effective_upper` DOUBLE DEFAULT NULL,
  `effective_lower` DOUBLE DEFAULT NULL,
  `sample_count` INT NOT NULL DEFAULT 0,
  `window_start` DATETIME DEFAULT NULL,
  `window_end` DATETIME DEFAULT NULL,
  `calculated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `expire_at` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_snapshot` (`metric_code`, `scope_type`, `scope_ref`(255)),
  KEY `idx_snapshot_metric_scope` (`metric_code`, `scope_type`, `scope_ref`(255)),
  KEY `idx_snapshot_policy` (`policy_id`, `policy_version`),
  KEY `idx_snapshot_time` (`calculated_at`, `expire_at`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_recommendation` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `recommendation_code` VARCHAR(128) NOT NULL,
  `metric_code` VARCHAR(300) NOT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `current_policy_id` BIGINT DEFAULT NULL,
  `current_policy_code` VARCHAR(128) DEFAULT NULL,
  `current_policy_source` VARCHAR(32) DEFAULT NULL,
  `recommended_operator` VARCHAR(32) NOT NULL,
  `recommended_value1` VARCHAR(255) DEFAULT NULL,
  `recommended_value2` VARCHAR(255) DEFAULT NULL,
  `recommended_upper` DOUBLE DEFAULT NULL,
  `recommended_lower` DOUBLE DEFAULT NULL,
  `algorithm_name` VARCHAR(128) DEFAULT NULL,
  `algorithm_version` VARCHAR(64) DEFAULT NULL,
  `sample_count` INT NOT NULL DEFAULT 0,
  `window_start` DATETIME DEFAULT NULL,
  `window_end` DATETIME DEFAULT NULL,
  `confidence` DOUBLE DEFAULT NULL,
  `status` VARCHAR(32) NOT NULL DEFAULT 'PENDING',
  `change_reason` VARCHAR(1024) DEFAULT NULL,
  `extra_info` TEXT,
  `review_by` VARCHAR(128) DEFAULT NULL,
  `review_reason` VARCHAR(1024) DEFAULT NULL,
  `review_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_recommendation_code` (`recommendation_code`),
  KEY `idx_recommendation_metric_scope` (`metric_code`, `scope_type`, `scope_ref`(255), `status`),
  KEY `idx_recommendation_policy` (`current_policy_id`, `current_policy_source`),
  KEY `idx_recommendation_window` (`window_start`, `window_end`),
  KEY `idx_recommendation_time` (`create_time`, `review_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_event` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `event_code` VARCHAR(128) NOT NULL,
  `metric_code` VARCHAR(300) NOT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `instance_name` VARCHAR(255) DEFAULT NULL,
  `host_name` VARCHAR(255) DEFAULT NULL,
  `policy_id` BIGINT DEFAULT NULL,
  `policy_code` VARCHAR(128) DEFAULT NULL,
  `policy_version` INT DEFAULT NULL,
  `policy_source` VARCHAR(32) DEFAULT NULL,
  `event_level` VARCHAR(16) NOT NULL DEFAULT 'WARNING',
  `status` VARCHAR(32) NOT NULL DEFAULT 'PENDING',
  `match_direction` VARCHAR(16) DEFAULT NULL,
  `actual_value` VARCHAR(255) DEFAULT NULL,
  `effective_operator` VARCHAR(32) DEFAULT NULL,
  `effective_value1` VARCHAR(255) DEFAULT NULL,
  `effective_value2` VARCHAR(255) DEFAULT NULL,
  `effective_upper` DOUBLE DEFAULT NULL,
  `effective_lower` DOUBLE DEFAULT NULL,
  `sample_time` DATETIME DEFAULT NULL,
  `occurred_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `firing_at` DATETIME DEFAULT NULL,
  `acked_at` DATETIME DEFAULT NULL,
  `silenced_at` DATETIME DEFAULT NULL,
  `recovered_at` DATETIME DEFAULT NULL,
  `closed_at` DATETIME DEFAULT NULL,
  `suppressed` TINYINT(1) DEFAULT 0,
  `suppression_type` VARCHAR(32) DEFAULT NULL,
  `suppression_reason` VARCHAR(512) DEFAULT NULL,
  `suppressed_by_event_id` BIGINT DEFAULT NULL,
  `extra_info` TEXT,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_event_code` (`event_code`),
  KEY `idx_event_scope` (`scope_type`, `scope_ref`(255), `status`),
  KEY `idx_event_object` (`cluster_name`, `service_name`, `component_name`, `host_name`, `status`),
  KEY `idx_event_metric` (`metric_code`, `event_level`, `status`),
  KEY `idx_event_time` (`occurred_at`, `firing_at`, `recovered_at`),
  KEY `idx_event_suppressed` (`suppressed`, `suppression_type`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_event_action` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `action_code` VARCHAR(128) NOT NULL,
  `event_id` BIGINT NOT NULL,
  `event_code` VARCHAR(128) NOT NULL,
  `action_type` VARCHAR(32) NOT NULL,
  `action_status` VARCHAR(32) NOT NULL DEFAULT 'SUCCESS',
  `operator` VARCHAR(128) DEFAULT NULL,
  `reason` VARCHAR(1024) DEFAULT NULL,
  `action_content` TEXT,
  `linked_silence_id` BIGINT DEFAULT NULL,
  `linked_window_id` BIGINT DEFAULT NULL,
  `start_time` DATETIME DEFAULT NULL,
  `end_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_event_action_code` (`action_code`),
  KEY `idx_action_event` (`event_id`, `action_type`, `create_time`),
  KEY `idx_action_event_code` (`event_code`, `action_type`, `create_time`),
  KEY `idx_action_operator` (`operator`, `create_time`),
  KEY `idx_action_linked_silence` (`linked_silence_id`),
  KEY `idx_action_linked_window` (`linked_window_id`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_threshold_audit_log` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `target_type` VARCHAR(64) NOT NULL,
  `target_id` BIGINT DEFAULT NULL,
  `target_code` VARCHAR(128) DEFAULT NULL,
  `operation_type` VARCHAR(64) NOT NULL,
  `operator` VARCHAR(128) DEFAULT NULL,
  `before_value` LONGTEXT,
  `after_value` LONGTEXT,
  `remark` VARCHAR(512) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_audit_target` (`target_type`, `target_id`),
  KEY `idx_audit_code` (`target_code`),
  KEY `idx_audit_time` (`create_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_maintenance_window` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `window_code` VARCHAR(128) NOT NULL,
  `window_name` VARCHAR(255) NOT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `start_time` DATETIME NOT NULL,
  `end_time` DATETIME NOT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `description` TEXT,
  `create_by` VARCHAR(128) DEFAULT NULL,
  `update_by` VARCHAR(128) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_window_code` (`window_code`),
  KEY `idx_window_scope` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_window_time` (`start_time`, `end_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_silence_rule` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `silence_code` VARCHAR(128) NOT NULL,
  `silence_name` VARCHAR(255) NOT NULL,
  `metric_code` VARCHAR(300) DEFAULT NULL,
  `scope_type` VARCHAR(32) NOT NULL,
  `scope_ref` VARCHAR(512) NOT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `event_level` VARCHAR(16) DEFAULT NULL,
  `silence_mode` VARCHAR(32) NOT NULL DEFAULT 'SUPPRESS_NOTIFY',
  `start_time` DATETIME NOT NULL,
  `end_time` DATETIME NOT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `description` TEXT,
  `create_by` VARCHAR(128) DEFAULT NULL,
  `update_by` VARCHAR(128) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_silence_code` (`silence_code`),
  KEY `idx_silence_scope` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_silence_metric` (`metric_code`, `event_level`),
  KEY `idx_silence_time` (`start_time`, `end_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_ha_lock` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `lock_name` VARCHAR(128) NOT NULL,
  `owner_id` VARCHAR(255) DEFAULT NULL,
  `lock_token` VARCHAR(64) DEFAULT NULL,
  `lock_until` DATETIME NOT NULL,
  `last_heartbeat_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_monitor_ha_lock_name` (`lock_name`),
  KEY `idx_monitor_ha_lock_until` (`lock_until`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_metric_dedupe_key` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `dedupe_hash` CHAR(40) NOT NULL,
  `dedupe_key` VARCHAR(1024) NOT NULL,
  `expire_time` DATETIME NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_dedupe_hash` (`dedupe_hash`),
  KEY `idx_metric_dedupe_expire_time` (`expire_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_metric_ingest_batch` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `component_name` VARCHAR(64) NOT NULL,
  `cluster_name` VARCHAR(128) NOT NULL,
  `source_job` VARCHAR(128) NOT NULL,
  `batch_id` VARCHAR(128) NOT NULL,
  `request_hash` VARCHAR(64) DEFAULT NULL,
  `status` VARCHAR(32) NOT NULL DEFAULT 'PROCESSING',
  `accepted_count` INT NOT NULL DEFAULT 0,
  `ignored_count` INT NOT NULL DEFAULT 0,
  `message` VARCHAR(512) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_ingest_batch` (`component_name`, `cluster_name`, `source_job`, `batch_id`),
  KEY `idx_metric_ingest_batch_status` (`status`, `update_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_baseline` (
  `id`             BIGINT       NOT NULL AUTO_INCREMENT,
  `metric_name`    VARCHAR(128) NOT NULL,
  `cluster_name`   VARCHAR(128) DEFAULT NULL,
  `host_name`      VARCHAR(255) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `instance_name`  VARCHAR(255) DEFAULT NULL,
  `time_slot_hour` TINYINT      NOT NULL,
  `day_of_week`    TINYINT      NOT NULL,
  `mean_value`     DOUBLE       DEFAULT NULL,
  `stddev`         DOUBLE       DEFAULT NULL,
  `upper_bound`    DOUBLE       DEFAULT NULL,
  `lower_bound`    DOUBLE       DEFAULT NULL,
  `sample_count`   INT          DEFAULT NULL,
  `computed_at`    DATETIME     DEFAULT NULL,
  `create_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_baseline_metric_host` (`metric_name`, `host_name`),
  KEY `idx_baseline_metric_slot` (`metric_name`, `time_slot_hour`, `day_of_week`),
  KEY `idx_baseline_cluster`     (`cluster_name`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_anomaly_event` (
  `id`               BIGINT       NOT NULL AUTO_INCREMENT,
  `metric_name`      VARCHAR(128) NOT NULL,
  `cluster_name`     VARCHAR(128) DEFAULT NULL,
  `host_name`        VARCHAR(255) DEFAULT NULL,
  `component_name`   VARCHAR(128) DEFAULT NULL,
  `instance_name`    VARCHAR(255) DEFAULT NULL,
  `current_value`    DOUBLE       DEFAULT NULL,
  `expected_value`   DOUBLE       DEFAULT NULL,
  `baseline_upper`   DOUBLE       DEFAULT NULL,
  `baseline_lower`   DOUBLE       DEFAULT NULL,
  `anomaly_score`    DOUBLE       DEFAULT NULL,
  `detection_method` VARCHAR(32)  DEFAULT NULL,
  `status`           VARCHAR(16)  NOT NULL DEFAULT 'ACTIVE',
  `severity`         VARCHAR(16)  DEFAULT 'WARNING',
  `fingerprint`      VARCHAR(255) NOT NULL,
  `detected_at`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `resolved_at`      DATETIME     DEFAULT NULL,
  `create_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_anomaly_fingerprint_status` (`fingerprint`, `status`),
  KEY `idx_anomaly_metric_host`        (`metric_name`, `host_name`),
  KEY `idx_anomaly_cluster`            (`cluster_name`),
  KEY `idx_anomaly_detected_at`        (`detected_at`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_capacity_forecast` (
  `id`                        BIGINT       NOT NULL AUTO_INCREMENT,
  `metric_name`               VARCHAR(128) NOT NULL,
  `cluster_name`              VARCHAR(128) DEFAULT NULL,
  `host_name`                 VARCHAR(255) DEFAULT NULL,
  `dimension`                 VARCHAR(255) DEFAULT NULL,
  `current_value`             DOUBLE       DEFAULT NULL,
  `capacity_max`              DOUBLE       DEFAULT NULL,
  `usage_percent`             DOUBLE       DEFAULT NULL,
  `growth_rate_per_hour`      DOUBLE       DEFAULT NULL,
  `r2_score`                  DOUBLE       DEFAULT NULL,
  `predicted_exhaustion_time` DATETIME     DEFAULT NULL,
  `days_remaining`            DOUBLE       DEFAULT NULL,
  `severity`                  VARCHAR(16)  DEFAULT 'INFO',
  `sample_count`              INT          DEFAULT NULL,
  `forecasted_at`             DATETIME     DEFAULT NULL,
  `create_time`               DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time`               DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_forecast_metric_host`   (`metric_name`, `host_name`),
  KEY `idx_forecast_cluster`       (`cluster_name`),
  KEY `idx_forecast_severity`      (`severity`),
  KEY `idx_forecast_days`          (`days_remaining`),
  KEY `idx_forecast_forecasted_at` (`forecasted_at`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_channel` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `channel_code` VARCHAR(64) NOT NULL,
  `channel_name` VARCHAR(128) NOT NULL,
  `channel_type` VARCHAR(32) NOT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `config_json` TEXT NOT NULL,
  `description` VARCHAR(512) DEFAULT NULL,
  `sort_order` INT DEFAULT 0,
  `create_by` VARCHAR(64) DEFAULT NULL,
  `update_by` VARCHAR(64) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_channel_code` (`channel_code`),
  KEY `idx_channel_type` (`channel_type`, `enabled`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_route` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `route_code` VARCHAR(64) NOT NULL,
  `route_name` VARCHAR(128) NOT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `event_type` VARCHAR(32) NOT NULL DEFAULT 'THRESHOLD',
  `event_source_filter` VARCHAR(128) DEFAULT NULL,
  `severity_filter` VARCHAR(128) DEFAULT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `scope_type` VARCHAR(32) DEFAULT NULL,
  `route_priority` INT NOT NULL DEFAULT 100,
  `channel_codes` TEXT,
  `description` VARCHAR(512) DEFAULT NULL,
  `create_by` VARCHAR(64) DEFAULT NULL,
  `update_by` VARCHAR(64) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_notification_route_code` (`route_code`),
  KEY `idx_notification_route_match` (`enabled`, `event_type`, `route_priority`),
  KEY `idx_notification_route_cluster` (`cluster_name`, `enabled`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_route_subject` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `route_id` BIGINT NOT NULL,
  `subject_type` VARCHAR(32) NOT NULL,
  `subject_ref` VARCHAR(128) DEFAULT NULL,
  `subject_name` VARCHAR(128) DEFAULT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_route_subject_route` (`route_id`, `enabled`),
  KEY `idx_route_subject_ref` (`subject_type`, `subject_ref`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_duty_group` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `group_code` VARCHAR(64) NOT NULL,
  `group_name` VARCHAR(128) NOT NULL,
  `enabled` TINYINT(1) NOT NULL DEFAULT 1,
  `members_json` TEXT,
  `description` VARCHAR(512) DEFAULT NULL,
  `create_by` VARCHAR(64) DEFAULT NULL,
  `update_by` VARCHAR(64) DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_duty_group_code` (`group_code`),
  KEY `idx_duty_group_enabled` (`enabled`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_history` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `alert_event_id` BIGINT DEFAULT NULL,
  `event_id` BIGINT DEFAULT NULL,
  `event_code` VARCHAR(64) DEFAULT NULL,
  `event_type` VARCHAR(32) DEFAULT NULL,
  `channel_id` BIGINT NOT NULL,
  `channel_type` VARCHAR(32) NOT NULL,
  `channel_code` VARCHAR(64) DEFAULT NULL,
  `channel_name` VARCHAR(128) DEFAULT NULL,
  `route_id` BIGINT DEFAULT NULL,
  `route_code` VARCHAR(64) DEFAULT NULL,
  `route_name` VARCHAR(128) DEFAULT NULL,
  `subject_type` VARCHAR(32) DEFAULT NULL,
  `subject_ref` VARCHAR(128) DEFAULT NULL,
  `subject_name` VARCHAR(128) DEFAULT NULL,
  `receiver_user` VARCHAR(128) DEFAULT NULL,
  `alert_title` VARCHAR(255) DEFAULT NULL,
  `alert_summary` TEXT,
  `alert_severity` VARCHAR(32) DEFAULT NULL,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `instance_name` VARCHAR(255) DEFAULT NULL,
  `status` VARCHAR(16) NOT NULL,
  `send_time` DATETIME DEFAULT NULL,
  `error_message` TEXT,
  `request_time` DATETIME DEFAULT NULL,
  `response_time` DATETIME DEFAULT NULL,
  `response_time_ms` BIGINT DEFAULT NULL,
  `cost_ms` INT DEFAULT NULL,
  `request_content` TEXT,
  `response_content` TEXT,
  `retry_count` INT DEFAULT 0,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_event` (`event_id`, `event_type`),
  KEY `idx_alert_event` (`alert_event_id`),
  KEY `idx_channel` (`channel_id`, `request_time`),
  KEY `idx_status` (`status`, `request_time`),
  KEY `idx_history_cluster_status` (`cluster_name`, `status`, `send_time`),
  KEY `idx_history_route_subject` (`route_code`, `subject_type`, `subject_ref`),
  KEY `idx_history_send_time` (`send_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_notification_delivery` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `delivery_code` VARCHAR(64) NOT NULL,
  `notification_id` BIGINT DEFAULT NULL,
  `event_type` VARCHAR(32) NOT NULL,
  `event_id` BIGINT DEFAULT NULL,
  `event_code` VARCHAR(64) DEFAULT NULL,
  `route_id` BIGINT DEFAULT NULL,
  `route_code` VARCHAR(64) DEFAULT NULL,
  `route_name` VARCHAR(128) DEFAULT NULL,
  `channel_id` BIGINT DEFAULT NULL,
  `channel_code` VARCHAR(64) DEFAULT NULL,
  `subject_type` VARCHAR(32) DEFAULT NULL,
  `subject_ref` VARCHAR(128) DEFAULT NULL,
  `subject_name` VARCHAR(128) DEFAULT NULL,
  `receiver_user` VARCHAR(128) DEFAULT NULL,
  `delivery_status` VARCHAR(16) NOT NULL DEFAULT 'PENDING',
  `error_message` TEXT,
  `read_status` VARCHAR(16) NOT NULL DEFAULT 'UNREAD',
  `read_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_delivery_code` (`delivery_code`),
  KEY `idx_delivery_event` (`event_type`, `event_id`, `event_code`),
  KEY `idx_delivery_route_subject` (`route_code`, `subject_type`, `subject_ref`),
  KEY `idx_delivery_receiver` (`receiver_user`, `read_status`, `create_time`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_in_app_notification` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `notification_code` VARCHAR(64) NOT NULL,
  `event_type` VARCHAR(32) NOT NULL,
  `event_id` BIGINT DEFAULT NULL,
  `event_code` VARCHAR(64) DEFAULT NULL,
  `channel_id` BIGINT DEFAULT NULL,
  `channel_code` VARCHAR(64) DEFAULT NULL,
  `route_id` BIGINT DEFAULT NULL,
  `route_code` VARCHAR(64) DEFAULT NULL,
  `route_name` VARCHAR(128) DEFAULT NULL,
  `cluster_name` VARCHAR(128) DEFAULT NULL,
  `service_name` VARCHAR(128) DEFAULT NULL,
  `component_name` VARCHAR(128) DEFAULT NULL,
  `instance_name` VARCHAR(255) DEFAULT NULL,
  `scope_type` VARCHAR(32) DEFAULT NULL,
  `scope_ref` VARCHAR(255) DEFAULT NULL,
  `scope_name` VARCHAR(255) DEFAULT NULL,
  `severity` VARCHAR(32) DEFAULT NULL,
  `title` VARCHAR(255) NOT NULL,
  `content` TEXT,
  `receiver_scope` VARCHAR(32) NOT NULL DEFAULT 'ADMIN',
  `receiver_user` VARCHAR(128) DEFAULT NULL,
  `subject_type` VARCHAR(32) DEFAULT NULL,
  `subject_ref` VARCHAR(128) DEFAULT NULL,
  `subject_name` VARCHAR(128) DEFAULT NULL,
  `read_status` VARCHAR(16) NOT NULL DEFAULT 'UNREAD',
  `read_time` DATETIME DEFAULT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_in_app_code` (`notification_code`),
  KEY `idx_in_app_event` (`event_type`, `event_id`),
  KEY `idx_in_app_code` (`event_code`),
  KEY `idx_in_app_cluster_status` (`cluster_name`, `read_status`, `create_time`),
  KEY `idx_in_app_receiver` (`receiver_scope`, `receiver_user`, `read_status`),
  KEY `idx_in_app_subject` (`subject_type`, `subject_ref`, `read_status`)
) DEFAULT CHARSET = utf8mb4;

INSERT INTO `monitor_notification_channel` (`channel_code`, `channel_name`, `channel_type`, `enabled`, `config_json`, `description`, `sort_order`)
VALUES
('default-in-app', '默认站内信', 'IN_APP', 1, '{"template":"default"}', '消息中心内置站内信通道,不支持删除', 0),
('default-wechat', '默认企业微信', 'WECHAT', 0, '{"webhookUrl":"","msgType":"markdown","mentionedMobileList":[]}', '默认企业微信通知渠道', 1),
('default-dingtalk', '默认钉钉', 'DINGTALK', 0, '{"webhookUrl":"","secret":"","msgType":"markdown","atMobiles":[],"atUserIds":[],"atAll":false}', '默认钉钉通知渠道', 2),
('default-feishu', '默认飞书', 'FEISHU', 0, '{"webhookUrl":"","secret":"","msgType":"post","atAll":false}', '默认飞书通知渠道', 3),
('default-email', '默认邮件', 'EMAIL', 0, '{"host":"","port":587,"username":"","password":"","from":"","to":""}', '默认邮件通知渠道', 4),
('default-webhook', '默认Webhook', 'WEBHOOK', 0, '{"url":""}', '默认Webhook通知渠道', 5)
ON DUPLICATE KEY UPDATE
  `channel_name` = VALUES(`channel_name`),
  `channel_type` = VALUES(`channel_type`),
  `config_json` = CASE
    WHEN `channel_code` = 'default-in-app' THEN VALUES(`config_json`)
    ELSE `config_json`
  END,
  `description` = VALUES(`description`),
  `sort_order` = VALUES(`sort_order`);

INSERT INTO `monitor_notification_duty_group` (`group_code`, `group_name`, `enabled`, `members_json`, `description`)
VALUES
('platform-alert-duty', '平台告警值班组', 1, '["admin"]', '默认静态值班组,可在通知配置中调整成员')
ON DUPLICATE KEY UPDATE
  `group_name` = VALUES(`group_name`),
  `enabled` = VALUES(`enabled`),
  `members_json` = CASE
    WHEN `members_json` IS NULL OR `members_json` = '' OR `members_json` = '[]' THEN VALUES(`members_json`)
    ELSE `members_json`
  END,
  `description` = VALUES(`description`);

INSERT INTO `monitor_notification_route` (`route_code`, `route_name`, `enabled`, `cluster_name`, `event_type`, `event_source_filter`, `severity_filter`, `service_name`, `component_name`, `scope_type`, `route_priority`, `channel_codes`, `description`)
VALUES
('default-critical-alert-route', '严重阈值告警通知集群管理员', 1, '*', 'THRESHOLD', 'THRESHOLD_ENGINE', 'CRITICAL', '*', '*', '*', 10, '["default-in-app"]', '严重阈值告警默认写入集群管理员站内信'),
('default-warning-alert-route', '警告阈值告警通知集群管理员', 1, '*', 'THRESHOLD', 'THRESHOLD_ENGINE', 'WARNING', '*', '*', '*', 20, '["default-in-app"]', '警告阈值告警默认写入集群管理员站内信'),
('default-official-critical-alert-route', '严重内置健康告警通知集群管理员', 1, '*', 'ALERT', 'AMBARI_OFFICIAL', 'CRITICAL', '*', '*', '*', 30, '["default-in-app"]', '严重内置健康告警默认写入集群管理员站内信'),
('default-official-warning-alert-route', '警告内置健康告警通知集群管理员', 1, '*', 'ALERT', 'AMBARI_OFFICIAL', 'WARNING', '*', '*', '*', 40, '["default-in-app"]', '警告内置健康告警默认写入集群管理员站内信')
ON DUPLICATE KEY UPDATE
  `route_name` = VALUES(`route_name`),
  `enabled` = VALUES(`enabled`),
  `event_type` = VALUES(`event_type`),
  `event_source_filter` = VALUES(`event_source_filter`),
  `severity_filter` = VALUES(`severity_filter`),
  `route_priority` = VALUES(`route_priority`),
  `channel_codes` = VALUES(`channel_codes`),
  `description` = VALUES(`description`);

INSERT INTO `monitor_notification_route_subject` (`route_id`, `subject_type`, `subject_ref`, `subject_name`, `enabled`)
SELECT r.id, 'CLUSTER_ADMIN', 'CLUSTER.ADMINISTRATOR', '集群管理员', 1
FROM `monitor_notification_route` r
WHERE r.route_code IN (
    'default-critical-alert-route',
    'default-warning-alert-route',
    'default-official-critical-alert-route',
    'default-official-warning-alert-route'
  )
  AND NOT EXISTS (
    SELECT 1 FROM `monitor_notification_route_subject` s
    WHERE s.route_id = r.id AND s.subject_type = 'CLUSTER_ADMIN' AND s.subject_ref = 'CLUSTER.ADMINISTRATOR'
  );

INSERT INTO `monitor_metric_definition` (
  `metric_code`, `metric_name`, `metric_group`, `priority`, `sub_group`, `unit`, `metric_type`,
  `metric_kind`, `service_name`, `component_name`, `compute_type`, `source_profile`, `ingest_status`,
  `stability_status`, `value_type`, `aggregation_mode`, `default_chart_type`, `display_order`,
  `enable_fixed_threshold`, `enable_smart_threshold`, `enable_alert`, `enable_health_score`,
  `health_score_weight`, `description`, `extra_info`
)
VALUES
('tt_cpu_usage_percent', 'cpu_usage_percent', 'host', 'P0', 'cpu', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 101, 1, 1, 1, 1, 8, '主机 CPU 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_cpu_iowait', 'cpu_iowait', 'host', 'P0', 'cpu', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 102, 1, 1, 1, 1, 6, '主机 CPU iowait 占比', '{"seedVersion":"3.0.1-P0"}'),
('tt_load_per_cpu', 'load_per_cpu', 'host', 'P0', 'cpu', '', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 103, 1, 1, 1, 1, 6, '主机单核平均负载', '{"seedVersion":"3.0.1-P0"}'),
('tt_mem_usage_percent', 'mem_usage_percent', 'host', 'P0', 'memory', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 111, 1, 1, 1, 1, 8, '主机内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_swap_usage_percent', 'swap_usage_percent', 'host', 'P0', 'memory', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 112, 1, 1, 1, 1, 5, '主机 swap 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_disk_usage_percent', 'disk_usage_percent', 'host', 'P0', 'disk', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 121, 1, 1, 1, 1, 10, '主机磁盘使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_net_error_packets_per_sec', 'net_error_packets_per_sec', 'host', 'P0', 'network', '个/s', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'SUM', 'LINE', 126, 1, 1, 1, 1, 6, '主机网络错误包速率', '{"seedVersion":"3.0.1-P0"}'),
('tt_net_drop_packets_per_sec', 'net_drop_packets_per_sec', 'host', 'P0', 'network', '个/s', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'SUM', 'LINE', 127, 1, 1, 1, 1, 6, '主机网络丢包速率', '{"seedVersion":"3.0.1-P0"}'),
('tt_process_count', 'process_count', 'host', 'P0', 'process', '个', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 129, 1, 1, 1, 1, 4, '主机进程数', '{"seedVersion":"3.0.1-P0"}'),
('tt_thread_count', 'thread_count', 'host', 'P0', 'process', '个', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 130, 1, 1, 1, 1, 4, '主机线程数', '{"seedVersion":"3.0.1-P0"}'),
('tt_fd_usage_percent', 'fd_usage_percent', 'host', 'P0', 'process', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 131, 1, 1, 1, 1, 5, '进程文件句柄使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_jvm_heap_usage_percent', 'jvm_heap_usage_percent', 'jvm', 'P0', 'heap', '%', 'GAUGE', 'COLLECTED', NULL, NULL, 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 201, 1, 1, 1, 1, 8, '组件 JVM Heap 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_jvm_gc_collection_time_ms', 'jvm_gc_collection_time_ms', 'jvm', 'P0', 'gc', 'ms', 'GAUGE', 'COLLECTED', NULL, NULL, 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 202, 1, 1, 1, 1, 5, '组件 JVM GC 耗时', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_namenode_in_safe_mode', 'hdfs_namenode_in_safe_mode', 'hdfs', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'HDFS', 'NAMENODE', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 301, 1, 0, 1, 1, 10, 'HDFS NameNode 安全模式状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_datanode_bp_service_alive', 'hdfs_datanode_bp_service_alive', 'hdfs', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'HDFS', 'DATANODE', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 302, 1, 0, 1, 1, 10, 'HDFS DataNode BP 服务可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_zkfc_health_monitor_up', 'hdfs_zkfc_health_monitor_up', 'hdfs', 'P0', 'ha', '', 'STATE', 'COLLECTED', 'HDFS', 'ZKFC', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 303, 1, 0, 1, 1, 8, 'HDFS ZKFC 健康监控可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_resourcemanager_up', 'yarn_resourcemanager_up', 'yarn', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'YARN', 'RESOURCEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 401, 1, 0, 1, 1, 10, 'YARN ResourceManager 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_resourcemanager_memory_used_percent', 'yarn_resourcemanager_memory_used_percent', 'yarn', 'P0', 'capacity', '%', 'GAUGE', 'COLLECTED', 'YARN', 'RESOURCEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 402, 1, 1, 1, 1, 7, 'YARN ResourceManager 内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_nodemanager_up', 'yarn_nodemanager_up', 'yarn', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'YARN', 'NODEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 403, 1, 0, 1, 1, 10, 'YARN NodeManager 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_nodemanager_memory_used_percent', 'yarn_nodemanager_memory_used_percent', 'yarn', 'P0', 'capacity', '%', 'GAUGE', 'COLLECTED', 'YARN', 'NODEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 404, 1, 1, 1, 1, 7, 'YARN NodeManager 内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_broker_up', 'kafka_broker_up', 'kafka', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'KAFKA', 'KAFKA_BROKER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 501, 1, 0, 1, 1, 10, 'Kafka Broker 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_disk_used_percent', 'kafka_disk_used_percent', 'kafka', 'P0', 'capacity', '%', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 502, 1, 1, 1, 1, 9, 'Kafka Broker 磁盘使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_cluster_under_replicated_partitions', 'kafka_cluster_under_replicated_partitions', 'kafka', 'P0', 'replica', '个', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'MAX', 'LINE', 503, 1, 1, 1, 1, 10, 'Kafka 未完全复制分区数', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_cluster_offline_partitions', 'kafka_cluster_offline_partitions', 'kafka', 'P0', 'replica', '个', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'MAX', 'LINE', 504, 1, 0, 1, 1, 10, 'Kafka 离线分区数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_platform_api_up', 'ambari_plus_monitor_platform_api_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_PLATFORM_API', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 601, 1, 0, 1, 1, 10, 'Monitor Platform API 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_ingester_up', 'ambari_plus_monitor_ingester_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_INGESTER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 602, 1, 0, 1, 1, 10, 'Monitor Ingester 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_rule_engine_up', 'ambari_plus_monitor_rule_engine_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_RULE_ENGINE', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 603, 1, 0, 1, 1, 10, 'Monitor Rule Engine 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_notification_failure_count', 'ambari_plus_monitor_notification_failure_count', 'ambari-plus-monitor', 'P0', 'self', '次', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 604, 1, 1, 1, 1, 8, 'Monitor 通知失败数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_agent_failed_batch_count', 'ambari_plus_monitor_agent_failed_batch_count', 'ambari-plus-monitor', 'P0', 'self', '次', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 605, 1, 1, 1, 1, 8, 'Monitor Agent 失败批次数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_ingester_failed_metric_count', 'ambari_plus_monitor_ingester_failed_metric_count', 'ambari-plus-monitor', 'P0', 'self', '条', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 606, 1, 1, 1, 1, 8, 'Monitor Ingester 写入失败指标数', '{"seedVersion":"3.0.1-P0"}')
ON DUPLICATE KEY UPDATE
  `metric_group` = VALUES(`metric_group`),
  `priority` = VALUES(`priority`),
  `sub_group` = VALUES(`sub_group`),
  `unit` = VALUES(`unit`),
  `metric_type` = VALUES(`metric_type`),
  `metric_kind` = VALUES(`metric_kind`),
  `service_name` = VALUES(`service_name`),
  `component_name` = VALUES(`component_name`),
  `source_profile` = VALUES(`source_profile`),
  `stability_status` = VALUES(`stability_status`),
  `enable_fixed_threshold` = VALUES(`enable_fixed_threshold`),
  `enable_smart_threshold` = VALUES(`enable_smart_threshold`),
  `enable_alert` = VALUES(`enable_alert`),
  `enable_health_score` = VALUES(`enable_health_score`),
  `health_score_weight` = VALUES(`health_score_weight`),
  `description` = VALUES(`description`),
  `extra_info` = VALUES(`extra_info`);

UPDATE `monitor_metric_definition`
SET `display_name` = `description`,
    `metadata_status` = 'VERIFIED',
    `metadata_source` = 'BUILT_IN'
WHERE `extra_info` LIKE '%"seedVersion":"3.0.1-P0"%';

CREATE TABLE IF NOT EXISTS `monitor_ha_failover_event` (
  `id`               BIGINT       NOT NULL AUTO_INCREMENT,
  `cluster_id`       BIGINT       NOT NULL,
  `service_name`     VARCHAR(64)  NOT NULL,
  `component_name`   VARCHAR(64)  NOT NULL,
  `instance_name`    VARCHAR(128) NOT NULL,
  `host_name`        VARCHAR(255) NOT NULL,
  `previous_state`   VARCHAR(32)  DEFAULT NULL,
  `current_state`    VARCHAR(32)  NOT NULL,
  `event_type`       VARCHAR(32)  NOT NULL,
  `failover_reason`  VARCHAR(128) DEFAULT NULL,
  `start_time`       DATETIME     NOT NULL,
  `end_time`         DATETIME     DEFAULT NULL,
  `duration_ms`      BIGINT       DEFAULT NULL,
  `success`          TINYINT      DEFAULT 1,
  `failure_reason`   VARCHAR(512) DEFAULT NULL,
  `zkfc_involved`    TINYINT      DEFAULT 1,
  `journal_node_sync_status` VARCHAR(32) DEFAULT NULL,
  `last_tx_id_before` BIGINT      DEFAULT NULL,
  `last_tx_id_after`  BIGINT      DEFAULT NULL,
  `extra_info`       TEXT         DEFAULT NULL,
  `create_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_ha_cluster_service`   (`cluster_id`, `service_name`),
  KEY `idx_ha_instance`          (`instance_name`, `host_name`),
  KEY `idx_ha_start_time`        (`start_time`),
  KEY `idx_ha_event_type`        (`event_type`, `failover_reason`)
) DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_hdfs_directory_snapshot` (
    `id`              BIGINT      NOT NULL AUTO_INCREMENT,
    `cluster_name`    VARCHAR(128) NOT NULL,
    `path`            VARCHAR(512) NOT NULL,
    `owner`           VARCHAR(128),
    `group_name`      VARCHAR(128),
    `file_count`      BIGINT       DEFAULT 0,
    `directory_count` BIGINT       DEFAULT 0,
    `total_bytes`     BIGINT       DEFAULT 0,
    `space_consumed`  BIGINT       DEFAULT 0,
    `quota`           BIGINT       DEFAULT -1,
    `space_quota`     BIGINT       DEFAULT -1,
    `prev_total_bytes` BIGINT,
    `prev_analyzed_at` DATETIME,
    `analyzed_at`     DATETIME     NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_cluster_path`       (`cluster_name`, `path`),
    KEY `idx_cluster_bytes_desc`       (`cluster_name`, `total_bytes` DESC),
    KEY `idx_cluster_files_desc`       (`cluster_name`, `file_count` DESC),
    KEY `idx_cluster_analyzed`         (`cluster_name`, `analyzed_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_hdfs_trash_snapshot` (
    `id`               BIGINT      NOT NULL AUTO_INCREMENT,
    `cluster_name`     VARCHAR(128) NOT NULL,
    `username`         VARCHAR(128) NOT NULL,
    `trash_size_bytes` BIGINT       DEFAULT 0,
    `file_count`       BIGINT       DEFAULT 0,
    `oldest_item_ms`   BIGINT,
    `analyzed_at`      DATETIME     NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_cluster_user`        (`cluster_name`, `username`),
    KEY `idx_cluster_size_desc`         (`cluster_name`, `trash_size_bytes` DESC),
    KEY `idx_cluster_analyzed`          (`cluster_name`, `analyzed_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_hdfs_offline_analysis_record` (
    `id`             BIGINT       NOT NULL AUTO_INCREMENT,
    `cluster_name`   VARCHAR(128) NOT NULL,
    `record_type`    VARCHAR(64)  NOT NULL,
    `record_key`     VARCHAR(512) NOT NULL,
    `record_hash`    CHAR(40)     NOT NULL,
    `path`           VARCHAR(1024),
    `host_name`      VARCHAR(255),
    `owner`          VARCHAR(128),
    `risk_level`     VARCHAR(32),
    `numeric_value`  DOUBLE,
    `payload_json`   MEDIUMTEXT,
    `source_job`     VARCHAR(128),
    `batch_id`       VARCHAR(128),
    `analyzed_at`    DATETIME     NOT NULL,
    `create_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `update_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_hdfs_offline_record` (`cluster_name`, `record_type`, `record_hash`),
    KEY `idx_hdfs_offline_latest`       (`cluster_name`, `record_type`, `analyzed_at`),
    KEY `idx_hdfs_offline_numeric`      (`cluster_name`, `record_type`, `numeric_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

完成这一步后,再回到 Ambari Plus 页面安装 AMBARI_PLUS_MONITOR 服务。

#Ambari Plus Monitor#MySQL#MariaDB#初始化
IoTDB 安装与部署
Monitor 安装

← IoTDB 安装与部署 Monitor 安装→

最近更新
01
当前版本 2026/06
06-05
02
Step7—Mariadb初始化
03-23
03
【Kylin V10 aarch64】强力卸载脚本 aarch64
03-22
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式