【OceanBase相关】02-OceanBase数据库NFS备份实践

文章目录

一、前言

1、概述
2、备份方式
3、备份流程
4、恢复流程

二、NFS备份

1、注意事项
2、服务端配置
3、客户端配置
4、备份策略配置

三、常用操作
四、Q&A

1、数据备份任务执行失败,提示`start log archive backup when not STOP is not supported`

1.1、问题说明
1.2、解决措施

2、数据备份任务执行失败,提示`data backup pre-check failed, log backup not started`

2.1、问题说明
2.2、解决措施

五、性能调优

1、备份性能调优

1.1、备份性能分析
1.2、备份性能调优

1.2.1、网络配置调整

– 分析过程
– 解决措施

1.3、备份性能复测

一、前言

1、概述

物理备份与恢复概述

OceanBase集群支持三副本冗余机制,本身已经做了一层数据保护,OceanBase数据库提供备份恢复功能,用于增强数据库高可用,如后期出现存储介质损坏或者用户误删数据等情况导致数据丢失,可通过恢复的方式恢复用户数据
OceanBase数据库支持集群级别的物理备份,集群的物理备份指的是该集群中除 sys租户以外的其他所有租户的物理备份,物理备份由基线数据、日志归档数据两种数据组成,因此物理备份由日志归档数据备份两个功能组合而成:

日志归档是指日志数据的自动归档功能,OBServer 会定期将日志数据归档到指定的备份路径。这个动作是全自动的,不需要外部定期触发。
日志定期归档时间的计算公式如下:
日志的定期归档时间 = checkpoint_interval /2
其中,checkpoint_interval的值可由用户自行配置,详细配置操作请参见配置备份参数

数据备份指的是备份数据的功能,该功能分为全量备份增量备份两种:
全量备份是指备份所有宏块
增量备份是指备份上一次备份以后新增和修改过的宏块

2、备份方式

使用S3协议对象存储OceanBase备份 | 物理备份与恢复概述

目前支持使用NFS(文件存储)、OSS(阿里云对象存储)、COS(腾讯云对象存储)、S3(兼容S3协议对象存储,如华为云OBS、谷歌GCS)等备份介质,提供了备份、恢复、管理三大功能

官方推荐使用OSS作为备份介质,OSS作为无状态的对象存储,比有状态的NFS4有更高的稳定性,且NFS为保证数据库数据强一致性需要使用同步模式(禁用系统缓存,NFS性能会更差)
V4.2.1 BP7以上版本方可支持S3作为备份介质

3、备份流程

OceanBase支持集群级别租户级别的备份操作,且支持手动删除指定的备份和自动删除过期备份的功能

备份流程大致如下:

当用户用系统租户登录到备份集群以后,需要先用 SQL 发起日志归档,等日志归档发起完成启动阶段以后,才可以发起基线备份
日志归档是定期备份到备份目的端的,只需要用户发起一次alter system archivelog,日志备份就会在后台持续进行。日志归档是由每个 PG(Partition Group)的 Leader 负责定期将该 PG 的日志归档到备份介质指定的路径,RS(Root Service)负责定期统计日志归档的进度,并更新到内部表。
数据备份是需要用户触发的,比较常见的场景是周六触发一次全量备份,周二和周四触发一次增量备份。当用户发起数据备份请求时,该请求会首先被转发到 RS 所在的节点上;RS 会根据当前的租户和租户包含的 PG 生成备份数据的任务,然后把备份任务分发到 OBServer 上并行地执行备份任务;OBServer 负责备份 PG 的元信息和宏块到指定的备份目录,宏块按照 PG 为单位进行管理。

备份数据目录结构示意如下:

