Skip to content

OceanBase 集群健康检查

集群状态检查

1. 集群整体状态检查

sql
-- 检查集群状态
SELECT * FROM oceanbase.__all_cluster;

-- 检查 Zone 状态
SELECT * FROM oceanbase.__all_zone;

-- 检查集群版本
SELECT * FROM oceanbase.__all_cluster_config WHERE name = 'cluster_version';

2. 节点状态检查

sql
-- 检查所有节点状态
SELECT * FROM oceanbase.__all_server;

-- 检查节点资源使用情况
SELECT * FROM oceanbase.__all_virtual_server_stat;

-- 检查节点负载
SELECT * FROM oceanbase.__all_virtual_sys_resource_mgr WHERE svr_ip = 'xxx.xxx.xxx.xxx';

3. RootService 状态检查

sql
-- 检查 RootService 状态
SELECT * FROM oceanbase.__all_rootservice_info;

-- 检查 RootService 事件历史
SELECT * FROM oceanbase.__all_rootservice_event_history ORDER BY gmt_create DESC LIMIT 10;

4. 租户状态检查

sql
-- 检查所有租户状态
SELECT * FROM oceanbase.__all_tenant;

-- 检查租户资源使用情况
SELECT * FROM oceanbase.__all_virtual_tenant_stat;

-- 检查租户变量
SELECT * FROM oceanbase.__all_tenant_variable;

性能指标检查

1. CPU 使用率检查

sql
-- 检查节点 CPU 使用率
SELECT svr_ip, svr_port, cpu_total, cpu_assigned, cpu_used FROM oceanbase.__all_virtual_server_stat;

-- 检查租户 CPU 使用率
SELECT tenant_id, tenant_name, cpu_used, cpu_assigned FROM oceanbase.__all_virtual_tenant_stat;

2. 内存使用率检查

sql
-- 检查节点内存使用情况
SELECT svr_ip, svr_port, mem_total, mem_assigned, mem_used FROM oceanbase.__all_virtual_server_stat;

-- 检查租户内存使用情况
SELECT tenant_id, tenant_name, mem_used, mem_limit FROM oceanbase.__all_virtual_tenant_stat;

-- 检查 MemTable 内存使用情况
SELECT svr_ip, svr_port, memtable_count, memtable_usage FROM oceanbase.__all_virtual_memtable_info;

3. 磁盘使用率检查

sql
-- 检查节点磁盘使用情况
SELECT * FROM oceanbase.__all_virtual_disk_stat;

-- 检查数据文件使用情况
SELECT * FROM oceanbase.__all_virtual_partition_file_stat;

-- 检查日志磁盘使用情况
SELECT svr_ip, svr_port, log_disk_total, log_disk_used FROM oceanbase.__all_virtual_server_stat;

4. 网络状态检查

sql
-- 检查节点网络状态
SELECT * FROM oceanbase.__all_virtual_network_io_stat;

-- 检查 RPC 连接状态
SELECT * FROM oceanbase.__all_virtual_rpc_stat;

-- 检查复制状态
SELECT * FROM oceanbase.__all_virtual_log_stat;

资源使用检查

1. 资源池检查

sql
-- 检查资源池配置
SELECT * FROM oceanbase.__all_resource_pool;

-- 检查资源单元配置
SELECT * FROM oceanbase.__all_resource_unit_config;

-- 检查资源池分配情况
SELECT * FROM oceanbase.__all_resource_pool_tenant;

2. 租户资源使用检查

sql
-- 检查租户资源使用情况
SELECT tenant_id, tenant_name, cpu_used, mem_used, log_disk_used FROM oceanbase.__all_virtual_tenant_stat;

-- 检查租户连接数
SELECT tenant_id, tenant_name, current_conn, max_conn FROM oceanbase.__all_virtual_tenant_conn_stat;

