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

作者:

花名:洪波, 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.rhkb.cn/news/392899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新址·新征程|美创科技北京中心喜迎乔迁

7月30日,北京暴雨倾城 连绵大雨和隆隆雷声 却像是在为一场新征程洗礼 这一天,我们迎来了重要的时刻 ——美创科技北京中心搬新家啦! 新址:北京市海淀区庚坊国际大厦6层 喜迎新址,一场简单但喜气盈盈、温馨十足的乔…

【Python学习手册(第四版)】学习笔记16-函数基础

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍Python中函数的基本概念,作用域以及参数传递,函数语法以及def和return语句的操作,函数调用表达式的行为&#xff…

Delphi5实现DLL的编写、调用

效果图 显式跟隐式调用差不多的,就重新画了窗体,画的有点粗糙。 DLL文件 DLL文件是一种包含了可执行代码的库文件,但它不能独立运行,必须由其他程序(如EXE文件)显式或隐式地加载并调用。DLL文件通常用于实…

全国地铁路线及站点SHP数据

数据是GIS的血液! 我们在《126M全球手机基站SHP数据分享》一文中,为你分享过全球手机基站分布数据。 现在再为你分享全国地铁轻轨路线与站点SHP数据,你可以在文末查看该数据的领取方法。 全球地铁路线及站点数据 截至2023年12月31日&…

LAVIS在Mac,M1PRO芯片下的安装实战

LAVIS在Mac,M1PRO芯片下的安装实战 契机 ⚙ 本地想装个图片理解的大模型,看了下blip2感觉比较合适,macos安装的时候有点坑需要注意下,但是最终也无法使用mps加速,比较蛋疼。这里记录下安装步骤。 安装 LAVIS/projects/blip2 a…

【研发日记】Matlab/Simulink技能解锁(十二)——Stateflow中的两种状态机嵌套对比

文章目录 前言 项目背景 两级状态机 函数状态机 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(七)——两种复数移相算法》 见《【研发日记】Matlab/Simulink技能解锁(八)——分布式仿真》 见《【研发日记】Matlab/Simulink技能解锁(九)——基…

数据结构(其四)--特殊矩阵的存储

目录 11.特殊矩阵的压缩存储 (1).一维数组的储存结构 (2).二维数组的存储结构 (3).普通矩阵的存储 (4).特殊矩阵的压缩存储 i.对称矩阵 ii.三角矩阵 iii.三对角矩阵 iiii.稀疏矩…

Java多商户新零售超市外卖商品系统

解锁新零售奥秘,多商户外卖超市商品系统大揭秘! 🌟 开篇:新零售时代的浪潮 在这个日新月异的数字化时代,新零售已悄然成为商业变革的新风口。想象一下,足不出户就能逛遍全城商家,心仪商品一键…

力扣——238.移动零

题目 思路 利用双指针,先找到第一个为0的地方指向,指针2指向下一个,指针1之前是已经处理好的数据,指针2进行遍历,遇到非零则与指针1数据交换,然后指针1。 代码 class Solution { public:void moveZeroes(…

离心机转子适配器容量转换器的作用

离心机转子是离心机的核心部件,离心机中的所有系统都配置为保证转子在一定条件下安全运行。转子不仅直接影响分离效果,而且也是离心机技术中的主要承力部件,对离心机的安全性极为重要。 简而言之,离心机可分为两部分:…

Java Web——第二天

什么是JavaScript? JavaScript(简称:JS) 是一门跨平台、面向对象的脚本语言。是用来控制网页行为的,它能使网页可交互 JavaScript和Java是完全不同的语言,不论是概念还是设计。但是基础语法类似 JavaScript在1995年由 Brendan Eich 发明,…

【MySQL】索引概念解析

1.什么是索引? MySQL中的索引是一种数据结构,用于帮助MySQL数据库管理系统快速查询数据。索引的主要目的是提高数据检索的速度,减少数据库系统需要扫描的数据量。 优点: 索引可以极大的提高数据检索效率,降低数据库…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义 预处理 编程的流程分为:编辑、编译、运行、调试四个阶段; 预处理属于编译阶段,编译过程又可以分为:预处理、编译、汇编、链…

TikTok达人效应:品牌出海中的文化桥梁与本土化策略

在全球化的浪潮下,品牌出海已成为企业拓展市场的必经之路。然而,跨越文化差异、实现品牌本土化传播一直是企业面临的巨大挑战。TikTok作为一款全球流行的短视频平台,其庞大的用户基础和强大的影响力,为品牌出海提供了新的机遇。在…

大数据技术复习--大数据与云计算、物联网、人工智能

云计算 ** 概念:美国国家标准技术研究院“一种无处不在的、便捷的且按需的对一个共享的可配置的计算资源(如网络,服务器、存储、应用和服务)进行网络访问的模式,他能够通过少量的管理或服务供应商的互动实现计算资源的…

CTFHub技能树web——XSS——DOM反射

根据框里的内容 直接右键查看网页源代码 看到 了其闭合方式 然后去网页测试一下alert&#xff08;1&#xff09;反射 ;</script><script>alert(1)</script> 看到 确实存在 去xssaq.cn 创建一个项目 把src粘过来 在第一个输入框中 再将返回回来的url 复…

MATLAB计算心理声学烦恼度例子

在这个例子中&#xff0c;您测量发动机噪音&#xff0c;并使用心理声学指标来模拟其感知响度、尖锐度、波动强度、粗糙度和总体烦扰程度。然后&#xff0c;模拟添加隔音材料&#xff0c;重新计算总体噪音水平。最后&#xff0c;比较恼人程度&#xff0c;并显示应用隔音材料后的…

【LabVIEW学习篇 - 12】:通知器

文章目录 通知器案例一案例二案例三&#xff08;在不同VI中用同一个通知器&#xff09; 通知器 同步技术&#xff1a;同步技术用来解决多个并行任务之间的同步或通信问题。 通知器比较适合一对多的操作&#xff0c;类似于广播&#xff0c;一点发出的通知消息&#xff0c; 其它…

Spring Boot 3.3 新特性介绍

1. 引言 Spring Boot 3.1.x 停止维护了&#xff0c;而 3.3.x 作为最新发布的版本&#xff0c;带来了许多新特性和改进。本篇文章将详细介绍这些新特性&#xff0c;并通过样例代码加以解释&#xff0c;帮助开发者更好地掌握和应用这些新功能。 Spring Boot 3.3现已正式发布&…

Android studio配置代码模版

一、背景&#xff1a; 在工作中&#xff0c;总是要写一些重复的代码&#xff0c;特别是项目有相关规范时&#xff0c;就会产生很多模版代码&#xff0c;每次要么复制一份&#xff0c;要么重新写一份新的&#xff0c;很麻烦&#xff0c;于是我就在想&#xff0c;能不能像创建一…