data
  tenant_data_backup_info // 记录租户级别基线备份的信息
  tenant_backup_set_file_info // 比 tenant_data_backup_info 信息更加完整
  backup_set_1_full_date // 一个全量 Backup Set,后缀以日期结尾,例如:backup_set_1_full_20211014,包含所有数据备份的宏块信息,是一个单一超大文件
    backup_set_info // 记录本次备份
    single_backup_set_info //记录本次备份,比 backup_set_info 信息更加完整
    backup_1 // 1 为 backup_set_id
      sys_pg_list
      normal_pg_list
      sys_meta_index_file_<task_id>// 系统表的索引,负责根据 pgkey 索引到对应的 PG Meta Files
      normal_meta_index_file_<task_id> // 普通表的索引
      meta_file_<task_id> // 记录 Meta 和宏块列表等信息
    
    data // 不区分版本
      pgkey
        major_data // 基线数据
          macro_block_1.<sub_task_id>   
          macro_block_index_1
          macro_block_2.<sub_task_id>
          macro_block_index_2
        minor_data // 转储数据
          task_id_1
            macro_block_1.<sub_task_id>
            macro_block_index_1
          task_id_2
            macro_block_2.<sub_task_id>
            macro_block_index_2
          
  backup_set_2_inc_date // 一个增量 Backup Set,后缀以日期结尾,例如:backup_set_2_inc_20211014
    backup_set_info // 记录本次备份
    single_backup_set_info 
    backup_2
      sys_pg_list
      normal_pg_list
      sys_meta_index_file_<task_id>
      normal_meta_index_file_<task_id>
      meta_file_<task_id>
    data
      ...
    
clog
  backup_piece_info        // Piece 相关的信息
  tenant_clog_backup_info 
  roundid_pieceid_date   // 例如:1_1_20211014 
    single_piece_info    
    archive_key
      tableid_partition_id  // 例如:1100611139403779_0
      ....
    data
      tableid               // 例如:1100611139403779
        partition_id        // 例如:0
          1                 // 数据文件
          2             
          ...
    index 
      tableid               // 例如:1100611139403779
        partition_id        // 例如:0
          1                 // 索引文件
          2          
          ..

4、恢复流程

OceanBase 支持租户级别的恢复操作,恢复是基于已有数据的备份重建新租户的过程。用户只需要一个 alter system restore tenant 命令,就可以完成整个恢复过程。
恢复过程包括租户系统表和用户表的RestoreRecover过程,Restore是将恢复需要的基线数据恢复到目标租户的 OBServer,Recover是将基线对应的日志恢复到对应 OBServer。

恢复流程大致如下:
1、在目的集群上用 CREATE RESOURCE POOL命令建立恢复租户需要的资源池
2、通过ALTER SYSTEM RESTORE TENANT命令调度租户恢复任务,对于备份恢复来说,RESTORE TENANT命令的内部流程如下:

创建恢复用的租户
恢复租户的系统表数据
恢复租户的系统表日志
调整恢复租户的元信息
恢复租户的用户表数据
恢复租户的用户表日志
恢复扫尾工作
对于单个 PG 来说,恢复的流程就是将 PG 的元信息和宏块数据拷贝到指定的 OBServer,构建出一个只有基线数据的 PG;然后再把 PG 的日志拷贝到指定的 OBServer,回放到该 PG 的 MemTable 中。这个流程中如果日志的量比较大,可能会触发转储操作。

二、NFS备份

1、注意事项

由于OceanBase数据库备份需保证数据强一致性,在操作NFS备份过程中,需要注意以下事项

添加新的机器后,在启动 OBServer 前,需要保证新的机器挂载 NFS 成功或者可以备份到其他介质。
使用 NFS 环境时,需要保证先挂载 NFS,再开启备份。如果备份期间 NFS 出现问题,需要先停止数据备份和日志备份,再解决 NFS 的问题
在重启 OBServer 所在的服务器时,需要先启动 NFS 服务,再启动 OBServer 服务
由于 OceanBase 数据库备份的并发控制需依赖 NFS4 的文件锁功能,故在挂载 NFS 时,需使用 NFS 4.1 及以上版本。
在使用 NFS 作为备份介质时,必须保证所有 OBServer 都挂载了同一个服务器的 NFS。同时,为保证备份的顺利进行,需要使用指定的参数挂载NFS

2、服务端配置