-- 检查租户 SQL 执行情况
SELECT tenant_id, tenant_name, total_request_count, slow_query_count FROM oceanbase.__all_virtual_tenant_stat;

3. 会话和连接检查

sql
-- 检查当前会话
SHOW PROCESSLIST;

-- 检查长时间运行的会话
SELECT * FROM oceanbase.__all_virtual_processlist WHERE time > 60;

-- 检查连接数统计
SELECT * FROM oceanbase.__all_virtual_sys_variable WHERE name LIKE '%max_connections%';

数据一致性检查

1. 副本状态检查

sql
-- 检查分区副本状态
SELECT * FROM oceanbase.__all_virtual_partition_info WHERE status != 'NORMAL';

-- 检查副本同步状态
SELECT * FROM oceanbase.__all_virtual_log_stat WHERE role = 'F';

-- 检查副本延迟
SELECT * FROM oceanbase.__all_virtual_log_restore_status;

2. 数据完整性检查

sql
-- 检查表完整性
CHECK TABLE table_name;

-- 检查索引完整性
ANALYZE TABLE table_name CHECK INDEX;

-- 检查分区表完整性
SELECT * FROM oceanbase.__all_virtual_partition_checksum;

3. 一致性哈希检查

sql
-- 检查一致性哈希分布
SELECT * FROM oceanbase.__all_virtual_bucket;

-- 检查分区分布
SELECT * FROM oceanbase.__all_virtual_partition_distribution;

日志和告警检查

1. 系统日志检查

bash
# 查看 Observer 主日志
tail -n 100 /home/oceanbase/log/observer.log

# 查看 RootService 日志
tail -n 100 /home/oceanbase/log/rootservice.log

# 查看选举日志
tail -n 100 /home/oceanbase/log/election.log

# 查看错误日志
grep -i error /home/oceanbase/log/observer.log | tail -n 50

2. 慢查询日志检查

sql
-- 查看慢查询设置
SHOW VARIABLES LIKE '%slow_query%';

-- 查看慢查询日志
SELECT * FROM oceanbase.__all_virtual_slow_query WHERE tenant_id = 1001 ORDER BY query_time DESC LIMIT 10;

3. 告警信息检查

sql
-- 检查告警配置
SELECT * FROM oceanbase.__all_alarm_config;

-- 检查告警历史
SELECT * FROM oceanbase.__all_alarm_history ORDER BY gmt_create DESC LIMIT 10;

-- 检查当前告警
SELECT * FROM oceanbase.__all_virtual_alarm_current;

自动化健康检查脚本

1. 基础健康检查脚本

创建 ob-health-check.sh 脚本:

bash
#!/bin/bash

# OceanBase 集群健康检查脚本

# 配置信息
OB_HOST="127.0.0.1"
OB_PORT=2881
OB_USER="root@sys"
OB_PASS="root@123"

# 检查时间
CHECK_TIME=$(date +"%Y-%m-%d %H:%M:%S")

# 输出文件
OUTPUT_FILE="ob-health-check-$(date +"%Y%m%d-%H%M%S").log"

# 执行 SQL 查询函数
execute_sql() {
    local sql="$1"
    mysql -h${OB_HOST} -P${OB_PORT} -u${OB_USER} -p"${OB_PASS}" -A oceanbase -e "${sql}"
}

# 写入输出文件
write_output() {
    local content="$1"
    echo "${content}" >> ${OUTPUT_FILE}
}

# 开始检查
write_output "========================================"
write_output "OceanBase 集群健康检查报告"
write_output "检查时间: ${CHECK_TIME}"
write_output "========================================"

# 1. 集群状态检查
write_output "\n1. 集群状态检查:"
write_output "-------------------"
execute_sql "SELECT cluster_id, cluster_name, status FROM oceanbase.__all_cluster;" >> ${OUTPUT_FILE}

