当前位置: 首页 > article >正文

【OceanBase 诊断调优】—— 日志归档延迟或日志归档慢的原因和解决方法

问题现象

CDB_OB_ARCHIVELOG 视图中对应租户的 checkpoint_scn 字段已经落后于当前时间很多。(前提是日志归档还在进行,即 CDB_OB_ARCHIVELOG 视图中对应租户的 staus 仍然是 DOING,且 checkpoint_scn 还在往前推。)

关键信息

  1. 检查 OBServer 的网络带宽限速

    OBServer 中通过 sys_bkgd_net_percentage 用来设置备份恢复、迁移复制等系统任务的网络带宽使用比例(上限),其实际的网络带宽依据网卡速度来进行计算。如果获取到了错误的网卡速度,则实际使用的网络带宽可能偏小。

    详情参见:OBServer 如何获知网卡速度?和 网卡速度识别错误导致迁移任务执行慢的问题 判断网络带宽限速是否有问题。

  2. 检查配置项

    首先检查配置项 show parameters like "log_archive_target",该配置项用于控制日志归档的延迟时间,如果 checkpoint_scn 落后的时长和该配置项的时长差不多,则符合预期。详情参见:archive_lag_target

    如果落后时长明显大于 log_archive_target,则根据日志进一步确定原因。

  3. 查找最慢日志流

    租户的整体归档进度由最慢日志流的归档进度决定,而归档又是由日志流 Leader 进行的,所以我们需要找到最慢日志流的 Leader所在的机器。

    1. 找到最慢日志流。

      select ls_id from oceanbase.__all_virtual_ls_log_archive_progress where tenant_id = $tenant_id and  checkpoint_scn = (select checkpoint_scn from oceanbase.cdb_ob_archivelog where tenant_id = $tenant_id);
      

      将这里的 $tenant_id 替换成归档租户的租户 id。

    2. 找到最慢日志流 Leader 所在的机器。

      select svr_ip, svr_port from oceanbase.__all_virtual_ls_meta_table where tenant_id = $tenant_id  and ls_id = $ls_id and role = 1;
      

      将这里的 $tenant_id 替换成归档租户的租户 id,$ls_id 替换成上一步查询出来的 ls_id

    3. 进入到对应节点的 log 目录查询 OBServer 日志。

  4. 归档速率统计

    归档线程会定期统计过去 10 秒的归档日志量。

    grep "archive_sender statistic in 10s" observer.log.xxx observer.log
    

    打印如下日志。

    observer.log.20240621235653303:[2024-06-21 23:56:14.955385] INFO  [ARCHIVE] statistic (ob_archive_sender.cpp:893) [38513][T1002_ArcSender][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=3] archive_sender statistic in 10s(total_send_log    _size=67104768, total_send_buf_size=67104768, total_send_task_count=1, total_send_cost_ts=99872811, avg_task_lsn_size=67104768, avg_task_buf_size=67104768, avg_task_cost_ts=99872811)
    

    其中 total_send_buf_size 是归档线程发送的日志量(Byte),total_send_cost_ts 是发送日志的耗时(us),例如上述日志表示归档线程 10s 发送了 6.7MB 日志,实际归档速率只有 0.67MB/s。

  5. IO 慢日志

    当单次 IO 用时超过 1 秒时,OBServer 的 IO 接口也会打印慢日志。

    grep print_access_storage_info observer.log.xxx observer.log
    

    打印如下日志。

    z1/observer_11.161.204.236_11000/observer.log.20240616190435920:[2024-06-16 18:50:48.176611] WDIAG [STORAGE] print_access_storage_log (ob_storage.cpp:50) [119270][T1002_BACKUP_DA][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=4][errcode=0] access storage op=storage multipart writer uri=s3://xxx_bucket/obdata/data/421_storage_ha_regression/backup_file/obtest_backup/ob_backup_oracle_tenant/data/backup_set_1_full/logstream_1001/major_data_turn_1_retry_0/macro_block_data.0.obbak size=16631 Byte cost_ts=1184927 us speed=0.01 MB/s
    

    上述日志表示一次 IO 向 S3 写入了16631 Byte 的数据,写入速率是 0.01MB/s。

    如果步骤 3 (查找最慢日志流 这一节)中算出的写入速率很小,步骤 4 (归档速率统计 这一节)有大量日志打印且写入速率很小,则可以确定是备份介质慢。

  6. 确认是否触发限流

    如果备份介质是 OSS,还可以进一步检查是否触发了限流。

    grep "delay_time\=" observer.log.xxx observer.log | grep "print_oss_info"
    

    打印如下日志。

    observer.log.20240529213152163:[2024-05-29 21:31:15.383256] WDIAG print_oss_info (ob_storage_oss_base.cpp:688) [54020][T1002_BACKUP_IN][T1002][YBBD0B7C05A6-000619978DE40D30-0-0] [lt=37][errcode=0] oss info (aos_ret->code=200, aos_ret->error_code=NULL, aos_ret->error_msg=NULL, aos_ret->req_id=66572E23B32FB3303236CB92, delay_time=1 ms, oss_account_.oss_domain_=xxx, oss_endpoint_=xxx, oss_account_.oss_id_=xxx)
    

    上述日志表示触发了 OSS 的限流,单次 IO 将有 1ms 的延迟。

  7. 检查备份介质

    如果备份介质是 NFS,则检查 mount 参数和 NFS 负载是否较高,检查 NFS 负载情况,执行如下命令。

    nfsiostat 2 2
    

    如果备份介质是对象存储,则检查对应 bucket 的监控,查看是否触发限流,带宽和 RT 等参数是否正常。

