Skip to content

OceanBase 节点故障处理

节点故障类型

1. 硬件故障

服务器硬件故障

  • CPU 故障
  • 内存故障
  • 磁盘故障
  • 电源故障
  • 主板故障

存储硬件故障

  • 磁盘损坏
  • RAID 卡故障
  • 存储阵列故障
  • 硬盘读写错误

2. 软件故障

操作系统故障

  • 系统崩溃
  • 内核 panic
  • 文件系统损坏
  • 系统死锁

数据库进程故障

  • OBServer 进程崩溃
  • 进程无响应
  • 内存泄漏
  • 线程死锁

3. 网络故障

网络连接故障

  • 网卡故障
  • 网络线缆故障
  • 交换机故障
  • 网络分区

网络配置故障

  • IP 地址冲突
  • 路由配置错误
  • 防火墙规则错误
  • DNS 配置错误

节点故障检测

1. 故障检测机制

内置故障检测

  • OceanBase 内置的故障检测服务
  • 定期发送心跳检测
  • 基于 Paxos 协议的一致性检测

监控系统检测

  • OCP(OceanBase Cloud Platform)监控
  • 第三方监控系统(如 Prometheus + Grafana)
  • 自定义监控脚本

2. 故障检测参数

sql
-- 查看故障检测相关参数
SHOW PARAMETERS LIKE '%check%';
SHOW PARAMETERS LIKE '%timeout%';

-- 修改故障检测参数
ALTER SYSTEM SET server_check_interval = 3000; -- 服务器检查间隔(毫秒)
ALTER SYSTEM SET server_down_time = 20000; -- 服务器宕机判定时间(毫秒)
ALTER SYSTEM SET enable_auto_failover = TRUE; -- 启用自动故障切换

3. 故障检测流程

  1. 心跳检测

    • 定期发送心跳包
    • 检查服务器是否响应
    • 检测网络连接状态
  2. 状态验证

    • 检查 OBServer 进程状态
    • 验证数据库服务可用性
    • 检查资源使用情况
  3. 故障确认

    • 多次检测确认故障
    • 排除误报
    • 确定故障类型和严重程度
  4. 故障通知

    • 发送告警通知
    • 记录故障日志
    • 触发自动故障处理流程

节点故障处理流程

1. 故障响应

告警接收与确认

  • 接收监控系统告警
  • 登录故障节点进行确认
  • 初步判断故障类型

故障影响评估

  • 评估故障节点的角色和重要性
  • 检查受影响的业务
  • 确定故障处理优先级

2. 故障处理

自动故障处理

  • 自动故障切换(AFS)
  • 自动副本迁移
  • 自动恢复服务
sql
-- 查看自动故障切换状态
SELECT * FROM oceanbase.GV$OB_AUTO_FAILOVER_STATUS;

-- 启用自动故障切换
ALTER SYSTEM SET enable_auto_failover = TRUE;

手动故障处理

  1. 确认故障节点状态

    sql
    -- 查看节点状态
    SELECT * FROM oceanbase.GV$OB_SERVER WHERE status != 'ACTIVE';
    
    -- 查看节点详细状态
    SELECT * FROM oceanbase.GV$OB_SERVER_STATUS WHERE svr_ip = '10.0.0.1';
  2. 隔离故障节点

    sql
    -- 停止故障节点服务
    ALTER SYSTEM STOP SERVER '10.0.0.1:2882';
    
    -- 从集群中移除故障节点
    ALTER SYSTEM DELETE SERVER '10.0.0.1:2882';
  3. 恢复或替换节点

    • 修复硬件故障
    • 重装操作系统和数据库
    • 替换故障服务器
    • 重新部署 OBServer 节点
  4. 重新加入集群

    sql
    -- 添加新节点到集群
    ALTER SYSTEM ADD SERVER '10.0.0.1:2882' ZONE 'zone1' WITH ROOTSERVER_LIST = ('10.0.0.2:2882', '10.0.0.3:2882');
    
    -- 启动节点服务
    ALTER SYSTEM START SERVER '10.0.0.1:2882';

