【OceanBase系列】—— OceanBase应急三板斧

news2025/1/11 12:50:20

作者:

花名:洪波, OceanBase 数据库解决方案架构师

目前随着OceanBase数据库越来越流行,社区已经有很多用户在生产环境使用了OceanBase,也有不少用户的核心业务用到了OceanBase数据库,在使用OceanBase数据库过程中,难免会遇到各种各样的问题需要应急处理,特别是在遇到集群故障或者出现集群变慢、SQL响应超时的情况,为了保证业务能够快速恢复,就需要DBA人为介入对集群进行运维管理,帮助集群快速恢复以提供业务服务。

本文主要针对当出现OceanBase集群变慢或者出现节点故障的情况,提供应急处理的几个招式,帮助业务快速止血恢复降低事故影响范围,当然很多时候故障场景会复杂很多,一定要根据具体情况执行对应的恢复流程。以下列几个常见场景,后续还会持续更新,加入新场景进来。

常见场景

场景一:当出现节点故障,业务停服或报错情况

场景二:数据库响应变慢,SQL响应延迟(RT)明显变高

场景三:业务偶发卡顿,机器CPU飙升

场景四:日志盘(clog)满,导致集群出现问题

场景五:数据盘(data)满,导致集群出现问题

应急处理方式

场景一:当出现节点故障,业务停服或报错情况

现象:收到主机不可用或者observer不可用告警,业务反馈大量报错

第一步:首先快速检查主机可用性、网络连通行,排除因为网络抖动等导致的误报。

第二步:检查故障主机或连接不通的主机是否影响集群多数派。

  • 故障节点占多数派
    • 确认主机或者网络故障原因,评估是否能够快速恢复,如果可以,尽快恢复;
    • 如果不能快速恢复,则快速进行主备切换,将流量切换到备租户/备集群;
    • 主集群问题解决之后,等流量低峰期,再将业务切回到主库
  • 故障节点占少数派
    • 确认主机或者网络故障原因,评估是否能够快速恢复,如果可以,尽快恢复;
    • 如果不能快速恢复,则尝试登陆sys租户,如果可以登陆,进入第三步,如果不能登陆,跳到第四步;

第三步:如果可以登陆sys租户,检查各节点状态,以及各日志流状态

# 检查集群各节点状态
select * from OceanBase.DBA_OB_SERVERS;
# 检查集群各租户的日志流状态
select * from OceanBase.__all_ls_status;

正常情况下,可依赖OceanBase自身高可用机制,自动执行重新选举,选出新的leader,8秒内可快速恢复,如果未选出新的leader,几分钟内无法快速定位故障原因,业务着急恢复,则执行操作一

操作一:stop节点,将故障节点进行隔离,隔离之前,建议先检查下永久下线参数server_permanent_offline_time的值,默认为1小时,建议将其调大一点,防止节点故障超过一个小时未恢复而被提出集群:

# 检查永久下线参数值
show parameters like "%server_permanent_offline_time%";
# 停止节点,隔离故障节点
ALTER SYSTEM STOP SERVER 'svr_ip1:svr_port1';

在执行操作一之后2分钟还没有没恢复,执行操作二

操作二:对受到影响的租户进行切主操作,如果random配置,无脑选一个不包含问题observer的zone进行切主操作。

 ALTER TENANT tenant1 primary_zone='不包含问题observer的zone';

执行操作二之后,3分钟还没有缓解迹象,执行操作三

操作三:重启observer集群

如果集群是通过obd管理,则直接执行obd cluster restart 命令重启,具体如下:

obd cluster restart 集群名称 -c oceanbase-ce -- 重启整个ob集群

obd cluster restart 集群名称 -c oceanbase-ce -s xx.xx.xx.xx,xx.xx.xx.xx -- 只重启ob集群指定节点

如果集群是通过ocp管理,则在ocp管理页面上,执行集群重启

执行完操作三之后5分钟没有恢复迹象,则立刻执行主备集群切换,因为此时主租户已不可用,只能执行failover的切换,通过备集群的sys租户,执行切换命令

ALTER SYSTEM ACTIVATE STANDBY TENANT = tenant_name;

查询 DBA_OB_TENANTS 视图,确认备租户是否已切换为主租户

SELECT TENANT_NAME, TENANT_TYPE, TENANT_ROLE, SWITCHOVER_STATUS FROM oceanbase.DBA_OB_TENANTS;

