OceanBase教程FG060-OceanBase集群恢复实战
本文档风哥主要介绍OceanBase数据库集群恢复相关知识,包括OceanBase集群架构、OceanBase故障类型、OceanBase恢复概念、OceanBase备份策略、OceanBase节点恢复、OceanBase Zone恢复、OceanBase集群恢复等内容,风哥教程参考OceanBase官方文档容灾备份、故障恢复等内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 OceanBase集群架构
OceanBase采用多副本架构,通过Paxos协议保证数据一致性,了解集群架构有助于制定恢复策略。更多视频教程www.fgedu.net.cn
- Zone:可用区,通常对应一个机房或一个机架
- OBServer:数据节点,存储和处理数据
- RootService:集群管理服务,负责资源调度
- OBProxy:代理服务,负责连接路由
- 多副本:默认3副本,保证高可用
1.2 OceanBase故障类型
1. 节点故障
– 单节点宕机
– 节点网络故障
– 节点磁盘故障
– 节点进程崩溃
2. Zone故障
– 整个Zone不可用
– Zone网络隔离
– Zone电力故障
3. 集群故障
– 多数派节点故障
– 集群脑裂
– 数据损坏
4. 逻辑故障
– 误删除数据
– 误删除表
– 误更新数据
– 误删除租户
1.3 OceanBase恢复概念
1. 自动恢复
– 节点故障自动切换
– 副本自动补齐
– Leader自动切换
2. 手动恢复
– 节点替换
– 副本迁移
– 数据修复,风哥提示:。
3. 备份恢复
– 物理备份恢复
– 逻辑备份恢复
– 闪回恢复
4. 容灾切换
– 主备切换
– 异地切换
– 演练切换
Part02-生产环境规划与建议
2.1 OceanBase备份策略
1. 备份类型
┌─────────────────┬─────────────────────────────────────┐
│ 备份类型 │ 说明 │
├─────────────────┼─────────────────────────────────────┤
│ 全量备份 │ 完整的数据备份 │
│ 增量备份 │ 基于上次备份的增量数据 │
│ 日志备份 │ 归档日志备份 │,学习交流加群风哥微信: itpux-com。
│ 逻辑备份 │ SQL格式的数据导出 │
└─────────────────┴─────────────────────────────────────┘
2. 备份频率
– 全量备份:每周一次
– 增量备份:每天一次
– 日志备份:实时备份
3. 备份保留
– 本地保留:7天
– 异地保留:30天
– 归档保留:1年
4. 备份验证
– 定期恢复测试
– 备份完整性检查
– 备份可用性验证
2.2 OceanBase恢复计划
1. 恢复目标
– RTO(恢复时间目标):< 30分钟
- RPO(恢复点目标):< 5分钟
2. 恢复流程
- 故障检测
- 影响评估
- 恢复决策
- 执行恢复
- 验证恢复
- 恢复业务
3. 恢复优先级
- 系统租户优先
- 核心业务优先
- 只读业务延后,学习交流加群风哥QQ113257174。
4. 恢复资源
- 备用服务器
- 备用存储
- 网络资源
- 人力资源
2.3 OceanBase容灾规划
1. 同城容灾
– 同城双活
– 延迟:< 5ms
- RPO:0
- RTO:< 1分钟
2. 异地容灾
- 异地灾备
- 延迟:< 100ms
- RPO:< 5分钟
- RTO:< 30分钟
3. 容灾架构
- 主集群:处理读写请求
- 备集群:同步数据,可切换为主
- 仲裁节点:防止脑裂
4. 容灾演练
- 定期演练
- 演练记录
- 问题改进
- 预案更新
Part03-生产环境项目实施方案
3.1 OceanBase节点恢复
3.1.1 节点故障检测
1. 查看节点状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, svr_ip, svr_port, status, use_ob_disk, stop_time
FROM oceanbase.__all_server;
”
+——-+—————+———-+——–+————-+———————+
| zone | svr_ip | svr_port | status | use_ob_disk | stop_time |
+——-+—————+———-+——–+————-+———————+
| zone1 | 192.168.1.101 | 2882 | active | YES | NULL |
| zone2 | 192.168.1.102 | 2882 | inactive| YES | 2024-01-20 10:00:00 |
| zone3 | 192.168.1.103 | 2882 | active | YES | NULL |
+——-+—————+———-+——–+————-+———————+
# 发现zone2节点故障
2. 检查集群健康状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT * FROM oceanbase.__all_zone;
”
+———–+——–+——–+——-+
| zone | status | region | type |
+———–+——–+——–+——-+
| zone1 | ACTIVE | region1| ReadWrite |
| zone2 | INACTIVE| region1| ReadWrite |
| zone3 | ACTIVE | region1| ReadWrite |
+———–+——–+——–+——-+
3. 检查数据副本状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e “,更多学习教程公众号风哥教程itpux_com。
SELECT
table_id,
partition_id,
svr_ip,
role,
replica_type,
status
FROM oceanbase.__all_virtual_proxy_schema
WHERE svr_ip = ‘192.168.1.102’;
”
3.1.2 节点恢复操作
1. 启动故障节点
$ ssh admin@192.168.1.102
$ cd /ob/app/oceanbase
$ ./bin/observer -start
# 查看启动日志
$ tail -f /ob/fgdata/log/observer.log
[2024-01-20 10:30:00.123456] INFO [SERVER] start_service (ob_server.cpp:1234) [12345] [lt=0] [dc=0] start service success
2. 检查节点恢复状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, svr_ip, svr_port, status, start_service_time
FROM oceanbase.__all_server;
“,from DB视频:www.itpux.com。
+——-+—————+———-+——–+———————+
| zone | svr_ip | svr_port | status | start_service_time |
+——-+—————+———-+——–+———————+
| zone1 | 192.168.1.101 | 2882 | active | 2024-01-20 09:00:00 |
| zone2 | 192.168.1.102 | 2882 | active | 2024-01-20 10:30:00 |
| zone3 | 192.168.1.103 | 2882 | active | 2024-01-20 09:00:00 |
+——-+—————+———-+——–+———————+
3. 检查副本恢复进度
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
svr_ip,
COUNT(*) as replica_count,
SUM(CASE WHEN is_restore = 1 THEN 1 ELSE 0 END) as restoring_count
FROM oceanbase.__all_virtual_proxy_schema
WHERE svr_ip = ‘192.168.1.102’
GROUP BY svr_ip;
”
+—————+—————+—————–+
| svr_ip | replica_count | restoring_count |
+—————+—————+—————–+
| 192.168.1.102 | 1000 | 50 |
+—————+—————+—————–+
4. 等待恢复完成
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
svr_ip,
COUNT(*) as replica_count,
SUM(CASE WHEN is_restore = 1 THEN 1 ELSE 0 END) as restoring_count
FROM oceanbase.__all_virtual_proxy_schema
WHERE svr_ip = ‘192.168.1.102’
GROUP BY svr_ip;
”
+—————+—————+—————–+
| svr_ip | replica_count | restoring_count |
+—————+—————+—————–+
| 192.168.1.102 | 1000 | 0 |
+—————+—————+—————–+
# 恢复完成
3.2 OceanBase Zone恢复
1. Zone故障场景
– 整个Zone所有节点故障
– Zone网络隔离
– Zone机房故障
2. 检查Zone状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, status, region
FROM oceanbase.__all_zone;
”
+——-+———+———+
| zone | status | region |
+——-+———+———+
| zone1 | ACTIVE | region1 |
| zone2 | INACTIVE| region1 |
| zone3 | ACTIVE | region1 |
+——-+———+———+
3. 启动Zone内所有节点
# 在zone2的每个节点上执行
$ ssh admin@192.168.1.102
$ cd /ob/app/oceanbase
$ ./bin/observer -start
$ ssh admin@192.168.1.103
$ cd /ob/app/oceanbase
$ ./bin/observer -start
4. 激活Zone
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
ALTER SYSTEM ACTIVATE ZONE zone2;
”
Query OK, 0 rows affected
5. 检查Zone恢复
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, status, region
FROM oceanbase.__all_zone;
”
+——-+——–+———+
| zone | status | region |
+——-+——–+———+
| zone1 | ACTIVE | region1 |
| zone2 | ACTIVE | region1 |
| zone3 | ACTIVE | region1 |
+——-+——–+———+
# Zone恢复完成
3.3 OceanBase集群恢复
1. 集群故障场景
– 多数派节点故障
– 集群脑裂
– 数据损坏
2. 备份恢复流程
# 从备份恢复集群
# 步骤1:准备恢复环境
$ mkdir -p /ob/fgdata/recovery
$ chown -R admin:admin /ob/fgdata/recovery
# 步骤2:恢复系统表
$ cd /ob/app/oceanbase
$ ./bin/observer -i eth0 -p 2881 -P 2882 -z zone1 -c 1 \
-d /ob/fgdata/recovery \
-r ‘192.168.1.101:2882:2881’ \
-o ‘memory_limit=50G,cluster_id=1,cluster_name=fgedu_cluster’
# 步骤3:恢复租户数据
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 创建资源单元
CREATE RESOURCE UNIT fgedu_unit
MAX_CPU 4, MAX_MEMORY ‘8G’, MAX_IOPS 10000, MAX_DISK_SIZE ‘100G’, MAX_SESSION_NUM 1000;
— 创建资源池
CREATE RESOURCE POOL fgedu_pool
UNIT=’fgedu_unit’,
UNIT_NUM=1,
ZONE_LIST=(‘zone1′);
— 创建租户
CREATE TENANT IF NOT EXISTS fgedu_tenant
PRIMARY_ZONE=’zone1’,
RESOURCE_POOL_LIST=(‘fgedu_pool’);
”
# 步骤4:恢复数据
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
— 从逻辑备份恢复
SOURCE /backup/fgedudb_backup.sql;
”
# 步骤5:验证恢复
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e ”
SHOW DATABASES;
SELECT COUNT(*) FROM fgedudb.fgedu_order;
”
# 步骤6:扩展集群
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 添加zone2
ALTER SYSTEM ADD ZONE zone2 REGION ‘region1’;
— 添加zone3
ALTER SYSTEM ADD ZONE zone3 REGION ‘region1’;
— 添加OBServer
ALTER SYSTEM ADD SERVER ‘192.168.1.102:2882’ ZONE ‘zone2’;
ALTER SYSTEM ADD SERVER ‘192.168.1.103:2882’ ZONE ‘zone3’;
”
# 集群恢复完成
Part04-生产案例与实战讲解
4.1 OceanBase节点故障恢复案例
– 192.168.1.102节点宕机
– 业务受到影响
– 需要快速恢复
# 恢复过程
1. 故障检测
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, svr_ip, svr_port, status
FROM oceanbase.__all_server;
”
+——-+—————+———-+———+
| zone | svr_ip | svr_port | status |
+——-+—————+———-+———+
| zone1 | 192.168.1.101 | 2882 | active |
| zone2 | 192.168.1.102 | 2882 | inactive|
| zone3 | 192.168.1.103 | 2882 | active |
+——-+—————+———-+———+
2. 检查业务影响
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
tenant_name,
COUNT(*) as partition_count,
SUM(CASE WHEN svr_ip = ‘192.168.1.102’ THEN 1 ELSE 0 END) as affected_partitions
FROM oceanbase.__all_virtual_proxy_schema
GROUP BY tenant_name;
”
+————-+—————–+———————+
| tenant_name | partition_count | affected_partitions |
+————-+—————–+———————+
| sys | 100 | 33 |
| fgedu_tenant| 500 | 167 |
+————-+—————–+———————+
3. 启动故障节点
$ ssh admin@192.168.1.102
$ cd /ob/app/oceanbase
$ ./bin/observer -start
# 监控启动日志
$ tail -f /ob/fgdata/log/observer.log
4. 验证恢复
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, svr_ip, status, start_service_time
FROM oceanbase.__all_server;
”
+——-+—————+——–+———————+
| zone | svr_ip | status | start_service_time |
+——-+—————+——–+———————+
| zone1 | 192.168.1.101 | active | 2024-01-20 09:00:00 |
| zone2 | 192.168.1.102 | active | 2024-01-20 10:15:00 |
| zone3 | 192.168.1.103 | active | 2024-01-20 09:00:00 |
+——-+—————+——–+———————+
5. 检查副本恢复
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
tenant_name,
COUNT(*) as total_replicas,
SUM(CASE WHEN is_restore = 1 THEN 1 ELSE 0 END) as restoring_replicas
FROM oceanbase.__all_virtual_proxy_schema
WHERE svr_ip = ‘192.168.1.102’
GROUP BY tenant_name;
”
+————-+—————-+——————-+
| tenant_name | total_replicas | restoring_replicas|
+————-+—————-+——————-+
| sys | 33 | 0 |
| fgedu_tenant| 167 | 0 |
+————-+—————-+——————-+
# 恢复完成,总耗时15分钟
4.2 OceanBase Zone故障恢复案例
– zone2整个机房断电
– zone2所有节点宕机
– 集群降级运行
# 恢复过程
1. 故障检测
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT zone, status, region
FROM oceanbase.__all_zone;
”
+——-+———-+———+
| zone | status | region |
+——-+———-+———+
| zone1 | ACTIVE | region1 |
| zone2 | INACTIVE | region1 |
| zone3 | ACTIVE | region1 |
+——-+———-+———+
2. 检查集群降级状态
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
SELECT
COUNT(*) as total_partitions,
SUM(CASE WHEN replica_count < 3 THEN 1 ELSE 0 END) as under_replicated
FROM (
SELECT table_id, partition_id, COUNT(*) as replica_count
FROM oceanbase.__all_virtual_proxy_schema
GROUP BY table_id, partition_id
) t;
"
+------------------+------------------+
| total_partitions | under_replicated |
+------------------+------------------+
| 1000 | 334 |
+------------------+------------------+
3. 恢复机房电力
# 联系机房运维恢复电力
4. 启动zone2所有节点
$ ssh admin@192.168.1.102
$ cd /ob/app/oceanbase
$ ./bin/observer -start
$ ssh admin@192.168.1.103
$ cd /ob/app/oceanbase
$ ./bin/observer -start
5. 激活zone2
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e "
ALTER SYSTEM ACTIVATE ZONE zone2;
"
6. 验证恢复
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e "
SELECT zone, status
FROM oceanbase.__all_zone;
"
+-------+--------+
| zone | status |
+-------+--------+
| zone1 | ACTIVE |
| zone2 | ACTIVE |
| zone3 | ACTIVE |
+-------+--------+
# 恢复完成
4.3 OceanBase集群故障恢复案例
– 集群多数派节点故障
– 集群无法提供服务
– 需要从备份恢复
# 恢复过程
1. 评估故障
– zone1和zone2全部节点故障
– 仅剩zone1一个节点
– 集群无法形成多数派
2. 准备恢复环境
# 准备新的服务器
– 192.168.1.101(新)
– 192.168.1.102(新)
– 192.168.1.103(新)
3. 安装OceanBase
# 在新服务器上安装OceanBase
$ cd /ob/app/oceanbase
$ ./bin/observer –version
4. 恢复系统租户
# 从物理备份恢复
$ cd /ob/app/oceanbase
$ ./bin/observer -i eth0 -p 2881 -P 2882 -z zone1 -c 1 \
-d /ob/fgdata \
-r ‘192.168.1.101:2882:2881’ \
-o ‘memory_limit=50G,cluster_id=1,cluster_name=fgedu_cluster’
5. 恢复业务租户
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e ”
— 创建资源池
CREATE RESOURCE POOL fgedu_pool
UNIT=’fgedu_unit’,
UNIT_NUM=1,
ZONE_LIST=(‘zone1′);
— 创建租户
CREATE TENANT IF NOT EXISTS fgedu_tenant
PRIMARY_ZONE=’zone1’,
RESOURCE_POOL_LIST=(‘fgedu_pool’);
”
# 从逻辑备份恢复数据
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p < /backup/fgedudb_backup.sql
6. 扩展集群
$ obclient -h192.168.1.101 -P2881 -uroot@sys -p -e "
-- 添加其他zone
ALTER SYSTEM ADD ZONE zone2 REGION 'region1';
ALTER SYSTEM ADD ZONE zone3 REGION 'region1';
-- 添加OBServer
ALTER SYSTEM ADD SERVER '192.168.1.102:2882' ZONE 'zone2';
ALTER SYSTEM ADD SERVER '192.168.1.103:2882' ZONE 'zone3';
-- 扩展资源池
ALTER RESOURCE POOL fgedu_pool ZONE_LIST=('zone1','zone2','zone3');
"
7. 验证恢复
$ obclient -h192.168.1.101 -P2881 -uroot@fgedu_tenant -p -e "
SHOW DATABASES;
SELECT COUNT(*) FROM fgedudb.fgedu_order;
SELECT COUNT(*) FROM fgedudb.fgedu_user;
"
# 恢复完成
Part05-风哥经验总结与分享
5.1 OceanBase集群恢复最佳实践
1. 故障预防
– 多副本部署
– 跨机房部署
– 定期健康检查
– 监控告警
2. 备份策略
– 定期全量备份
– 实时日志备份
– 异地备份存储
– 备份验证测试
3. 恢复流程
– 快速故障定位
– 影响评估
– 恢复决策
– 分步恢复
– 恢复验证
4. 容灾演练
– 定期演练
– 演练记录
– 问题改进
– 预案更新
5. 文档管理
– 恢复手册
– 操作记录
– 问题知识库
– 联系方式
5.2 OceanBase恢复问题排查
1. 节点恢复问题
# 检查节点状态
SELECT * FROM oceanbase.__all_server;
# 检查副本状态
SELECT * FROM oceanbase.__all_virtual_proxy_schema;
# 检查恢复进度
SELECT svr_ip, COUNT(*), SUM(is_restore) FROM oceanbase.__all_virtual_proxy_schema GROUP BY svr_ip;
2. Zone恢复问题
# 检查Zone状态
SELECT * FROM oceanbase.__all_zone;
# 检查Zone内节点
SELECT zone, svr_ip, status FROM oceanbase.__all_server;
3. 集群恢复问题
# 检查集群状态
SELECT * FROM oceanbase.__all_cluster;
# 检查RootService
SELECT * FROM oceanbase.__all_virtual_core_meta_table;
4. 数据一致性问题
# 检查副本一致性
SELECT table_id, partition_id, COUNT(*) as replica_count
FROM oceanbase.__all_virtual_proxy_schema
GROUP BY table_id, partition_id
HAVING replica_count < 3;
5.3 OceanBase恢复常见问题
Q1: 节点启动后无法加入集群?
A1: 检查集群ID、检查网络连通性、检查时钟同步
Q2: 副本恢复进度慢?
A2: 检查网络带宽、检查磁盘IO、调整恢复并发度
Q3: Zone激活失败?
A3: 检查Zone内所有节点状态、检查网络连通性
Q4: 从备份恢复后数据不一致?
A4: 检查备份完整性、重新恢复、使用日志恢复
Q5: 集群脑裂如何处理?
A5: 停止所有节点、选择数据最新的节点启动、重新构建集群
Q6: 恢复过程中可以提供服务吗?
A6: 节点恢复期间可以提供服务,集群恢复期间需要停服
Q7: 如何加快恢复速度?
A7: 增加恢复并发、优化网络、使用SSD存储
Q8: 恢复后如何验证数据完整性?
A8: 对比数据量、校验数据校验和、运行测试查询
Q9: 备份损坏如何处理?
A9: 使用其他备份、使用日志恢复、联系技术支持
Q10: 如何预防集群故障?
A10: 多副本部署、跨机房部署、定期备份、监控告警
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