3. 故障恢复验证

节点恢复验证

sql
-- 检查节点状态
SELECT * FROM oceanbase.GV$OB_SERVER WHERE svr_ip = '10.0.0.1';

-- 检查节点服务状态
SELECT * FROM oceanbase.GV$OB_SERVICE_STATUS WHERE svr_ip = '10.0.0.1';

-- 检查副本状态
SELECT * FROM oceanbase.GV$OB_REPLICA WHERE svr_ip = '10.0.0.1';

业务恢复验证

  • 检查业务连接状态
  • 验证业务功能正常
  • 检查数据一致性
  • 确认性能恢复正常

节点故障恢复方法

1. 重启恢复

适用场景

  • 进程崩溃
  • 内存泄漏
  • 临时死锁
  • 软件配置错误

操作步骤

bash
# 登录故障节点
ssh user@10.0.0.1

# 检查 OBServer 进程状态
ps -ef | grep observer

# 停止 OBServer 进程
kill -9 <observer_pid>

# 启动 OBServer 进程
cd /home/admin/oceanbase && ./bin/observer

# 或使用 systemd 管理
systemctl restart oceanbase

2. 重装恢复

适用场景

  • 操作系统故障
  • 文件系统损坏
  • 数据库软件损坏
  • 配置文件丢失

操作步骤

  1. 备份数据(如果可能)
  2. 重装操作系统
  3. 安装依赖包
  4. 重新部署 OBServer
  5. 恢复数据
  6. 加入集群

3. 替换恢复

适用场景

  • 硬件故障无法修复
  • 服务器老化
  • 硬件性能不足

操作步骤

  1. 准备新服务器
  2. 安装操作系统和依赖
  3. 部署 OBServer 软件
  4. 将新节点加入集群
  5. 迁移副本到新节点
  6. 移除故障节点

4. 数据恢复

从备份恢复

sql
-- 停止租户服务
ALTER TENANT tenant1 STOP SERVICE;

-- 恢复数据
RESTORE TENANT tenant1 FROM 'oss://backup-bucket/full/20240118' WITH BACKUPSET 'backup_set_20240118';

-- 启动租户服务
ALTER TENANT tenant1 START SERVICE;

从副本恢复

  • 利用其他节点的副本数据
  • 通过 Paxos 协议自动恢复数据一致性
  • 无需手动干预(在自动故障切换启用的情况下)

节点故障处理最佳实践

1. 故障预防

硬件冗余

  • 使用 RAID 存储
  • 配置冗余电源
  • 使用双网卡绑定
  • 部署多可用区

软件优化

  • 定期更新操作系统和数据库版本
  • 优化系统配置
  • 定期清理日志和临时文件
  • 监控资源使用情况

监控告警

  • 配置全面的监控指标
  • 设置合理的告警阈值
  • 建立告警分级机制
  • 确保告警及时送达

2. 故障响应

建立故障响应流程

  • 明确故障处理角色和职责
  • 制定故障分级标准
  • 建立故障处理 SOP
  • 定期进行故障演练

快速响应

  • 24/7 监控
  • 快速告警通知
  • 立即着手处理
  • 及时更新故障状态

3. 故障恢复

优先恢复服务

  • 首先确保业务可用性
  • 然后进行彻底修复
  • 最后进行优化改进

数据一致性保障

  • 恢复后验证数据一致性
  • 检查副本同步状态
  • 确保事务完整性

节点故障监控与告警

1. 关键监控指标

节点状态指标

  • 服务器在线状态
  • OBServer 进程状态
  • 服务可用性
  • 心跳检测状态

资源使用指标

  • CPU 使用率
  • 内存使用率
  • 磁盘 I/O 使用率
  • 网络流量

数据库性能指标

  • QPS/TPS
  • 响应时间
  • 连接数
  • 慢查询数