# 2. Zone 状态检查
write_output "\n2. Zone 状态检查:"
write_output "-------------------"
execute_sql "SELECT zone, zone_type, status, active FROM oceanbase.__all_zone;" >> ${OUTPUT_FILE}

# 3. 节点状态检查
write_output "\n3. 节点状态检查:"
write_output "-------------------"
execute_sql "SELECT svr_ip, svr_port, zone, status, version FROM oceanbase.__all_server;" >> ${OUTPUT_FILE}

# 4. 资源使用检查
write_output "\n4. 资源使用检查:"
write_output "-------------------"
execute_sql "SELECT svr_ip, svr_port, cpu_total, cpu_assigned, cpu_used, mem_total, mem_assigned, mem_used, log_disk_total, log_disk_used FROM oceanbase.__all_virtual_server_stat;" >> ${OUTPUT_FILE}

# 5. 租户状态检查
write_output "\n5. 租户状态检查:"
write_output "-------------------"
execute_sql "SELECT tenant_id, tenant_name, status, primary_zone FROM oceanbase.__all_tenant;" >> ${OUTPUT_FILE}

# 6. 副本状态检查
write_output "\n6. 副本状态检查:"
write_output "-------------------"
execute_sql "SELECT count(*) as total_replicas, sum(CASE WHEN status = 'NORMAL' THEN 1 ELSE 0 END) as normal_replicas FROM oceanbase.__all_virtual_partition_info;" >> ${OUTPUT_FILE}

# 7. 慢查询检查
write_output "\n7. 慢查询检查:"
write_output "-------------------"
execute_sql "SELECT count(*) as slow_query_count FROM oceanbase.__all_virtual_slow_query WHERE gmt_create >= DATE_SUB(NOW(), INTERVAL 1 HOUR);" >> ${OUTPUT_FILE}

# 8. 告警检查
write_output "\n8. 告警检查:"
write_output "-------------------"
execute_sql "SELECT count(*) as alarm_count FROM oceanbase.__all_virtual_alarm_current;" >> ${OUTPUT_FILE}

# 结束检查
write_output "\n========================================"
write_output "健康检查完成!"
write_output "报告文件: ${OUTPUT_FILE}"
write_output "========================================"

echo "健康检查完成! 报告文件: ${OUTPUT_FILE}"

2. 高级健康检查脚本

创建 ob-advanced-health-check.sh 脚本:

bash
#!/bin/bash

# OceanBase 高级健康检查脚本

# 配置信息
OB_HOST="127.0.0.1"
OB_PORT=2881
OB_USER="root@sys"
OB_PASS="root@123"

# 检查时间
CHECK_TIME=$(date +"%Y-%m-%d %H:%M:%S")

# 输出文件
OUTPUT_FILE="ob-advanced-health-check-$(date +"%Y%m%d-%H%M%S").log"

# 执行 SQL 查询函数
execute_sql() {
    local sql="$1"
    mysql -h${OB_HOST} -P${OB_PORT} -u${OB_USER} -p"${OB_PASS}" -A oceanbase -e "${sql}"
}

# 写入输出文件
write_output() {
    local content="$1"
    echo "${content}" >> ${OUTPUT_FILE}
}

# 开始检查
write_output "========================================"
write_output "OceanBase 集群高级健康检查报告"
write_output "检查时间: ${CHECK_TIME}"
write_output "========================================"

# 1. 集群状态详情
write_output "\n1. 集群状态详情:"
write_output "-------------------"
execute_sql "SELECT * FROM oceanbase.__all_cluster;" >> ${OUTPUT_FILE}

# 2. 节点详细状态
write_output "\n2. 节点详细状态:"
write_output "-------------------"
execute_sql "SELECT svr_ip, svr_port, zone, status, inner_port, with_rootserver, build_version FROM oceanbase.__all_server;" >> ${OUTPUT_FILE}