这里需要注意:Failover 操作通常是在主租户出现无法恢复的故障时所做的切换行为。执行 Failover 操作后,对应的备租户角色会变换成 PRIMARY。同时,如果对主租户故障前一直正常同步的备租户执行 Failover 操作,则执行 Failover 操作后,一般会产生百毫秒级别的数据损失,执行时间一般为秒级。

第四步:如果不能正常登陆sys租户

操作一:执行observer节点重启,restart observer

查看另外两个zone上任意两台observer上的 /home/admin/oceanbase/etc/obcluster.config.bin 确认当前RS所在服务器的ip地址

strings observer.config.bin | grep rootservice_list

后依次针对RS执行串行重启应急操作。

3分钟没有缓解迹象。

操作二:fail over/restart cluster (切主备集群/重启集群),切换和重启方式同第三步。

场景二:数据库响应变慢,SQL响应延迟(RT)明显变高

现象:数据库响应变慢,收到SQL响应超时报错,监控中SQL执行时间陡升

第一步:确认机器网络、磁盘IO延迟情况,排除因网络延迟、磁盘IO性能等问题导致的SQL响应延迟增高;

第二步:登陆ocp,查看租户的SQL诊断,进入到 top sql/slow sql/可疑sql 中,检查是否有异常sql

检查点一:执行计划是否变差

进入到具体的SQL中,下方执行计划,可查看该SQL实际执行的执行计划,检查是否合理

如果不合理,则可以手动将SQL与某个合理的执行计划进行绑定,或创建outline进行指定

检查点二:SQL是否存在过多等待事件

在SQL诊断中,在TopSQL/SlowSQL页面,打开列管理,选择需要查看的具体指标,这里可以关注几个重要指标,如最长等待事件、IO等待时间、返回行数、访问分区数、RPC次数、等待次数等。

如发现有异常情况,评估是否可以通过增加索引或修改SQL逻辑等方式,对SQL进行优化。

第三步:如果以上都未发现有明显异常,则检查租户是否有资源瓶颈,通过对日志中租户的dump信息进行检查,查看租户的队列是否存在积压情况

grep "dump tenant info(tenant={id:租户ID," observer.log

检查dump信息中total_size大小,如果大于0,则存在一定的队列积压,租户资源遇到一定瓶颈。

方案一:对租户进行扩容,修改租户的resource unit,增加cpu、内存资源;或者为集群加入新的observer,然后修改租户的unit数量等;

方案二:对SQL执行限流操作,可在OCP中直接针对某条SQL设置限流

场景三:业务偶发卡顿,机器CPU飙升

现象:收到CPU使用率高的告警,SQL响应延迟突然变高,监控中CPU使用率飙升

第一步:通过 top 命令,确认是observer进程导致的CPU使用率升高,如果不是observer进程导致,尽快排查其他进程导致CPU升高原因;

第二步:通过 top -H 命令,检查导致CPU使用率过高的observer线程,如果是TNT_L0_xx线程,则在CPU高场景下收集3次obstack,然后可以寻求官方协助,如问答区提问。如果不是这类线程导致,则进行第三步;

第三步:如果不是以上问题,则大概率是top/slow sql导致,进入到OCP中的SQL诊断里,可根据SQL的CPU占比进行排序,快速找到CPU使用率过高的SQL

然后对SQL进行排查:

检查点一:是否在短时间内生成大量执行计划,即短时间内大量的不同SQL请求、或者相同SQL加了不同的 hint 导致每次SQL执行都要重新生成执行计划;

检查点二:CPU占比高的SQL执行计划是否合理,同场景二中的处理方式,可对SQL执行计划进行绑定;

检查点三:是否存在计算量大的SQL,如存在此类SQL,可对SQL执行限流操作,或进行资源组的隔离。

场景四:日志盘(clog)满,导致集群出现问题

现象:收到磁盘告警,业务报错,无法执行写入和更新的SQL,无法选举和缺副本等

第一步:根据告警及现象,判断出现问题的租户;

第二步:登陆sys租户,通过如下SQL查看对应租户log_disk使用情况

select a.svr_ip,a.svr_port,a.tenant_id,b.tenant_name,
CAST(a.data_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) data_disk_use_G, 
CAST(a.log_disk_size/1024/1024/1024 as DECIMAL(15,2)) log_disk_size, 
CAST(a.log_disk_in_use/1024/1024/1024 as DECIMAL(15,2)) log_disk_use_G,
log_disk_in_use/log_disk_size 'usage%'
from __all_virtual_unit a,dba_ob_tenants b 
where a.tenant_id=b.tenant_id;