2. 告警配置

告警级别

  • 紧急告警:需要立即处理的故障
  • 重要告警:需要尽快处理的问题
  • 一般告警:需要关注的问题
  • 提示告警:需要了解的信息

告警方式

  • 邮件告警
  • 短信告警
  • 电话告警
  • 即时通讯工具告警(如钉钉、微信)
  • 告警平台集成

3. 告警处理流程

  1. 告警接收

    • 监控系统发送告警
    • 相关人员接收告警
  2. 告警确认

    • 登录系统确认故障
    • 初步判断故障类型
    • 评估故障影响
  3. 告警处理

    • 按照故障处理流程处理
    • 记录处理过程
    • 更新告警状态
  4. 告警关闭

    • 故障恢复后关闭告警
    • 记录故障原因和处理结果
    • 进行故障复盘

常见节点故障案例

1. OBServer 进程崩溃

故障现象

  • 监控系统告警 OBServer 进程消失
  • 节点状态变为 DOWN
  • 业务连接异常

处理步骤

  1. 登录故障节点,检查 OBServer 进程状态
  2. 查看 OBServer 日志,分析崩溃原因
  3. 重启 OBServer 进程
  4. 验证节点恢复正常
  5. 分析崩溃原因,进行优化

2. 磁盘故障

故障现象

  • 监控系统告警磁盘 I/O 错误
  • 节点状态异常
  • 副本同步延迟

处理步骤

  1. 确认磁盘故障
  2. 将节点从集群中移除
  3. 更换故障磁盘
  4. 重新部署节点
  5. 加入集群并恢复副本

3. 网络分区

故障现象

  • 节点间通信异常
  • 集群分裂
  • 副本状态异常

处理步骤

  1. 确认网络分区原因
  2. 修复网络故障
  3. 等待集群自动恢复
  4. 验证集群状态正常
  5. 优化网络架构

节点故障处理工具

1. 内置工具

OBD(OceanBase Deployer)

bash
# 检查集群状态
obd cluster status <cluster_name>

# 重启节点
obd cluster restart <cluster_name> -N 10.0.0.1

# 查看日志
obd cluster display <cluster_name> --role observer

OCP(OceanBase Cloud Platform)

  • 可视化监控和管理界面
  • 自动故障检测和处理
  • 节点管理和维护
  • 性能监控和分析

2. 命令行工具

集群状态检查

sql
-- 查看集群状态
SELECT * FROM oceanbase.GV$OB_CLUSTER_STATUS;

-- 查看节点状态
SELECT * FROM oceanbase.GV$OB_SERVER;

-- 查看副本状态
SELECT * FROM oceanbase.GV$OB_REPLICA;

节点管理命令

sql
-- 添加节点
ALTER SYSTEM ADD SERVER '10.0.0.1:2882' ZONE 'zone1';

-- 删除节点
ALTER SYSTEM DELETE SERVER '10.0.0.1:2882';

-- 启动节点
ALTER SYSTEM START SERVER '10.0.0.1:2882';

-- 停止节点
ALTER SYSTEM STOP SERVER '10.0.0.1:2882';

常见问题及解决方案

1. 节点无法启动

故障现象

  • OBServer 进程无法启动
  • 启动后立即崩溃
  • 日志中出现错误信息

解决方案

bash
# 检查配置文件
cat /home/admin/oceanbase/conf/observer.conf

# 检查端口占用
netstat -tuln | grep 2881
netstat -tuln | grep 2882

# 检查日志
tail -n 100 /home/admin/oceanbase/log/observer.log

# 检查数据目录权限
ls -la /home/admin/oceanbase/data

2. 节点无法加入集群

故障现象

  • 节点启动后无法加入集群
  • 集群状态中节点显示异常
  • 日志中出现连接错误

解决方案

sql
-- 检查集群 rootserver 配置
SHOW PARAMETERS LIKE 'rootservice_list';