# 3. 资源使用详情
write_output "\n3. 资源使用详情:"
write_output "-------------------"
execute_sql "SELECT svr_ip, svr_port, cpu_total, cpu_assigned, cpu_used, mem_total, mem_assigned, mem_used, log_disk_total, log_disk_used, data_disk_total, data_disk_used FROM oceanbase.__all_virtual_server_stat;" >> ${OUTPUT_FILE}

# 4. 租户资源使用详情
write_output "\n4. 租户资源使用详情:"
write_output "-------------------"
execute_sql "SELECT t.tenant_id, t.tenant_name, t.status, s.cpu_used, s.mem_used, s.log_disk_used, s.data_disk_used FROM oceanbase.__all_tenant t JOIN oceanbase.__all_virtual_tenant_stat s ON t.tenant_id = s.tenant_id;" >> ${OUTPUT_FILE}

# 5. 副本状态详情
write_output "\n5. 副本状态详情:"
write_output "-------------------"
execute_sql "SELECT svr_ip, count(*) as total_partitions, sum(CASE WHEN status = 'NORMAL' THEN 1 ELSE 0 END) as normal_partitions, sum(CASE WHEN status != 'NORMAL' THEN 1 ELSE 0 END) as abnormal_partitions FROM oceanbase.__all_virtual_partition_info GROUP BY svr_ip;" >> ${OUTPUT_FILE}

# 6. 慢查询详情(最近10条)
write_output "\n6. 慢查询详情(最近10条):"
write_output "-------------------"
execute_sql "SELECT tenant_id, sql_id, query_sql, query_time, exec_time, affected_rows FROM oceanbase.__all_virtual_slow_query ORDER BY gmt_create DESC LIMIT 10;" >> ${OUTPUT_FILE}

# 7. 告警详情(当前告警)
write_output "\n7. 告警详情(当前告警):"
write_output "-------------------"
execute_sql "SELECT * FROM oceanbase.__all_virtual_alarm_current;" >> ${OUTPUT_FILE}

# 8. 合并状态检查
write_output "\n8. 合并状态检查:"
write_output "-------------------"
execute_sql "SELECT zone, name, value FROM oceanbase.__all_zone WHERE name = 'merge_status';" >> ${OUTPUT_FILE}

# 9. 日志恢复状态
write_output "\n9. 日志恢复状态:"
write_output "-------------------"
execute_sql "SELECT svr_ip, svr_port, tenant_id, status, progress FROM oceanbase.__all_virtual_log_restore_status;" >> ${OUTPUT_FILE}

# 10. 连接数检查
write_output "\n10. 连接数检查:"
write_output "-------------------"
execute_sql "SELECT tenant_id, tenant_name, current_conn, max_conn, connect_count FROM oceanbase.__all_virtual_tenant_conn_stat;" >> ${OUTPUT_FILE}

# 结束检查
write_output "\n========================================"
write_output "高级健康检查完成!"
write_output "报告文件: ${OUTPUT_FILE}"
write_output "========================================"

echo "高级健康检查完成! 报告文件: ${OUTPUT_FILE}"

3. 脚本使用方法

bash
# 给脚本添加执行权限
chmod +x ob-health-check.sh ob-advanced-health-check.sh

# 执行基础健康检查
./ob-health-check.sh

# 执行高级健康检查
./ob-advanced-health-check.sh

# 设置定时任务,每天凌晨2点执行健康检查
crontab -e
0 2 * * * /path/to/ob-health-check.sh

使用 OCP 进行健康检查

1. OCP 健康检查功能

OCP(OceanBase Cloud Platform)提供了全面的健康检查功能,可以通过 Web 界面直观地查看集群健康状态:

  • 集群概览:显示集群整体状态、节点数量、租户数量和关键性能指标
  • 节点管理:显示每个节点的状态、资源使用情况和负载信息
  • 租户管理:显示每个租户的状态、资源使用情况和性能指标
  • 监控中心:提供实时监控和历史趋势分析
  • 告警中心:集中管理和展示告警信息
  • 健康检查报告:生成定期健康检查报告