第三步:通过如下SQL检查集群的log_disk磁盘空间是否已经分配完,如果log_disk_free为0,则表示已分配完

select zone,concat(SVR_IP,':',SVR_PORT) observer,
cpu_capacity_max cpu_total,cpu_assigned_max cpu_assigned,
cpu_capacity-cpu_assigned_max as cpu_free,
round(memory_limit/1024/1024/1024,2) as memory_total,
round((memory_limit-mem_capacity)/1024/1024/1024,2) as system_memory,
round(mem_assigned/1024/1024/1024,2) as mem_assigned,
round((mem_capacity-mem_assigned)/1024/1024/1024,2) as memory_free,
round(log_disk_capacity/1024/1024/1024,2) as log_disk_capacity,
round(log_disk_assigned/1024/1024/1024,2) as log_disk_assigned,
round((log_disk_capacity-log_disk_assigned)/1024/1024/1024,2) as log_disk_free,
round((data_disk_capacity/1024/1024/1024),2) as data_disk,
round((data_disk_in_use/1024/1024/1024),2) as data_disk_used,
round((data_disk_capacity-data_disk_in_use)/1024/1024/1024,2) as data_disk_free
from gv$ob_servers;

第四步:如果上面SQL查出来log_disk_free还有剩余空间,则直接扩容该租户的log_disk大小,通过如下SQL

ALTER RESOURCE UNIT unit_name
LOG_DISK_SIZE = 'NEW SIZE';

如果log_disk_free空间为0,则检查机器操作系统磁盘是否已经全部分配给OceanBase集群的日志盘,如果有剩余空间,可以修改集群级别log_disk_size 或者log_disk_percentage,增加OceanBase集群的log_disk大小,然后再通过上面命令,增加租户的log_disk大小,修改log_disk_size和log_disk_percentage SQL如下

ALTER system SET log_disk_size = 'NEW SIZE';
ALTER system SET log_disk_percentage = NEW PERCENTAGE;

第五步:如果OceanBase集群log_disk已分配完,并且操作系统上的磁盘也已经被分配完,则主动停止租户的写入,防止 clog 盘临时腾挪的空间再次快速被业务写入打满,无法修复

第六步:停止集群写入后,临时调大 clog 盘停写的阈值比例,由 95% 调整到 98%,通过如下命令调整;

ALTER system SET log_disk_utilization_limit_threshold  = 98;

观察一段时间,多数情况下 clog 追上后,集群可以恢复。如果还未恢复,扩容操作系统磁盘空间来增加足够的log_disk空间。

场景五:数据盘(data)满,导致集群出现问题

现象:收到磁盘告警,日志中出现ERROR,无法转储、无法合并等,导致集群无法写入

第一步:登陆sys租户,通过如下命令查看当前集群各节点数据盘使用情况

select svr_ip,svr_port,
round(total_size/1024/1024/1024,2) total_size, 
round(used_size/1024/1024/1024,2) used_size,
round(free_size/1024/1024/1024,2) free_size
from __all_virtual_disk_stat;

第二步:检查存放数据盘的操作系统磁盘,是否还有空间可以分配,如果有空间可以分配,则修改集群级别的参数datafile_disk或者datafile_disk_percentage,增加数据库的数据盘大小,通过如下命令:

ALTER system SET datafile_disk_percentage = 98;
ALTER system SET datafile_disk = 'NEW SIZE'

第三步:如果操作系统磁盘没有可用空间分配,则考虑对磁盘进行扩容,如果也无法扩容,则可以通过对集群扩容节点 + 迁移Unit的方式来均衡数据。

第四步:扩容节点,通过OCP等工具,给集群的zone中新增机器,然后使用 OCP 进行手动迁移。登陆OCP中对应的集群中,在资源管理页面,可以通过点击 Unit 后的规格进行资源的迁移操作,迁移只能在单个zone内进行。

以上简单总结了五种常见问题场景处理方式,大家可以做个简单参考。另外,这里再强烈推荐一款工具,可以用来帮忙我们快速定位问题的根因:OceanBase 敏捷诊断工具(obdiag)

OceanBase 敏捷诊断工具(obdiag)介绍

OceanBase 敏捷诊断工具 obdiag 是一款适用于 OceanBase 的黑屏诊断工具,obdiag 现有功能包含了对于 OceanBase 日志、SQL Audit 以及 OceanBase 进程堆栈等信息进行的扫描、收集,可以在 OceanBase 集群不同的部署模式下(OCP,OBD 或用户根据文档手工部署)实现一键执行,完成诊断信息的获取。