问题原因

备份介质慢(OSS 慢),导致归档线程发送日志慢,从而归档的 checkpoint_scn 推得慢。

问题的风险及影响

归档进度落后,无法提供及时的可恢复位点;如果还部署了基于归档的备库,则主备库延迟可能较大。

影响租户

影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。

适用版本

OceanBase 数据库 V4.x 版本。

解决方法及规避方式

  • 解决方法:

    • 如果是 NFS 的问题,可尝试降低 NFS 负载,重新挂载 NFS 目录或重启 NFS server。

    • 如果是对象存储的问题,则联系相应的存储方面的技术服务人员处理。

  • 规避方式:

    备份介质慢,无法规避。


http://www.kler.cn/a/428866.html

相关文章:

  • 语音技术在播客领域的应用(2)
  • 【统计的思想】假设检验(一)
  • Spark RPC 学习总结
  • 【Android】蓝牙电话HFP连接源码分析
  • AudioGPT全新的 音频内容理解与生成系统
  • 西门子【Library of Basic Controls (LBC)基本控制库”(LBC) 提供基本控制功能】
  • 位运算(一)位运算简单总结
  • 总结的一些MySql面试题
  • 【Mac OS 安装 Homebrew】
  • EasyExcel注解使用
  • python GUI编程
  • C++创建型模式之生成器模式
  • compiler-core核心原理
  • 机器学习—学习过程
  • [笔记] Windows 上 Git 安装详细教程:从零开始,附带每个选项解析
  • 常见算法java语法
  • JavaScript中todolist操作--待办事项的添加 删除 完成功能
  • 实例教程:BBDB为AHRS算法开发提供完善的支撑环境(下)
  • RPA在IT运维中的实践:自动化监控与维护
  • 瑞芯微RK3566/RK3568开发板安卓11固件ROOT教程,Purple Pi OH演示
  • 【包教包会】CocosCreator3.x——重写Sprite,圆角、3D翻转、纹理循环、可合批调色板、不影响子节点的位移旋转缩放透明度
  • 【python】集合
  • 第3章:文本样式 --[CSS零基础入门]
  • 组件开发的环境准备
  • Linux用户与权限、IP地址与远程管理详解及命令
  • 【Java】类似王者荣耀游戏