Skip to content

OceanBase 节点故障处理

故障检测机制

1. 心跳检测

OceanBase 使用心跳机制检测节点状态:

  • RootService 定期向所有 OBServer 节点发送心跳请求
  • OBServer 节点定期向 RootService 报告自身状态
  • 如果 RootService 在指定时间内没有收到节点的心跳响应,会将该节点标记为不可用
sql
-- 查看心跳检测相关参数
SHOW PARAMETERS LIKE '%heartbeat%';

-- 修改心跳检测间隔
ALTER SYSTEM SET server_check_interval = 5000;
ALTER SYSTEM SET server_check_timeout = 10000;

2. 状态监控

RootService 持续监控节点的状态:

  • 节点的运行状态
  • 节点的资源使用情况
  • 节点的网络连接状态
  • 节点的存储状态
sql
-- 查看节点状态
SELECT * FROM oceanbase.__all_server;

-- 查看节点的详细状态
SELECT * FROM oceanbase.gv$ob_server_status;

3. 故障通知

当检测到节点故障时,RootService 会:

  • 更新节点状态
  • 触发故障处理流程
  • 记录故障日志
  • 发送告警通知

故障处理流程

1. 故障发现

  • 自动发现:通过心跳检测和状态监控自动发现节点故障
  • 手动发现:通过监控系统、告警通知或业务反馈手动发现节点故障

2. 故障确认

  • 登录到集群,查看节点状态
  • 检查节点的系统日志和监控数据
  • 确认故障类型和影响范围
sql
-- 查看节点状态
SELECT * FROM oceanbase.__all_server WHERE status != 'active';

-- 查看节点的系统日志
SHOW SERVER LOG server_ip:2881 LIMIT 100;

3. 故障处理

根据故障类型和影响范围,选择合适的故障处理方式:

故障类型处理方式
临时故障等待自动恢复或手动重启节点
硬件故障替换硬件并重启节点,或迁移数据并移除节点
永久故障迁移数据并移除节点,或重新部署节点

4. 故障恢复

  • 恢复节点服务
  • 恢复数据副本
  • 验证集群状态
  • 恢复业务服务

手动故障处理

1. 重启节点

如果节点只是进程异常或临时故障,可以尝试重启节点:

bash
# 登录到节点服务器
ssh admin@server_ip

# 切换到 OceanBase 安装目录
cd /home/admin/oceanbase

# 停止 OceanBase 进程
./bin/observer.sh stop

# 检查进程是否已停止
ps -ef | grep observer

# 启动 OceanBase 进程
./bin/observer.sh start

# 检查进程是否已启动
ps -ef | grep observer

2. 迁移数据

如果节点无法恢复,可以将该节点上的数据迁移到其他节点:

sql
-- 查看节点上的数据分布
SELECT * FROM oceanbase.__all_partition WHERE svr_ip = 'server_ip';

-- 迁移数据到其他节点
ALTER SYSTEM MIGRATE PARTITION partition_name TO 'target_server_ip:2881';

-- 查看数据迁移进度
SELECT * FROM oceanbase.__all_migration_job;

3. 移除节点

如果节点无法恢复且数据已迁移,可以将该节点从集群中移除:

sql
-- 查看节点状态
SELECT * FROM oceanbase.__all_server WHERE svr_ip = 'server_ip';

-- 停止节点服务
ALTER SYSTEM STOP SERVER 'server_ip:2881';

-- 确认节点已停止
SELECT * FROM oceanbase.__all_server WHERE svr_ip = 'server_ip';

-- 从集群中移除节点
ALTER SYSTEM DELETE SERVER 'server_ip:2881';

-- 确认节点已移除
SELECT * FROM oceanbase.__all_server WHERE svr_ip = 'server_ip';

4. 新增节点

如果需要替换故障节点,可以新增一个节点到集群中:

sql
-- 添加新节点到集群
ALTER SYSTEM ADD SERVER 'new_server_ip:2881' ZONE 'zone_name';

