外观
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 observer2. 迁移数据
如果节点无法恢复,可以将该节点上的数据迁移到其他节点:
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: 可以通过以下方式判断节点故障类型:
检查节点的系统日志:
bashtail -f /home/admin/oceanbase/log/observer.log | grep -i 'error'检查节点的硬件状态:
bash# 检查磁盘状态 fdisk -l smartctl -a /dev/sda # 检查内存状态 free -h vmstat 1 5 # 检查CPU状态 top mpstat 1 5检查节点的网络连接:
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: 可以通过以下方式防止节点故障导致数据丢失:
部署足够数量的数据副本:
sql-- 设置副本数量 ALTER SYSTEM SET replica_num = 3;分布数据副本到不同的可用区:
sql-- 创建多可用区集群 CREATE CLUSTER cluster_name ZONE_LIST = ('zone1', 'zone2', 'zone3') ...;启用数据同步验证:
sql-- 启用数据同步验证 ALTER SYSTEM SET enable_replica_validation = 'true';定期备份数据:
sql-- 全量备份集群数据 BACKUP CLUSTER FULL TO 'backup_path' WITH DATABASE_BACKUP_OPTIONS = 'compression=zstd';
Q4: 如何优化节点故障恢复时间?
A4: 可以通过以下方式优化节点故障恢复时间:
优化故障检测参数:
sql-- 减小故障检测间隔 ALTER SYSTEM SET server_check_interval = 3000; ALTER SYSTEM SET server_check_timeout = 6000;优化故障处理参数:
sql-- 增大故障处理并发数 ALTER SYSTEM SET failover_concurrency = 10; ALTER SYSTEM SET rebalance_batch_size = 20;部署备用节点:
sql-- 添加备用节点 ALTER SYSTEM ADD SERVER 'spare_server_ip:2881' ZONE 'zone_name';优化数据迁移速度:
sql-- 增大数据迁移带宽 ALTER SYSTEM SET migration_bandwidth_limit = 100MB;
Q5: 如何处理大规模节点故障?
A5: 大规模节点故障处理流程:
立即响应:
- 启动紧急故障处理预案
- 通知相关人员
- 停止不必要的业务操作
故障评估:
- 评估故障影响范围
- 评估数据丢失风险
- 评估恢复时间
恢复策略:
- 优先恢复核心业务节点
- 优先恢复数据副本
- 分批次恢复节点
恢复执行:
- 按照恢复策略执行恢复操作
- 监控恢复进度
- 调整恢复策略
恢复验证:
- 验证集群状态
- 验证数据完整性
- 验证服务可用性
恢复业务:
- 逐步恢复业务操作
- 监控业务运行状态
- 优化集群配置