配置nfs共享服务,修改/etc/exports配置文件,更改/cephnfs/cephfs/backup目录所有者和属组为nfsnobody:nfsnobody(确保客户端nfsnobody对共享目录有读写权限)

sudo yum install nfs-utils
echo '"/cephnfs/cephfs/backup" "*"(rw,sync,all_squash,no_subtree_check)' >> /etc/exports
chown nfsnobody:nfsnobody -R /cephnfs/cephfs/backup/

配置nfs参数,修改/etc/sysconfig/nfs配置文件,重启nfs服务
RPCNFSDCOUNT=32:用于指定NFS守护进程nfsd的线程数,控制并发能力,默认为8线程,此处修改为32线程(可根据CPU核心数自行调整),可通过cat /proc/fs/nfsd/threads查看当前nfs线程数
RPCNFSDARGS="-N 2 -N 3 -U:用于指定nfsd进程启动参数,-N 2 -N 3分别表示禁用NFSv2和NFSv3,-U表示强制使用UDP协议(默认自动协商TCP/UDP)
NFSD_V4_GRACE=90:NFSv4客户端无响应时,服务器等待的宽限期(秒),用于保证数据一致性,通常NFSD_V4_GRACENFSD_V4_LEASE
NFSD_V4_LEASE=90:NFSv4客户端租约有效期(秒),决定客户端缓存元数据的时间

sed -i 's/#RPCNFSDCOUNT=16/RPCNFSDCOUNT=32/g' /etc/sysconfig/nfs
sed -i 's/RPCNFSDARGS=""/RPCNFSDARGS="-N 2 -N 3 -U"/g' /etc/sysconfig/nfs
sed -i 's/#NFSD_V4_GRACE=90/NFSD_V4_GRACE=90/g' /etc/sysconfig/nfs
sed -i 's/#NFSD_V4_LEASE=90/NFSD_V4_LEASE=90/g' /etc/sysconfig/nfs
systemctl restart nfs-config
systemctl restart nfs-server
systemctl enable nfs-server

配置系统参数,修改/etc/sysctl.conf配置文件
sunrpc.tcp_max_slot_table_entries=128:用于定义Linux内核的RPC/TCP传输中的最大槽表条目数(每个条目代表一个到RPC服务器的连接),调高该参数值可提高高并发场景下NFS客户端的连接能力,避免槽表耗尽导致连接被拒绝

echo "sunrpc.tcp_max_slot_table_entries=128" >> /etc/sysctl.conf
sudo sysctl -w sunrpc.tcp_max_slot_table_entries=128

检查相关配置是否生效

# 检查当前nfs线程数
[root@node69 ~]# cat /proc/fs/nfsd/threads
32
[root@node69 ~]# ps -ef | grep "[nfsd]" | wc -l
32
# 检查当前最大槽表条目数
[root@node69 ~]# sysctl -a | grep sunrpc.tcp_max_slot_table_entries
sunrpc.tcp_max_slot_table_entries = 128

3、客户端配置

配置系统参数,修改/etc/sysctl.conf配置文件
sunrpc.tcp_max_slot_table_entries=128:用于定义Linux内核的RPC/TCP传输中的最大槽表条目数(每个条目代表一个到RPC服务器的连接),调高该参数值可提高高并发场景下NFS客户端的连接能力,避免槽表耗尽导致连接被拒绝

echo "sunrpc.tcp_max_slot_table_entries=128" >> /etc/sysctl.conf
sudo sysctl -w sunrpc.tcp_max_slot_table_entries=128

