外观
OceanBase 副本异常
副本异常类型
副本状态异常
- INACTIVE:副本处于非活动状态,无法提供服务
- DEGRADED:副本处于降级状态,性能下降
- INVALID:副本数据无效,需要重建
- RECOVERING:副本正在恢复中
- WAITING_SYNC:副本等待同步数据
副本同步异常
- LAG:副本数据落后于主副本
- BLOCKED:副本同步被阻塞
- ERROR:副本同步出现错误
- TIMEOUT:副本同步超时
副本硬件异常
- DISK_ERROR:磁盘故障导致副本异常
- NETWORK_ERROR:网络问题导致副本异常
- 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 监控检测
- 登录 OCP 控制台
- 进入集群详情页
- 选择 "监控" 标签页
- 选择 "副本" 监控视图
- 查看副本状态、同步延迟等指标
- 设置副本异常告警规则
自定义脚本检测
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. 恢复验证
- 验证副本状态是否恢复正常
- 验证数据一致性
- 验证服务可用性
副本异常最佳实践
预防措施
- 定期检查:定期检查副本状态和同步延迟
- 监控告警:设置合理的副本异常告警规则
- 资源规划:合理规划节点资源,避免资源不足
- 网络优化:优化网络配置,减少网络延迟和丢包
- 磁盘管理:定期检查磁盘状态,及时更换故障磁盘
处理建议
- 快速响应:发现副本异常后,及时响应和处理
- 分级处理:根据异常严重程度分级处理
- 数据验证:处理完成后,验证数据一致性
- 文档记录:详细记录异常情况、处理过程和结果
- 持续优化:根据异常情况持续优化配置
恢复优先级
- 主副本异常:最高优先级,影响整个分区的可用性
- 多数副本异常:高优先级,可能导致数据不可用
- 少数副本异常:中优先级,影响数据冗余度
- 同步延迟:根据延迟程度确定优先级
常见问题(FAQ)
Q1: 副本异常会导致数据丢失吗?
A1: 正常情况下,OceanBase 采用多副本机制,单个副本异常不会导致数据丢失。但如果多数副本同时异常,可能会导致数据不可用或丢失。建议配置至少 3 个副本,分布在不同的可用区。
Q2: 如何快速恢复异常副本?
A2: 可以通过以下方式快速恢复异常副本:
- 对于状态异常的副本,尝试激活或重建
- 对于同步异常的副本,检查同步延迟原因并优化
- 对于硬件异常的副本,修复硬件问题后重建副本
sql
-- 重建异常副本
ALTER SYSTEM RECONSTRUCT REPLICA ON 'server_ip:port' FOR TENANT 'tenant_name';Q3: 副本同步延迟高怎么办?
A3: 副本同步延迟高时,可以尝试以下操作:
- 检查网络状态,优化网络配置
- 检查主副本负载,优化主副本资源配置
- 调整同步模式,如从同步模式改为半同步模式
- 增加副本同步并发度
- 检查并优化慢查询和长事务
sql
-- 调整同步模式
ALTER SYSTEM SET replica_sync_mode = 'semi_sync' TENANT = 'tenant_name';
-- 增加同步并发度
ALTER SYSTEM SET replica_sync_concurrency = 8;Q4: 如何防止副本异常扩散?
A4: 可以通过以下方式防止副本异常扩散:
- 及时处理异常副本,避免影响其他副本
- 配置合理的副本分布,避免副本集中在少数节点
- 实施网络隔离,防止网络故障影响所有副本
- 定期备份数据,确保数据安全
- 制定应急预案,快速响应大规模异常
Q5: 如何验证副本数据一致性?
A5: 可以通过以下方式验证副本数据一致性:
- 使用 OceanBase 内置的数据一致性检查工具
- 在不同节点上查询相同数据,验证结果一致
- 执行 checksum 操作,验证数据完整性
- 定期进行数据备份和恢复测试
sql
-- 验证数据一致性
SELECT COUNT(*) FROM table_name; -- 在主副本查询
SELECT COUNT(*) FROM table_name; -- 在备副本查询,结果应一致
-- 执行 checksum
CHECKSUM TABLE table_name; -- 在所有副本执行,结果应一致