obdiag 主要包含四大块内容:

  1. 一键集群巡检:使用 obdiag check 命令可帮助 OceanBase 数据库集群相关状态巡检,目前支持从系统内核参数、内部表等方式对 OceanBase 的集群进行分析,发现已存在或可能会导致集群出现异常问题的原因分析并提供运维建议;
  2. 一键根因分析:使用 obdiag rca 命令可帮助 OceanBase 数据库相关的诊断信息分析,目前支持对 OceanBase 的异常场景进行分析,找出可能导致问题的原因;
  3. 一键诊断分析:使用 obdiag analyze 命令可帮助 OceanBase 数据库相关的诊断信息分析,目前支持对 OceanBase 的日志进行分析,找出发生过的错误信息;
  4. 一键信息收集:分为常规信息收集和场景化信息收集,使用 obdiag gather 命令可帮助 OceanBase 数据库相关的诊断信息收集,使用 obdiag gather scenes 命令可以一键执行将某些问题场景所需要的排查信息统一捞回,解决分布式节点信息捞取难的痛点;

对于上面节点故障的场景,我们可以通过如下的 obdiag 命令进行分析。执行完成之后,会自动生成一份报告,显示日志中的ERROR信息,帮忙我们快速定位。

obdiag analyze log --from "故障开始时间" --to "故障结束时间"

如果短时间没办法分析出原因,可以先将日志收集下来以备后续进行问题定位,通过下面的 obdiag 命令可收集故障时间段的所有日志

obdiag gather log --from "故障开始时间" --to "故障结束时间"
obdiag gather obproxy_log --from "故障开始时间" --to "故障结束时间"

像磁盘满等问题,实际上可以通过一键集群巡检,提前发现这类问题,运行如下 obdiag check 命令,可以对集群整体健康状况做一次检查,包括操作系统各项配置、数据库各项配置等

obdiag check -c 配置文件路径

对于SQL执行慢的场景,可以通过下面命令一键收集所属 OceanBase 集群指定 trace_id 的并行 SQL 的执行详情信息,包括所有涉及到的表结构、SQL的执行计划等等信息,帮助我们定位SQL执行慢的原因

obdiag gather plan_monitor --trace_id YB420BA2D99B-0005EBBFC45D5A00-0-0 --env "{db_connect='-hxx -Pxx -uxx -pxx -Dxx'}"

关于 obdiag 的相关功能还有很多,并且也支持用户自定义开发,其他详细功能大家可以访问官网 OceanBase 敏捷诊断工具(obdiag)一探究竟,obdiag 在日常运维工作中,能帮助我们节省非常多的工作,建议大家都可以了解下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

演示:基于WPF的DrawingVisual开发的矢量地图

