Skip to content

OceanBase 副本异常

副本异常类型

副本状态异常

  1. INACTIVE:副本处于非活动状态,无法提供服务
  2. DEGRADED:副本处于降级状态,性能下降
  3. INVALID:副本数据无效,需要重建
  4. RECOVERING:副本正在恢复中
  5. WAITING_SYNC:副本等待同步数据

副本同步异常

  1. LAG:副本数据落后于主副本
  2. BLOCKED:副本同步被阻塞
  3. ERROR:副本同步出现错误
  4. TIMEOUT:副本同步超时

副本硬件异常

  1. DISK_ERROR:磁盘故障导致副本异常
  2. NETWORK_ERROR:网络问题导致副本异常
  3. CPU_MEM_ERROR:CPU 或内存资源不足导致副本异常

副本异常检测

内置视图检测

sql
-- 查看所有副本状态
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS;

-- 查看异常副本
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status != 'NORMAL';

-- 查看副本同步延迟
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE sync_lag > 0;

-- 查看副本所在节点状态
SELECT * FROM oceanbase.GV$OB_SERVER_STATUS;

OCP 监控检测

  1. 登录 OCP 控制台
  2. 进入集群详情页
  3. 选择 "监控" 标签页
  4. 选择 "副本" 监控视图
  5. 查看副本状态、同步延迟等指标
  6. 设置副本异常告警规则

自定义脚本检测

bash
#!/bin/bash
# 检测副本异常的脚本

OB_USER="root"
OB_PASS="password"
OB_PORT="2881"
OB_TENANT="sys"