所有OBServer节点均挂载nfs服务到本地挂载点/backup,备份挂载环境的参数中必须包含nfsvers=4.1synclookupcache=positivehard
nfsvers=4.1:由于备份依赖 nfs 4 原生的文件锁,建议使用 nfs 4.1 及以上版本,nfs 4.0 有一个已知 Bug,在重命名文件以后可能会读到旧文件
sync:使用同步写保证数据能及时刷到服务端,从而保证数据的一致性
lookupcache=positive:用于避免并发访问目录或者文件时误报目录或文件不存在的问题,保证数据的一致性
hard:在 NFS 不可用的情况下,系统会卡住应用的读写请求,以保证数据的一致性。不能使用 soft 选项,会有数据错误的风险
timeo:用于指定重试的等待时间,单位为 0.1s。在设置时,建议不要设置得过大,建议值为 600
wsize:表示写的数据块大小,建议设置为 1048576
rsize:表示读的数据块大小,建议设置为 1048576
namlen:建议设置为 255

mount -tnfs4 -o rw,nfsvers=4.1,sync,lookupcache=positive,hard,timeo=600,wsize=1048576,rsize=1048576,namlen=255 172.16.25.69:/cephnfs/cephfs/backup /backup

4、备份策略配置

访问OCP管理平台,选择备份恢复备份,新建备份策略,配置参考如下
服务名为对应OceanBase主集群名称,存储配置名根据需求自定义
存储类型设置为File,存储目录设置为/backup/(需测试存储地址是否可用,所有OBServer节点都需要挂载NFS存储到相同挂载点/backup下)
数据备份超时报警阈值设置为600分钟,日志备份延时报警阈值设置为1800秒,无成功数据备份预警天数设置为2天
过期备份清理保留天数设置为2天

集群已使用容量为副本三容量

图片[1] - 【OceanBase相关】02-OceanBase数据库NFS备份实践 - 宋马

整个备份过程会经历日志备份集群合并备份检查数据备份等阶段

三、常用操作

使用root用户登录OceanBase数据库sys租户

obclient -h172.16.25.65 -P2881 -uroot -pAAdmin@@123 -A -Doceanbase

后台手动开启日志备份任务,参考开启归档模式

obclient [oceanbase]> alter system archivelog;

后台手动强制停止所有备份任务(如出现任务卡在停止中状态,可通过此方法解决)

obclient [oceanbase]> alter system cancel all backup force;

查看日志备份任务状态,日志备份状态必须为doing才能继续后面的数据备份任务
注:参考oceanbase.CDB_OB_ARCHIVELOG,日志备份有以下几个状态
PREPARE:准备归档起点 START_SCN
BEGINNING:正在启动日志归档
DOING:正在进行日志归档
INTERRUPTED:日志归档中断,需要人工介入
STOP:日志归档已停止
STOPPING:正在停止日志归档
SUSPENDING:正在暂停日志归档
SUSPEND:日志归档已暂停

obclient [oceanbase]> select * from CDB_OB_BACKUP_ARCHIVELOG;

查看日志备份执行记录,根据rs_svr_ip字段判断当前备份任务执行所在节点,如备份出现异常,到对应执行节点/home/admin/oceanbase/log/rootservice.log/home/admin/oceanbase/log/observer.log查看集群日志

obclient [oceanbase]> select * from __all_rootservice_event_history where module like '%archive%';

四、Q&A

1、数据备份任务执行失败,提示start log archive backup when not STOP is not supported

1.1、问题说明

开启集群物理备份,执行到Start log backup if necessary阶段失败,错误提示信息如下

2025-04-10 13:46:23.228 ERROR 65 --- [pool-manual-subtask-executor16,c9ef3ffe4a3c4351,6c5edb83c168] c.a.o.c.obsdk.connector.ConnectTemplate  : [obsdk] execute failed, sql:[alter system archivelog], error message:[StatementCallback; SQL [alter system archivelog]; (conn=524626) start log archive backup when not STOP is not supported; nested exception is java.sql.SQLFeatureNotSupportedException: (conn=524626) start log archive backup when not STOP is not supported]
2025-04-10 13:46:23.238 ERROR 65 --- [pool-manual-subtask-executor16,c9ef3ffe4a3c4351,6c5edb83c168] c.o.o.b.i.o.PhysicalBackupObOpsService   : SQL [alter system archivelog]; SQL state [0A000]; error code [1235]; message [(conn=524626) start log archive backup when not STOP is not supported]
2025-04-10 13:46:23.249  INFO 65 --- [pool-manual-subtask-executor16,c9ef3ffe4a3c4351,6c5edb83c168] c.a.o.c.m.t.model.SubtaskInstanceEntity  : Set state for subtask: 3027869, current state: RUNNING, new state: FAILED