-- 确认节点已添加
SELECT * FROM oceanbase.__all_server WHERE svr_ip = 'new_server_ip';

-- 启动节点服务
ALTER SYSTEM START SERVER 'new_server_ip:2881';

-- 确认节点已启动
SELECT * FROM oceanbase.__all_server WHERE svr_ip = 'new_server_ip';

自动故障处理

1. 自动故障切换

OceanBase 支持自动故障切换功能:

  • 当检测到节点故障时,自动将该节点上的主副本切换到其他节点
  • 确保数据可用性和服务连续性
  • 支持配置自动故障切换的相关参数
sql
-- 查看自动故障切换相关参数
SHOW PARAMETERS LIKE '%failover%';

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

-- 修改自动故障切换参数
ALTER SYSTEM SET server_check_interval = 5000;
ALTER SYSTEM SET server_check_timeout = 10000;
ALTER SYSTEM SET failover_check_interval = 10000;

2. 自动数据迁移

OceanBase 支持自动数据迁移功能:

  • 当检测到节点故障时,自动将该节点上的数据迁移到其他节点
  • 确保数据副本数量符合要求
  • 支持配置自动数据迁移的相关参数
sql
-- 查看自动数据迁移相关参数
SHOW PARAMETERS LIKE '%balance%';

-- 启用自动数据迁移
ALTER SYSTEM SET enable_rebalance = 'true';

-- 修改自动数据迁移参数
ALTER SYSTEM SET rebalance_batch_size = 10;
ALTER SYSTEM SET rebalance_batch_wait = 10000;
ALTER SYSTEM SET rebalance_ratio = 5;

3. 自动恢复验证

自动故障处理后,OceanBase 会自动验证恢复结果:

  • 检查数据副本完整性
  • 检查集群状态
  • 检查服务可用性

故障恢复后的验证

1. 集群状态验证

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

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

-- 查看集群负载
SELECT * FROM oceanbase.gv$ob_cluster_stat;

2. 数据完整性验证

sql
-- 查看数据副本状态
SELECT * FROM oceanbase.__all_partition WHERE status != 'normal';

-- 检查数据一致性
SELECT * FROM oceanbase.gv$ob_partition_checksum;

-- 验证数据可用性
SELECT COUNT(*) FROM tenant_name.table_name;

3. 服务可用性验证

sql
-- 测试数据库连接
mysql -h observer1 -P 2883 -u user_name@tenant_name -p'password' -D database_name -e "SELECT 1;"

-- 测试事务处理
mysql -h observer1 -P 2883 -u user_name@tenant_name -p'password' -D database_name -e "BEGIN; INSERT INTO table_name VALUES (1, 'test'); COMMIT; SELECT * FROM table_name WHERE id = 1; DELETE FROM table_name WHERE id = 1; COMMIT;"

-- 测试查询性能
mysql -h observer1 -P 2883 -u user_name@tenant_name -p'password' -D database_name -e "SELECT COUNT(*) FROM table_name;"

故障处理最佳实践

1. 建立完善的监控体系

  • 监控节点的运行状态
  • 监控节点的资源使用情况
  • 监控节点的网络连接状态
  • 监控节点的存储状态
  • 设置合理的告警阈值

2. 制定详细的故障处理预案

  • 针对不同类型的节点故障制定相应的处理流程
  • 明确故障处理的责任人和联系方式
  • 制定故障恢复的时间目标
  • 定期进行故障演练

3. 采用高可用架构设计

  • 部署足够数量的数据副本
  • 分布数据副本到不同的可用区
  • 配置自动故障切换功能
  • 部署备用节点

4. 定期备份数据

  • 定期备份集群数据
  • 备份数据到不同的存储介质
  • 定期验证备份数据的可用性
  • 制定数据恢复预案

5. 定期维护节点

  • 定期检查节点的硬件状态
  • 定期更新节点的软件版本
  • 定期清理节点的日志和临时文件
  • 定期优化节点的配置参数

