技术分享 | OceanBase 手滑误删了数据文件怎么办

当OceanBase集群中数据文件丢失,可以通过调整server_permanent_offline_time参数,快速永久下线并重建节点,实现数据恢复。该方法涉及节点停止、参数设置、数据副本迁移和节点重启等步骤。

作者:张乾

外星人2号,现兼任六位喵星人的资深铲屎官。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


手滑误删了数据文件,并且没有可替换的节点时,先别急着提桶跑路,可以考虑利用参数 server_permanent_offline_time 来重建受影响的节点。

原理:

server_permanent_offline_time 是 OceanBase 数据库中用于控制节点永久下线时长的参数。当集群中的某个节点宕机后,系统会根据该参数的设置值来进行相应操作。

如果节点宕机时间小于该参数设置的值,系统会暂时不做处理,以避免频繁的数据迁移;如果宕机时间超过该参数设置的值,该节点被标记为永久下线,RootService 会将该 OBServer 上包含的数据副本从 Paxos 成员组中删除,并在同 zone 内其他可用 OBServer 上补充数据,以保证数据副本 Paxos 成员组完整。该参数默认值是 3600 秒,一般设置较大,以避免不必要的副本复制。此外,当永久下线的节点重新被拉起后,其上的全部数据都需要从其他副本重新拉取。

在本场景下,即是通过调低该参数,让故障节点快速永久下线再重新上线,达到数据重建的目的。

请注意,此过程会占用集群一定的资源,可能会影响性能,因此建议在业务低峰期进行。

官方建议

关于 server_permanent_offline_time 的适用场景和建议值,官方提供如下:

  1. OceanBase 数据库版本升级场景:建议将该配置项的值设置为72h。
  2. OBServer 硬件更换场景:建议将该配置项的值设置为4h。
  3. OBServer 清空上线场景:建议将该配置项的值设置为10m,使集群快速上线。

准备过程

预备一套环境

使用OBD工具快速部署一套3节点OB以及一个OBProxy,再创建好一个租户sysbench_tenant,primary_zone为RANDOM。

注:本文基于OB 3.1.2版本,其他版本需注意另作验证。
在这里插入图片描述

准备些数据

使用 sysbench 创建一个表 sbtest1 并插入1W数据。

sysbench ./oltp_insert.lua --mysql-host=10.186.60.3 --mysql-port=2883 --mysql-db=sysbenchdb --mysql-user="sysbench@sysbench_tenant"  --mysql-password=sysbench --tables=1 --table_size=10000 --threads=1 --time=600 --report-interval=10 --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016,1062,5157,4038 prepare

这里改写了 sysbench 的建表语句,分了3个区,查询 sbtest1 表分区副本分布如下

MySQL [oceanbase]> select tenant.tenant_name, zone, svr_ip,svr_port, case when role=1 then 'leader' when role=2 then 'follower' else NULL end as role, count(1) as partition_cnt from __all_virtual_meta_table meta  inner join __all_tenant tenant  on meta.tenant_id=tenant.tenant_id inner join __all_virtual_table tab  on meta.tenant_id=tab.tenant_id and meta.table_id=tab.table_id where tenant.tenant_id=1001 and tab.table_name='sbtest1' group by  tenant.tenant_name,zone, svr_ip,svr_port, 5 order by  tenant.tenant_name, zone, svr_ip, role desc;
+-----------------+-------+--------------+----------+----------+---------------+
| tenant_name     | zone  | svr_ip       | svr_port | role     | partition_cnt |
+-----------------+-------+--------------+----------+----------+---------------+
| sysbench_tenant | zone1 | 10.186.64.74 |     2882 | leader   |             1 |
| sysbench_tenant | zone1 | 10.186.64.74 |     2882 | follower |             2 |
| sysbench_tenant | zone2 | 10.186.64.75 |     2882 | leader   |             1 |
| sysbench_tenant | zone2 | 10.186.64.75 |     2882 | follower |             2 |
| sysbench_tenant | zone3 | 10.186.64.79 |     2882 | leader   |             1 |
| sysbench_tenant | zone3 | 10.186.64.79 |     2882 | follower |             2 |
+-----------------+-------+--------------+----------+----------+---------------+

开始实验

使用 sysbench 持续写入数据,维持一定的流量,便于在节点重建后对比各节点数据是否一致。

sysbench ./oltp_insert.lua --mysql-host=10.186.60.3 --mysql-port=2883 --mysql-db=sysbenchdb --mysql-user="sysbench@sysbench_tenant"  --mysql-password=sysbench --tables=1 --table_size=10000 --threads=1 --time=300 --report-interval=10 --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016,1062,5157,4038 run
删除某节点的数据文件

选择zone3下的10.186.64.79节点,将数据文件删除。

[root@localhost data]# rm -rf 1/sstable/block_file
[root@localhost data]# cd 1/sstable/
[root@localhost sstable]# ll
total 0
永久下线故障节点

1.调小参数 server_permanent_offline_time ,缩短节点永久下线时间

server_permanent_offline_time 默认值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值