访问对应集群管理界面,选择备份恢复备份任务日志备份,查看对应备份任务状态为停止中,无法成功停止日志备份任务

1.2、解决措施

参考OceanBase 数据库备份任务处于 BEGINING 或 STOPPING 状态问题处理,后台手动停止所有备份任务,之后再次启动备份任务

使用root用户登录OceanBase数据库sys租户

[root@node65 ~]# obclient -h172.16.25.65 -P2881 -uroot -pAAdmin@@123 -A -Doceanbase
Welcome to the OceanBase.  Commands end with ; or g.
Your OceanBase connection id is 3221613691
Server version: OceanBase 3.2.4.1 (r101000052023010822-346aa35c32e99d1b82d713f75f0072c45bdf7aab) (Built Jan  8 2023 22:54:29)
obclient [oceanbase]>

检查日志备份任务处于STOPPING状态,检查备份路径是正确的

obclient [oceanbase]> select * from oceanbase.CDB_OB_BACKUP_ARCHIVELOG;
+-------------+-------------------+-----------+----------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
| INCARNATION | LOG_ARCHIVE_ROUND | TENANT_ID | STATUS   | START_PIECE_ID | BACKUP_PIECE_ID | MIN_FIRST_TIME             | MAX_NEXT_TIME | INPUT_BYTES | OUTPUT_BYTES | COMPRESSION_RATIO | INPUT_BYTES_DISPLAY | OUTPUT_BYTES_DISPLAY |
+-------------+-------------------+-----------+----------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
|           1 |                 1 |         1 | STOPPING |              0 |               0 | 2025-04-09 16:20:25.708929 |               |           0 |            0 |              NULL | 0.00MB              | 0.00MB               |
+-------------+-------------------+-----------+----------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
1 row in set (0.015 sec)

obclient [oceanbase]> show parameters like 'backup_dest';
+-------+----------+--------------+----------+-------------+-----------+----------------+-------------+----------+---------+---------+-------------------+
| zone  | svr_type | svr_ip       | svr_port | name        | data_type | value          | info        | section  | scope   | source  | edit_level        |
+-------+----------+--------------+----------+-------------+-----------+----------------+-------------+----------+---------+---------+-------------------+
| zone1 | observer | 172.16.25.65 |     2882 | backup_dest | NULL      | file:///backup | backup dest | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone3 | observer | 172.16.25.67 |     2882 | backup_dest | NULL      | file:///backup | backup dest | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone2 | observer | 172.16.25.66 |     2882 | backup_dest | NULL      | file:///backup | backup dest | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
+-------+----------+--------------+----------+-------------+-----------+----------------+-------------+----------+---------+---------+-------------------+
3 rows in set (0.043 sec)

后台手动强制停止所有备份任务,此时再次查看日志备份任务已变更为STOP ,日志备份已成功停止,之后web再次执行备份任务即可

obclient [oceanbase]> alter system cancel all backup force;
Query OK, 0 rows affected (0.235 sec)

obclient [oceanbase]> select * from oceanbase.CDB_OB_BACKUP_ARCHIVELOG;
+-------------+-------------------+-----------+--------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
| INCARNATION | LOG_ARCHIVE_ROUND | TENANT_ID | STATUS | START_PIECE_ID | BACKUP_PIECE_ID | MIN_FIRST_TIME             | MAX_NEXT_TIME | INPUT_BYTES | OUTPUT_BYTES | COMPRESSION_RATIO | INPUT_BYTES_DISPLAY | OUTPUT_BYTES_DISPLAY |
+-------------+-------------------+-----------+--------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
|           1 |                 1 |         1 | STOP   |              0 |               0 | 2025-04-09 16:20:25.708929 |               |           0 |            0 |              NULL | 0.00MB              | 0.00MB               |
+-------------+-------------------+-----------+--------+----------------+-----------------+----------------------------+---------------+-------------+--------------+-------------------+---------------------+----------------------+
1 row in set (0.002 sec)