2. 使用 OCP 执行健康检查

  1. 登录 OCP 控制台
  2. 在左侧导航栏中选择 "集群管理"
  3. 选择要检查的集群
  4. 在集群详情页面中,可以查看:
    • 概览:集群整体状态和关键指标
    • 节点:所有节点的状态和资源使用情况
    • 租户:所有租户的状态和资源使用情况
    • 监控:实时监控图表
    • 告警:当前告警和历史告警
    • 健康检查:执行手动健康检查和查看检查报告

3. 配置 OCP 自动健康检查

  1. 登录 OCP 控制台
  2. 在左侧导航栏中选择 "系统管理" > "健康检查配置"
  3. 点击 "新建健康检查计划"
  4. 配置检查计划:
    • 检查对象:选择要检查的集群
    • 检查周期:设置检查频率(如每天、每周)
    • 检查时间:设置检查执行时间
    • 检查项目:选择要检查的项目
    • 通知方式:设置告警通知方式
  5. 点击 "保存",启用自动健康检查

健康检查指标阈值

指标类型指标名称警告阈值错误阈值监控工具
节点状态节点状态部分节点为 INACTIVE所有节点为 INACTIVEOCP、Prometheus
CPU 使用率节点 CPU 使用率> 80%> 95%OCP、Prometheus
内存使用率节点内存使用率> 80%> 95%OCP、Prometheus
磁盘使用率数据磁盘使用率> 80%> 95%OCP、Prometheus
磁盘使用率日志磁盘使用率> 80%> 90%OCP、Prometheus
副本状态副本异常率> 1%> 5%OCP、Prometheus
慢查询慢查询数量> 100/分钟> 500/分钟OCP、Prometheus
连接数连接使用率> 80%> 95%OCP、Prometheus

常见健康问题处理

1. 节点状态异常

症状:节点状态为 INACTIVE 或 DELETING

处理步骤

  1. 检查节点进程是否正常运行:ps -ef | grep observer
  2. 检查节点日志:tail -n 100 /home/oceanbase/log/observer.log
  3. 检查网络连接:ping 节点IPtelnet 节点IP 2882
  4. 尝试重启节点:obd cluster restart <cluster-name> -s <节点IP>
  5. 如果节点无法恢复,考虑替换节点

2. 资源使用率过高

症状:CPU、内存或磁盘使用率超过阈值

处理步骤

  1. 分析资源使用情况,找出占用资源较多的租户或SQL
  2. 调整资源配置,增加资源池或扩容节点
  3. 优化SQL语句,减少资源消耗
  4. 清理不必要的数据,释放存储空间

3. 副本状态异常

症状:副本状态为 NOT SYNC 或 INACTIVE

处理步骤

  1. 检查副本同步状态:SELECT * FROM oceanbase.__all_virtual_log_stat WHERE role = 'F';
  2. 检查日志恢复进度:SELECT * FROM oceanbase.__all_virtual_log_restore_status;
  3. 尝试修复副本:ALTER SYSTEM REPAIR PARTITION TABLE table_name PARTITION partition_name;
  4. 如果副本无法修复,考虑重建副本

4. 慢查询数量过多

症状:慢查询数量超过阈值

处理步骤

  1. 查看慢查询日志:SELECT * FROM oceanbase.__all_virtual_slow_query;
  2. 分析慢查询语句,找出性能瓶颈
  3. 优化SQL语句,创建合适的索引
  4. 调整系统参数,提高查询性能
  5. 考虑增加资源,提高集群处理能力