-- 检查节点网络连接
ALTER SYSTEM CHECK SERVER '10.0.0.1:2882';

-- 检查节点配置
SHOW PARAMETERS LIKE '%zone%';
SHOW PARAMETERS LIKE '%cluster%';

3. 副本同步延迟

故障现象

  • 副本状态显示 SYNCING
  • 同步延迟持续增加
  • 影响数据一致性

解决方案

sql
-- 查看副本同步状态
SELECT * FROM oceanbase.GV$OB_REPLICA_SYNC_STATUS WHERE svr_ip = '10.0.0.1';

-- 检查网络状态
SELECT * FROM oceanbase.GV$OB_NETWORK_STATUS;

-- 调整同步参数
ALTER SYSTEM SET replication_retry_interval = 500;
ALTER SYSTEM SET replication_timeout = 3000;

4. 自动故障切换失败

故障现象

  • 节点故障后自动切换未触发
  • 集群状态异常
  • 业务受到影响

解决方案

sql
-- 检查自动故障切换配置
SHOW PARAMETERS LIKE 'enable_auto_failover';
SHOW PARAMETERS LIKE 'server_down_time';

-- 手动触发故障切换
ALTER SYSTEM SWITCHover ZONE 'zone1' TO 'zone2';

-- 检查故障切换状态
SELECT * FROM oceanbase.GV$OB_AUTO_FAILOVER_STATUS;

常见问题(FAQ)

Q1: 如何判断节点是否故障?

A1: 可以通过以下方式判断节点是否故障:

  1. 监控系统告警
  2. 登录节点检查 OBServer 进程状态
  3. 通过 SQL 语句查询节点状态:SELECT * FROM oceanbase.GV$OB_SERVER WHERE svr_ip = '10.0.0.1';
  4. 检查节点心跳状态

Q2: 节点故障后会自动恢复吗?

A2: 如果启用了自动故障切换(enable_auto_failover = TRUE),OceanBase 会自动检测节点故障并进行故障切换,确保业务连续性。但具体恢复情况取决于故障类型和严重程度。

Q3: 节点故障后如何保障数据一致性?

A3: OceanBase 使用 Paxos 协议保证数据一致性,当节点故障时:

  1. 剩余节点会重新选举 leader
  2. 通过多数派确认机制保证数据一致性
  3. 故障恢复后,会自动同步缺失的数据
  4. 可以通过 SELECT * FROM oceanbase.GV$OB_REPLICA_SYNC_STATUS; 检查副本同步状态

Q4: 如何避免节点故障?

A4: 可以通过以下措施避免节点故障:

  1. 使用冗余硬件配置
  2. 定期更新系统和软件
  3. 优化系统配置
  4. 建立完善的监控告警机制
  5. 定期进行系统维护和巡检

Q5: 节点故障处理的优先级是什么?

A5: 节点故障处理的优先级建议:

  1. 保障业务连续性
  2. 确保数据一致性
  3. 恢复系统性能
  4. 彻底修复故障
  5. 进行优化改进

Q6: 如何进行节点故障演练?

A6: 节点故障演练的步骤:

  1. 制定演练计划
  2. 选择合适的时间(业务低峰期)
  3. 模拟各种故障场景
  4. 按照故障处理流程进行处理
  5. 记录演练过程和结果
  6. 进行演练总结和改进

Q7: 节点故障后如何快速恢复业务?

A7: 快速恢复业务的方法:

  1. 启用自动故障切换
  2. 确保集群有足够的冗余节点
  3. 优化故障检测和响应流程
  4. 建立完善的备份恢复机制
  5. 定期进行故障恢复演练

Q8: 如何监控节点状态?

A8: 可以通过以下方式监控节点状态:

  1. 使用 OCP 监控界面
  2. 配置 Prometheus + Grafana 监控
  3. 使用自定义监控脚本
  4. 定期执行健康检查命令
  5. 设置节点状态告警