如web再次执行备份任务出现backup destination is not valid,检查/backup目录使用nfsnobody用户能否读写,如有此前残留的备份文件可删除掉后再试

# 检查集群目录无读写权限,手动删除此前的备份目录数据
[root@node67 ~]# ll /backup/cluster01/
ls: cannot open directory '/backup/cluster01/': Permission denied
[root@node67 ~]# rm -rf /backup/cluster01/
# 此时再次执行备份任务,未出现backup destination is not valid错误
obclient [oceanbase]> alter system set backup_dest='file:///backup/';
ERROR 9026 (HY000): backup destination is not valid
obclient [oceanbase]>
obclient [oceanbase]> alter system set backup_dest='file:///backup/';
Query OK, 0 rows affected (0.075 sec)

2、数据备份任务执行失败,提示data backup pre-check failed, log backup not started

2.1、问题说明

开启集群物理备份,执行到Start log backup if necessary阶段失败,错误提示信息如下

2025-04-10 14:06:35.533 ERROR 65 --- [pool-manual-subtask-executor17,934c41f1e4ae4340,5632ec456439] c.o.o.b.i.o.PhysicalBackupTaskService    : data backup pre-check failed, log backup not started
2025-04-10 14:06:35.546  INFO 65 --- [pool-manual-subtask-executor17,934c41f1e4ae4340,5632ec456439] c.a.o.c.m.t.model.SubtaskInstanceEntity  : Set state for subtask: 3028091, current state: RUNNING, new state: FAILED

2.2、解决措施

查看当前备份任务执行所在节点(rs_svr_ip)为172.16.25.65节点

[root@node65 ~]# obclient -h172.16.25.65 -P2881 -uroot -pAAdmin@@123 -A -Doceanbase
obclient [oceanbase]> select * from __all_rootservice_event_history where module like '%archive%';
+----------------------------+-------------+--------------------------+------------+-----------+----------+--------+----------+--------+--------+--------+-------+--------+-------+--------+------------+--------------+-------------+
| gmt_create                 | module      | event                    | name1      | value1    | name2    | value2 | name3    | value3 | name4  | value4 | name5 | value5 | name6 | value6 | extra_info | rs_svr_ip    | rs_svr_port |
+----------------------------+-------------+--------------------------+------------+-----------+----------+--------+----------+--------+--------+--------+-------+--------+-------+--------+------------+--------------+-------------+
| 2025-04-09 16:20:25.802432 | log_archive | handle_start_log_archive | new_status | BEGINNING | round_id | 1      | piece_id | 0      | result | 0      |       |        |       |        |            | 172.16.25.65 |        2882 |
+----------------------------+-------------+--------------------------+------------+-----------+----------+--------+----------+--------+--------+--------+-------+--------+-------+--------+------------+--------------+-------------+

到对应备份任务执行节点查看集群日志信息,发现创建备份子目录失败,提示failed to create parent dir(ret=-4009, path="/backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@", errno=122, errno="Disk quota exceeded"),确认为NFS备份目录深度限制导致