6. 记录故障处理过程

  • 记录故障发生的时间和原因
  • 记录故障处理的步骤和结果
  • 记录故障恢复的时间和效果
  • 分析故障原因,提出改进措施

常见问题(FAQ)

Q1: 如何判断节点故障是临时故障还是永久故障?

A1: 可以通过以下方式判断节点故障类型:

  1. 检查节点的系统日志:

    bash
    tail -f /home/admin/oceanbase/log/observer.log | grep -i 'error'
  2. 检查节点的硬件状态:

    bash
    # 检查磁盘状态
    fdisk -l
    smartctl -a /dev/sda
    
    # 检查内存状态
    free -h
    vmstat 1 5
    
    # 检查CPU状态
    top
    mpstat 1 5
  3. 检查节点的网络连接:

    bash
    # 检查网络连通性
    ping observer1
    traceroute observer1
    
    # 检查端口连通性
    telnet observer1 2881
    telnet observer1 2883

Q2: 如何手动触发故障切换?

A2: 可以使用以下命令手动触发故障切换:

sql
-- 手动切换主副本
ALTER SYSTEM SWITCH PRIMARY PARTITION partition_name TO 'target_server_ip:2881';

-- 手动触发故障切换
ALTER SYSTEM TRIGGER FAILOVER SERVER 'server_ip:2881';

Q3: 如何防止节点故障导致数据丢失?

A3: 可以通过以下方式防止节点故障导致数据丢失:

  1. 部署足够数量的数据副本:

    sql
    -- 设置副本数量
    ALTER SYSTEM SET replica_num = 3;
  2. 分布数据副本到不同的可用区:

    sql
    -- 创建多可用区集群
    CREATE CLUSTER cluster_name
    ZONE_LIST = ('zone1', 'zone2', 'zone3')
    ...;
  3. 启用数据同步验证:

    sql
    -- 启用数据同步验证
    ALTER SYSTEM SET enable_replica_validation = 'true';
  4. 定期备份数据:

    sql
    -- 全量备份集群数据
    BACKUP CLUSTER FULL TO 'backup_path' WITH DATABASE_BACKUP_OPTIONS = 'compression=zstd';

Q4: 如何优化节点故障恢复时间?

A4: 可以通过以下方式优化节点故障恢复时间:

  1. 优化故障检测参数:

    sql
    -- 减小故障检测间隔
    ALTER SYSTEM SET server_check_interval = 3000;
    ALTER SYSTEM SET server_check_timeout = 6000;
  2. 优化故障处理参数:

    sql
    -- 增大故障处理并发数
    ALTER SYSTEM SET failover_concurrency = 10;
    ALTER SYSTEM SET rebalance_batch_size = 20;
  3. 部署备用节点:

    sql
    -- 添加备用节点
    ALTER SYSTEM ADD SERVER 'spare_server_ip:2881' ZONE 'zone_name';
  4. 优化数据迁移速度:

    sql
    -- 增大数据迁移带宽
    ALTER SYSTEM SET migration_bandwidth_limit = 100MB;

Q5: 如何处理大规模节点故障?

A5: 大规模节点故障处理流程:

  1. 立即响应

    • 启动紧急故障处理预案
    • 通知相关人员
    • 停止不必要的业务操作
  2. 故障评估

    • 评估故障影响范围
    • 评估数据丢失风险
    • 评估恢复时间
  3. 恢复策略

    • 优先恢复核心业务节点
    • 优先恢复数据副本
    • 分批次恢复节点
  4. 恢复执行

    • 按照恢复策略执行恢复操作
    • 监控恢复进度
    • 调整恢复策略
  5. 恢复验证

    • 验证集群状态
    • 验证数据完整性
    • 验证服务可用性
  6. 恢复业务

    • 逐步恢复业务操作
    • 监控业务运行状态
    • 优化集群配置