外观
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 502. 慢查询日志检查
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 执行健康检查
- 登录 OCP 控制台
- 在左侧导航栏中选择 "集群管理"
- 选择要检查的集群
- 在集群详情页面中,可以查看:
- 概览:集群整体状态和关键指标
- 节点:所有节点的状态和资源使用情况
- 租户:所有租户的状态和资源使用情况
- 监控:实时监控图表
- 告警:当前告警和历史告警
- 健康检查:执行手动健康检查和查看检查报告
3. 配置 OCP 自动健康检查
- 登录 OCP 控制台
- 在左侧导航栏中选择 "系统管理" > "健康检查配置"
- 点击 "新建健康检查计划"
- 配置检查计划:
- 检查对象:选择要检查的集群
- 检查周期:设置检查频率(如每天、每周)
- 检查时间:设置检查执行时间
- 检查项目:选择要检查的项目
- 通知方式:设置告警通知方式
- 点击 "保存",启用自动健康检查
健康检查指标阈值
| 指标类型 | 指标名称 | 警告阈值 | 错误阈值 | 监控工具 |
|---|---|---|---|---|
| 节点状态 | 节点状态 | 部分节点为 INACTIVE | 所有节点为 INACTIVE | OCP、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
处理步骤:
- 检查节点进程是否正常运行:
ps -ef | grep observer - 检查节点日志:
tail -n 100 /home/oceanbase/log/observer.log - 检查网络连接:
ping 节点IP和telnet 节点IP 2882 - 尝试重启节点:
obd cluster restart <cluster-name> -s <节点IP> - 如果节点无法恢复,考虑替换节点
2. 资源使用率过高
症状:CPU、内存或磁盘使用率超过阈值
处理步骤:
- 分析资源使用情况,找出占用资源较多的租户或SQL
- 调整资源配置,增加资源池或扩容节点
- 优化SQL语句,减少资源消耗
- 清理不必要的数据,释放存储空间
3. 副本状态异常
症状:副本状态为 NOT SYNC 或 INACTIVE
处理步骤:
- 检查副本同步状态:
SELECT * FROM oceanbase.__all_virtual_log_stat WHERE role = 'F'; - 检查日志恢复进度:
SELECT * FROM oceanbase.__all_virtual_log_restore_status; - 尝试修复副本:
ALTER SYSTEM REPAIR PARTITION TABLE table_name PARTITION partition_name; - 如果副本无法修复,考虑重建副本
4. 慢查询数量过多
症状:慢查询数量超过阈值
处理步骤:
- 查看慢查询日志:
SELECT * FROM oceanbase.__all_virtual_slow_query; - 分析慢查询语句,找出性能瓶颈
- 优化SQL语句,创建合适的索引
- 调整系统参数,提高查询性能
- 考虑增加资源,提高集群处理能力
健康检查最佳实践
- 定期执行健康检查:建议每天执行一次全面健康检查,每小时执行一次关键指标检查
- 自动化检查:使用脚本和OCP自动健康检查功能,减少人工操作
- 设置合理阈值:根据实际业务情况调整健康检查指标阈值
- 及时处理问题:发现健康问题后,立即分析和处理,避免问题扩大
- 记录检查结果:保存健康检查报告,便于历史查询和趋势分析
- 持续优化:根据健康检查结果,持续优化集群配置和性能
- 培训运维人员:确保运维人员熟悉健康检查流程和处理方法
- 制定应急预案:针对常见健康问题,制定详细的应急预案
常见问题(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)进行大规模集群管理和健康检查