[root@node65 admin]# tail -f /home/admin/oceanbase/log/rootservice.log | grep fail
[2025-04-10 16:05:43.112125] WDIAG [STORAGE] ob_storage_file.cpp:287 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=5] [dc=0][errcode=-4009] failed to create parent dir(ret=-4009, path="/backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@", errno=122, errno="Disk quota exceeded")
[2025-04-10 16:05:43.112175] WDIAG [STORAGE] ob_storage.cpp:350 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=43] [dc=0][errcode=-4009] failed to mkdir(ret=-4009, uri=file:///backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@, storage_info=)
[2025-04-10 16:05:43.112184] WDIAG ob_esi.cpp:2515 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=5] [dc=0][errcode=-4009] failed to mkdir dir(ret=-4009, uri=file:///backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@)
[2025-04-10 16:05:43.112195] WDIAG [STORAGE] ob_esi.cpp:1636 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=5] [dc=0][errcode=-4009] failed to write single file(ret=-4009, cost_ts=1034, retry_times=0, util_.max_retry_duraion_us_=0, true_file_name_uri=file:///backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info)
[2025-04-10 16:05:43.112205] WDIAG [SHARE] ob_log_archive_backup_info_mgr.cpp:3544 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=4] [dc=0][errcode=-4009] failed to write single file(ret=-4009, path={cur_pos:79, path:"file:///backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info"}, version=5)
[2025-04-10 16:05:43.112235] WDIAG [SHARE] ob_log_archive_backup_info_mgr.cpp:3221 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=3] [dc=0][errcode=-4009] failed to update single external backup piece(ret=-4009, piece={has_prev_piece_info:false, cur_piece_info:{key:{incarnation:1, tenant_id:1003, round_id:2, backup_piece_id:0, copy_id:0}, create_date:20250410, status:0, file_status:0, start_ts:1744009358024376, checkpoint_ts:0, max_ts:9223372036854775807, backup_dest:"file:///backup/", status_str:"ACTIVE", file_status_str:"AVAILABLE", compatible:1, start_piece_id:0}})
[2025-04-10 16:05:43.112263] WDIAG [RS] ob_log_archive_scheduler.cpp:1686 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=18] [dc=0][errcode=-4009] failed to update external log archive backup piece(ret=-4009, tenant_info={status:{tenant_id:1003, copy_id:0, start_ts:1744009358024376, checkpoint_ts:0, status:2, incarnation:1, round:2, status_str:"BEGINNING", is_mark_deleted:false, is_mount_file_created:false, compatible:1, backup_piece_id:0, start_piece_id:0}, backup_dest:"file:///backup/"})
[2025-04-10 16:05:43.112899] WDIAG [RS] ob_log_archive_scheduler.cpp:1364 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=32] [dc=0][errcode=-4009] failed to prepare_tenant_log_archive_status(ret=-4009)
[2025-04-10 16:05:43.112922] WDIAG [RS] ob_log_archive_scheduler.cpp:757 [6778][0][YB42AC101941-000632417A534E93-0-0] [lt=3] [dc=0][errcode=-4009] failed to do schedule(ret=-4009)

修改NFS存储目录深度限制和单文件大小限制后解决

[root@node65 ~]# mkdir /backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@
mkdir: cannot create directory ‘/backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@’: Disk quota exceeded
[root@node65 ~]# ll /backup/cluster01/1743989205/incarnation_1/1003/clog/2/
total 0
[root@node65 ~]# mkdir /backup/cluster01/1743989205/incarnation_1/1003/clog/2/single_piece_info_@versionset@ -p
[root@node65 ~]# 

五、性能调优

备份恢复性能调优

1、备份性能调优

1.1、备份性能分析

使用不同存储方案出nfs提供给OceanBase数据库备份,实测备份速度相差不大,备份峰值大概只有240MB/s

在OBServer节点nfs挂载执行fio测试,实测本地SSD方案sync模式下写入带宽可达到1053MB/s,排除存储性能问题,备份性能受限于OceanBase数据库

fio -filename=/backup/fio_test -direct=1 -rw=randwrite -bs=2048K -size=100G -runtime=600 -group_reporting -name=mytest -ioengine=libaio -numjobs=1 -iodepth=64 -iodepth_batch=8 -iodepth_low=8 -iodepth_batch_complete=8

1.2、备份性能调优
1.2.1、网络配置调整
– 分析过程

网络配置项sys_bkgd_net_percentage用于限制后台系统任务(包含备份恢复任务)可占用总网络带宽的百分比,默认值为服务器网卡速率的60%,将sys_bkgd_net_percentage设置为合适的值有助于备份恢复任务在不影响前台业务的前提下充分利用网络带宽资源