一、目的:基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 三、环境 VS2022,Net7,GDAL,审图号为GS(2019)1822号矢量数据,DrawingVisual 四、主要功能 支持多种显示样式(默认样式&…

代码随想录27期|Python|Day39|​62. 不同路径​|​63. 不同路径 II​

62. 不同路径 简单题。由于规定了只能走右边和下边,所以右下角的值等于左对角线的两数之和。 1、确定dp和下标:二维数组,i,j分别为行和列,dp值为所需步数; 2、 初始化:只有上边和左边全部初始…

Java二十三种设计模式-享元模式(12/23)

享元模式:高效管理大量对象的设计模式 引言 在软件开发中,有时需要处理大量相似或重复的对象,这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案,通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…

Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE

近日,研究人员发现 Apache OFBiz 中存在一个新的关键漏洞,该漏洞是 Apache OFBiz 中的一个错误授权问题,被追踪为CVE-2024-38856。该漏洞影响 18.12.14 之前的版本,18.12.15 版本解决了该漏洞。 SonicWall 的安全研究员 Hasib Vh…

字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真

前期我们介绍过很多语音合成的模型,比如ChatTTS,微软语音合成大模型等,随着大模型的不断进步,其合成的声音基本跟真人没有多大的区别。本期介绍的是字节跳动自家发布的语音合成模型Seed-TTS。 Seed-TTS 推理包含四个功能模块&…

JavaScript中判断变量的类型

数据类型 在 JavaScript 中有 8 种基本的数据类型(7 种原始类型和 1 种引用类型),它们分别是: 原始类型/基本类型: Number,BigInt,String,Boolean,null,unde…

C++开发基础之深入理解C++中的两种单例模式实现——线程安全与效率的权衡

引言: 单例模式是设计模式中的一种,它保证一个类仅有一个实例,并提供一个全局访问点。在C中,实现单例模式的方式多种多样,但随着多线程应用的普及,如何确保单例模式在多线程环境下的线程安全性成为了一个重…

深度学习--图像分割UNet介绍及代码分析

UNet介绍 参考UNet网络介绍整体架构UNet过程输入编码器(下采样)中间特征表示解码器(上采样)输出 代码详解unetUP和Unet关系上采样模块——unetUp用于图像分割的卷积神经网络(CNN)架构模块——Unet类的定义初…

使用 Manim 创建一个二维坐标平面【NumberPlane】

NumberPlane 是 Manim 中用于创建一个二维坐标平面的类。它可以帮助用户在场景中可视化坐标轴、网格线以及其他数学概念。具体来说,它的功能包括: 坐标轴:NumberPlane 提供了 x 轴和 y 轴,通常是中心对称的,允许用户清…

深入探究Python反序列化漏洞:原理剖析与实战复现

在现代应用程序开发中,Python反序列化漏洞已成为一个备受关注的安全问题。反序列化是Python中用于将字节流转换回对象的过程,但如果没有妥善处理,攻击者可以通过精心构造的恶意数据,利用反序列化漏洞执行任意代码,进而…

前端day4-表单标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>day4-表单</title> </head> <body&g…

# 基于MongoDB实现商品管理系统(2)

基于MongoDB实现商品管理系统&#xff08;2&#xff09; 基于 mongodb 实现商品管理系统之准备工作 1、案例需求 这里使用的不是前端页面&#xff0c;而是控制台来完成的。 具体的需求如下所示&#xff1a; 运行 查询所有 通过id查询详情 添加 - 通过id删除 2、案例分析 程…

进程创建,进程消亡

虚拟地址&#xff1a;通过虚拟技术&#xff0c;将外部存储设备的一部分空间&#xff0c;划分给系统&#xff0c;作为在内存不足时临时用作数据缓存。当内存耗尽时&#xff0c;电脑就会自动调用硬盘来充当内存&#xff0c;以缓解内存的紧张。 练习: 编写一个代码实现,一个父…

OGG转MP3音频格式转换:6种免费音频转换器推荐

在如今的数字音乐时代&#xff0c;不同音频格式的兼容性问题常常让我们感到困扰。其中&#xff0c;OGG和MP3是两种常见的音频格式&#xff0c;但由于设备和平台的支持问题&#xff0c;我们经常需要将OGG转换为MP3格式。 本文将为您详细介绍OGG和MP3的区别&#xff0c;为什么需要…

Spring Boot集成protobuf快速入门Demo

1.什么是protobuf&#xff1f; Protobuf&#xff08;Protocol Buffers&#xff09;是由 Google 开发的一种轻量级、高效的数据交换格式&#xff0c;它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式&#xff0c;Protobuf 具有更小的数据体积、更快…

数据结构:队列(含源码)

目录 一、队列的概念和结构 二、队列的实现 头文件 初始化 入队列和出队列 获取队头队尾元素 队列有效数据数及队列判空 队列的销毁 完整源码 dl.h dl.c 一、队列的概念和结构 队列是一种只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性…

重生之我 学习【数据结构之顺序表(SeqList)】

⭐⭐⭐ 新老博友们&#xff0c;感谢各位的阅读观看 期末考试&假期调整暂时的停更了两个多月 没有写博客为大家分享优质内容 还容各位博友多多的理解 美丽的八月重生之我归来 继续为大家分享内容 你我共同加油 一起努力 ⭐⭐⭐ 数据结构将以顺序表、链表、栈区、队列、二叉树…

多米诺和托米诺平铺

有两种形状的瓷砖&#xff1a;一种是2 x 1的多米诺形&#xff0c;另一种是形如L的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 10^9 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同&#xff…

maven常用命令与常见问题汇总

文章目录 一、IDEA 下载依赖包源码报错Sources not found for:xxxx二、常用命令1、打包 一、IDEA 下载依赖包源码报错Sources not found for:xxxx 解决方案&#xff1a; 方案1、在 terminal 运行 mvn dependency:resolve -Dclassifiersources 命令 方案2、右键特定的pom文件…

论文概览 |《IJGIS》2024 Vol.38 issue4

本次给大家整理的是《International Journal of Geographical Information Science》杂志2024年第38卷第4期的论文的题目和摘要&#xff0c;一共包括8篇SCI论文&#xff01; 论文1 knowledge-constrained large language model interactable with GIS: enhancing public risk …