# 检查异常副本
exception_replicas=$(mysql -h 127.0.0.1 -P $OB_PORT -u $OB_USER -p$OB_PASS -D $OB_TENANT -N -e "
SELECT COUNT(*) FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status != 'NORMAL';")

if [ $exception_replicas -gt 0 ]; then
    echo "警告:发现 $exception_replicas 个异常副本!"
    mysql -h 127.0.0.1 -P $OB_PORT -u $OB_USER -p$OB_PASS -D $OB_TENANT -e "
    SELECT svr_ip, svr_port, zone, tenant_id, status, sync_lag FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status != 'NORMAL';"
else
    echo "正常:所有副本状态正常。"
fi

副本异常处理

副本状态异常处理

1. INACTIVE 副本处理

sql
-- 查看 INACTIVE 副本详情
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status = 'INACTIVE';

-- 尝试激活副本
ALTER SYSTEM ACTIVATE REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

-- 如果激活失败,重建副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

2. DEGRADED 副本处理

sql
-- 查看 DEGRADED 副本详情
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status = 'DEGRADED';

-- 检查节点资源使用情况
SELECT * FROM oceanbase.GV$OB_SERVER_STATUS WHERE svr_ip = 'server_ip';

-- 优化节点资源配置
ALTER SYSTEM SET memory_limit = '16G' TENANT = 'tenant_name';

-- 如果资源优化无效,重建副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

3. INVALID 副本处理

sql
-- 查看 INVALID 副本详情
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status = 'INVALID';

-- 重建 INVALID 副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

-- 验证副本状态
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE svr_ip = 'server_ip' AND status = 'NORMAL';

副本同步异常处理

1. 同步延迟处理

sql
-- 查看同步延迟副本
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE sync_lag > 1000;

-- 检查网络状态
SELECT * FROM oceanbase.GV$OB_NETWORK_STATUS WHERE svr_ip = 'server_ip';

-- 优化网络配置
ALTER SYSTEM SET net_thread_count = 8;

-- 调整同步模式
ALTER SYSTEM SET replica_sync_mode = 'semi_sync' TENANT = 'tenant_name';

-- 如果延迟持续,检查主副本负载
SELECT * FROM oceanbase.GV$OB_SERVER_STATUS WHERE svr_ip = 'primary_server_ip';

2. 同步阻塞处理

sql
-- 查看同步阻塞副本
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE status = 'BLOCKED';

-- 查看阻塞原因
SELECT * FROM oceanbase.GV$OB_LOCK_WAITSTAT WHERE tenant_id = (SELECT tenant_id FROM oceanbase.DBA_OB_TENANTS WHERE tenant_name = 'tenant_name');

-- 终止阻塞事务
KILL SESSION 'session_id';

-- 或等待事务完成

副本硬件异常处理

1. 磁盘故障处理

sql
-- 查看磁盘状态
SELECT * FROM oceanbase.GV$OB_DISK_STATUS WHERE svr_ip = 'server_ip';

-- 隔离故障磁盘
ALTER SYSTEM DETACH DISK 'disk_id' FROM 'server_ip';

-- 替换故障磁盘后,重新附加磁盘
ALTER SYSTEM ATTACH DISK 'disk_id' TO 'server_ip';

-- 重建故障磁盘上的副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

2. 网络故障处理

sql
-- 检查网络状态
SELECT * FROM oceanbase.GV$OB_NETWORK_STATUS WHERE svr_ip = 'server_ip';

-- 检查节点间网络连通性
ping server_ip

-- 检查端口连通性
telnet server_ip 2882

-- 修复网络问题后,检查副本状态
SELECT * FROM oceanbase.GV$OB_REPLICA_STATUS WHERE svr_ip = 'server_ip';

副本异常恢复流程

1. 异常检测

  • 使用内置视图、OCP 监控或自定义脚本检测副本异常
  • 确定异常类型和严重程度

2. 异常分析

  • 分析异常原因
  • 评估影响范围
  • 制定恢复策略

3. 异常处理

  • 根据异常类型采取相应的处理措施
  • 优先处理影响大的异常
  • 记录处理过程

4. 恢复验证

  • 验证副本状态是否恢复正常
  • 验证数据一致性
  • 验证服务可用性

副本异常最佳实践

预防措施

  1. 定期检查:定期检查副本状态和同步延迟
  2. 监控告警:设置合理的副本异常告警规则
  3. 资源规划:合理规划节点资源,避免资源不足
  4. 网络优化:优化网络配置,减少网络延迟和丢包
  5. 磁盘管理:定期检查磁盘状态,及时更换故障磁盘

处理建议

  1. 快速响应:发现副本异常后,及时响应和处理
  2. 分级处理:根据异常严重程度分级处理
  3. 数据验证:处理完成后,验证数据一致性
  4. 文档记录:详细记录异常情况、处理过程和结果
  5. 持续优化:根据异常情况持续优化配置

恢复优先级

  1. 主副本异常:最高优先级,影响整个分区的可用性
  2. 多数副本异常:高优先级,可能导致数据不可用
  3. 少数副本异常:中优先级,影响数据冗余度
  4. 同步延迟:根据延迟程度确定优先级

常见问题(FAQ)

Q1: 副本异常会导致数据丢失吗?

A1: 正常情况下,OceanBase 采用多副本机制,单个副本异常不会导致数据丢失。但如果多数副本同时异常,可能会导致数据不可用或丢失。建议配置至少 3 个副本,分布在不同的可用区。

Q2: 如何快速恢复异常副本?

A2: 可以通过以下方式快速恢复异常副本:

  1. 对于状态异常的副本,尝试激活或重建
  2. 对于同步异常的副本,检查同步延迟原因并优化
  3. 对于硬件异常的副本,修复硬件问题后重建副本
sql
-- 重建异常副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';

Q3: 副本同步延迟高怎么办?

A3: 副本同步延迟高时,可以尝试以下操作:

  1. 检查网络状态,优化网络配置
  2. 检查主副本负载,优化主副本资源配置
  3. 调整同步模式,如从同步模式改为半同步模式
  4. 增加副本同步并发度
  5. 检查并优化慢查询和长事务
sql
-- 调整同步模式
ALTER SYSTEM SET replica_sync_mode = 'semi_sync' TENANT = 'tenant_name';

-- 增加同步并发度
ALTER SYSTEM SET replica_sync_concurrency = 8;

Q4: 如何防止副本异常扩散?

A4: 可以通过以下方式防止副本异常扩散:

  1. 及时处理异常副本,避免影响其他副本
  2. 配置合理的副本分布,避免副本集中在少数节点
  3. 实施网络隔离,防止网络故障影响所有副本
  4. 定期备份数据,确保数据安全
  5. 制定应急预案,快速响应大规模异常

Q5: 如何验证副本数据一致性?

A5: 可以通过以下方式验证副本数据一致性:

  1. 使用 OceanBase 内置的数据一致性检查工具
  2. 在不同节点上查询相同数据,验证结果一致
  3. 执行 checksum 操作,验证数据完整性
  4. 定期进行数据备份和恢复测试
sql
-- 验证数据一致性
SELECT COUNT(*) FROM table_name; -- 在主副本查询
SELECT COUNT(*) FROM table_name; -- 在备副本查询,结果应一致

-- 执行 checksum
CHECKSUM TABLE table_name; -- 在所有副本执行,结果应一致