登录OBServer节点后台,查看集群observer日志文件/home/admin/oceanbase/log/observer.log,查询日志信息如下
sys_bkgd_net_percentage_=60:表示后台系统任务可占用的网络带宽为机器网卡速率的 60%
network_speed=131072000:表示OceanBase数据识别服务器网卡的最大速率为131072000 B/s,即125 MB/s
rate=78643200:表示限速后的最大速率为78643200 B/s,即75 MB/s,3个OBServer节点加起来为225 MB/s,与上述备份性能测试结果大致吻合,怀疑是网卡速率识别有误限制了备份速度

[root@node67 ~]# cd /home/admin/oceanbase/
[root@node67 oceanbase]# grep -E 'print band limit|succeed to init_bandwidth_throttle' log/observer.log*
log/observer.log.20250407142253470:[2025-04-07 14:17:16.568354] INFO  [SERVER] ob_server.cpp:2073 [68192][0][Y0-0000000000000000-0-0] [lt=3] [dc=0] succeed to init_bandwidth_throttle(sys_bkgd_net_percentage_=60, network_speed=131072000, rate=78643200)
log/observer.log.20250410163811453:[2025-04-10 16:38:07.219859] INFO  [COMMON] utility.cpp:1508 [69930][0][YB42AC101943-0006322A4855261B-0-0] [lt=6] [dc=0] print band limit(comment="out", copy_KB=4, sleep_ms_sum=0, speed_KB_per_s=0, total_sleep_ms=0, total_bytes=4096, rate_KB/s=78643200, print_interval_ms=267350542)

登录OBServer节点后台,由于是虚拟机缘故,操作系统无法识别到服务器网卡速率

[root@node67 ~]# ip add | grep LOWER_UP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
[root@node67 ~]#
[root@node67 ~]# ethtool enp1s0
Settings for enp1s0:
        Supported ports: [  ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Link detected: yes
– 解决措施

网卡速率检查

OceanBase 会优先从 {WORK_DIR}/etc/nic.rate.config 配置文件中获取网卡速率的设置,如果该配置文件不存在,OceanBase 会尝试从操作系统查询网卡速率。 如果以上两者都无法获取到网卡速率时,则会采用默认配置。该配置往往因为和实际不符,导致迁移复制的时候网速很慢,主备库延迟过高,进而产生严重问题
注:{WORK_DIR}表示OceanBase数据库安装路径,一般为/home/admin/oceanbase

所有OBServer节点新增/home/admin/oceanbase/etc/nic.rate.config配置文件,修改当前网卡速率为10Gb/s,参照格式为$(IF_NAME)=$(SPEED)(SPEED为纯数字时,默认单位为Mbps)

[root@node67 oceanbase]# echo "enp1s0=10gbit" > /home/admin/oceanbase/etc/nic.rate.config

查看当天observer日志,确认相关修改已生效,此时识别服务器网卡速率为1280 MB/s,单节点后台系统任务限速为768 MB/s,3节点总限速为2304 MB/s

[root@node67 oceanbase]# grep -E "network speed changed|reload_bandwidth_throttle_limit|init_bandwidth_throttle" log/observer.log*
log/observer.log.20250418113252057:[2025-04-18 11:32:32.941672] INFO  [SERVER] ob_server.cpp:2440 [8081][0][Y0-0000000000000000-0-0] [lt=53] [dc=0] network speed changed(from=131072000, to=1342177280)
log/observer.log.20250418113252057:[2025-04-18 11:32:32.941713] INFO  [SERVER] ob_server.cpp:2110 [8081][0][Y0-0000000000000000-0-0] [lt=3] [dc=0] succeed to reload_bandwidth_throttle_limit(old_percentage=60, new_percentage=60, network_speed=1342177280, rate=805306368)
1.3、备份性能复测

备份文件大小为458.74GB,集群使用3个OB节点,整个数据备份会分为3个OB节点备份、2个OB节点备份、1个OB节点备份三个阶段,故备份速度会逐步下滑
调整后台系统任务限速相关设置后,OceanBase数据备份速度最高可达到2016 MB/s

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容