健康检查最佳实践

  1. 定期执行健康检查:建议每天执行一次全面健康检查,每小时执行一次关键指标检查
  2. 自动化检查:使用脚本和OCP自动健康检查功能,减少人工操作
  3. 设置合理阈值:根据实际业务情况调整健康检查指标阈值
  4. 及时处理问题:发现健康问题后,立即分析和处理,避免问题扩大
  5. 记录检查结果:保存健康检查报告,便于历史查询和趋势分析
  6. 持续优化:根据健康检查结果,持续优化集群配置和性能
  7. 培训运维人员:确保运维人员熟悉健康检查流程和处理方法
  8. 制定应急预案:针对常见健康问题,制定详细的应急预案

常见问题(FAQ)

Q1: 如何快速判断集群是否健康?

A1: 可以通过以下几个关键指标快速判断集群健康状态:

  • 集群状态:SELECT * FROM oceanbase.__all_cluster;,状态应为 ACTIVE
  • 节点状态:SELECT * FROM oceanbase.__all_server;,所有节点状态应为 ACTIVE
  • Zone 状态:SELECT * FROM oceanbase.__all_zone;,所有 Zone 状态应为 ACTIVE
  • 副本状态:SELECT COUNT(*) FROM oceanbase.__all_virtual_partition_info WHERE status != 'NORMAL';,异常副本数应为 0

Q2: 健康检查脚本执行失败怎么办?

A2: 健康检查脚本执行失败可能有以下原因:

  • 数据库连接信息错误:检查脚本中的数据库连接配置
  • 权限不足:确保使用的数据库用户有足够的权限
  • 网络连接问题:检查数据库服务器网络是否正常
  • SQL语法错误:检查脚本中的SQL语句是否正确
  • 数据库版本差异:根据数据库版本调整SQL语句

Q3: 如何监控健康检查结果?

A3: 可以通过以下方式监控健康检查结果:

  • 将健康检查脚本的输出结果发送到监控系统(如Prometheus)
  • 使用OCP的健康检查报告功能,定期查看报告
  • 设置告警规则,当健康检查发现问题时及时通知
  • 将健康检查结果保存到日志文件,定期分析

Q4: 健康检查会影响集群性能吗?

A4: 健康检查脚本执行的SQL查询通常是轻量级的,不会对集群性能产生明显影响。但如果在高负载情况下执行大量复杂查询,可能会对集群性能产生一定影响。建议在低峰期执行全面健康检查,使用增量检查方式减少资源消耗。

Q5: 如何处理健康检查中的误报?

A5: 健康检查误报可能是由于阈值设置不合理或临时波动导致的。处理方法包括:

  • 调整健康检查指标阈值,使其更符合实际业务情况
  • 增加检查次数,取平均值或趋势值作为判断依据
  • 对临时波动进行过滤,避免误报
  • 分析误报原因,优化健康检查逻辑

Q6: 如何集成健康检查到CI/CD流程?

A6: 可以将健康检查集成到CI/CD流程中,确保在部署和更新前集群处于健康状态:

  • 在部署前执行健康检查,确保集群可以接受更新
  • 在部署后执行健康检查,验证更新是否成功
  • 将健康检查结果作为部署流程的门禁条件
  • 自动化处理健康检查发现的问题,减少人工干预

Q7: 如何监控跨数据中心集群的健康状态?

A7: 监控跨数据中心集群的健康状态需要考虑:

  • 使用OCP或其他监控工具,统一监控所有数据中心的集群
  • 配置跨数据中心的网络连接,确保监控数据可以正常传输
  • 考虑网络延迟对监控数据的影响,调整监控频率和阈值
  • 设置跨数据中心的告警规则,确保及时发现和处理问题

Q8: 如何进行大规模集群的健康检查?

A8: 对于大规模集群(如数百个节点),健康检查需要考虑:

  • 使用分布式健康检查架构,避免单点瓶颈
  • 采用分层检查方式,先检查关键指标,再检查详细指标
  • 利用并行检查技术,提高检查效率
  • 对检查结果进行汇总和分析,生成简洁的报告
  • 使用自动化工具(如OCP)进行大规模集群管理和健康检查