OceanBase 数据文件缩容实践

news2024/10/6 16:29:51

本文章介绍了OceanBase集群关于数据文件的缩容场景,并提供一种缩容方案予以参考。

作者:关炳文,爱可生 DBA 团队成员,负责数据库相关技术支持,一步两阶梯,兼具勤奋与慵懒。

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

本文约 1200 字,预计阅读需要 4 分钟。

缩容场景

此前某银行一套 1-1-1 架构的 OceanBase 集群其中一个节点,OBServer 程序崩溃时默认生成 core 文件在数据盘 /data/1。一般情况下,core 文件的大小即为程序运行时占用的内存大小,约 400GB。然而数据盘早已预分配 90% 的空间给数据文件(block_file),剩余可用空间不足以存放如此之大的文件,导致 /data/1 目录被写满,并由此引发两个问题:

  1. core 文件没写完整,不完整的 core 文件使得对故障原因的分析工作难以进展。
  2. 数据盘被写满,直接导致该节点无法对外业务提供服务。

恢复 OBServer 服务之后,经过与项目组讨论,决定 采取给该集群的数据文件进行缩容至数据盘总大小的 80% ,避免日后故障复现时发生同样情况。

本文内的图片以及代码中展示的服务器信息(IP 地址、集群名、租户名),为个人搭建的模拟环境所用,仅用于辅助说明具体步骤。

缩容操作

版本信息

  • OBServer 版本:3.2.3
  • OCP 版本:3.3.3

相关参数

datafile_size

用于设置数据文件的大小。如果想要缩减 datafile_size,可以将这个节点从集群中删除,重建这个节点,集群当前值为 0。

datafile_disk_percentage

表示占用 data_dir 所在磁盘总空间的百分比,集群当前值为 90。

1 调整参数

集群->参数管理,调整 datafile_disk_percentage 的值为 80,即 block_file 占盘比例为 80%。

2 缩减租户副本

集群->租户管理,选择租户(包括 sys 租户)在副本详情中选中 zone 删除副本(例:zone3),等待任务结束。

3 下线 OBServer

集群->总览,OBServer 列表中删除 zone3 的 OBServer,相当于在该节点卸载 OBServer 服务,等待任务结束。

4 上线 OBServer

此时该节点的 OceanBase 安装包被卸载了,相关目录空间也被清空了。如果要重新使用该 OBServer 上线,需要安装 OceanBase 的 RPM 包,并初始化相关目录等操作。

由于 OCP 目前(3.3.3 版本)还做不到启动 OBServer 进程时另外指定参数,因此这一步使用黑屏命令行操作。

4.1 安装 RPM 包

使用 root 用户。

rpm -ivh oceanbase-3.2.3.3-107050022023040817.el7.x86_64.rpm

4.2 初始化目录

使用 admin 用户。

export cluster_name=sit 

mkdir -p /data/1/$cluster_name/{etc3,sort_dir,sstable} 
mkdir -p /data/log1/$cluster_name/{clog,etc2,ilog,slog,oob_clog} 
mkdir -p /home/admin/oceanbase/store/$cluster_name 

chown -R admin:admin /data/1/$cluster_name && chown -R admin:admin /home/admin/oceanbase && chown -R admin:admin /data/log1/$cluster_name 

for t in {etc3,sort_dir,sstable};do ln -sf /data/1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done 
for t in {clog,etc2,ilog,slog,oob_clog}; do ln -sf /data/log1/$cluster_name/$t /home/admin/oceanbase/store/$cluster_name/$t; done

4.3 指定参数启动 OBServer 进程

使用 admin 用户。

cd /home/admin/oceanbase 
ulimit -s 10240  ##堆栈的最大值
ulimit -c unlimited   ##当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(core file)

启动 OBServer 进程。

cd /home/admin/oceanbase

/bin/observer -i eth0 -p 2881 -P 2882 -n sit -z zone3 -d /home/admin/oceanbase/store/sit -r '10.186.65.8:2882:2881;10.186.65.123:2882:2881;10.186.65.56:2882:2881' -l info -o 'obconfig_url=http://10.186.65.11:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=sit,config_additional_dir=/data/1/sit/etc3;/data/log1/sit/etc2,cluster_id=16777777,datafile_disk_percentage=80,cpu_count=16,system_memory=5G'

参数参考值:

  • -i 指定网卡名,可通过 ifconfig 命令查看。
  • -p 指定服务端口号,一般指定为 2881。
  • -P 指定 RPC 端口号,一般指定为 2882。
  • -n 指定集群名称,与原来保持一致。
  • -z 指定启动的 OBServer 进程所属的 Zone,与原来保持一致。
  • -d 指定集群主目录,除集群名字,其他不要变动。
  • -r 指定 RS 列表,可通过查看当前集群 rootservice_list 参数。
  • -l 指定日志级别,默认为 INFO,即只有 INFO 及以上级别的日志数据才会打印到observer.log 、election.log 和 rootservice.log 日志文件中。
  • -o 指定集群启动参数,需要根据实际情况设置。
    • obconfig_url:用于设置 OBConfig 服务的 URL 地址,与原来保持一致。
    • config_additional_dir:用于设置本地存储配置文件的多个目录,为了冗余存储多份配置文件。
    • cluster_id:指定集群 ID,与原来保持一致。
    • datafile_disk_percentage:设置为缩容后所占数据的盘百分比。
    • cpu_count:指定 CPU 个数,与原来保持一致。
    • system_memory:指定 OceanBase 内部保留内存,与原来保持一致。

4.4 登录集群 sys 租户,添加 OBServer

alter system add server '10.186.65.56:2882' zone 'zone3';

OCP 集群总览页刷新出 OBServer 列表。

4.5 其它副本操作

重复上述步骤,逐一缩减租户副本,下线/上线其它 OBServer,并补齐租户副本。到此,OceanBase 对数据盘 /data/1 的 block_file 缩容已完成。

4.6 重启集群

最后,重启集群,验证集群是否正常运行。

总结

本次数据文件缩容操作相当于在集群每个节点重装 OBServer 服务,在生产环境具有一定风险,建议做好备份工作。因此在本文相同故障场景下,优先考虑本地是否存在其他磁盘空间(NFS 挂载盘传输存在网络限制,暂不考虑)可用于存放 core 文件并修改其生成路径。

另外,datafile_disk_percentagedatafile_size 参数需要调大时,可以在集群中进行动态调整,不需要重启集群,调小则不效。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

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

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

相关文章

浅谈单元测试:测试和自动化中的利用

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 浅谈单元测试是一件棘手的事情。我很确定测试人员在某个时候会抱怨开发人员没有正确地进行单元测试&…

Idea中使用Service管理微服务

前言 如何在本地一键启动很多个微服务,下面介绍下IDEA开发工具中得Services管理管理功能 一、第一步 1、在IDEA中下栏bar中如果存在Services,请看第二步。 2、如果没有请按照以下步骤打开 View -> Tool Windows -> Services 二、第二步 刚创建好的窗口是空…

论文浅尝 | 基于知识增强的多行为对比推荐

笔记整理:吴飞跃,东南大学硕士,研究方向为推荐系统 链接:https://doi.org/10.1145/3539597.3570386 动机 在实际推荐场景中,用户和物品之间存在多种类型的交互行为,如在线购物平台上的点击、标记为喜欢和购…

【算法专题突破】二分查找 - 704. 二分查找(16)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:704. 二分查找 - 力扣(LeetCode) 题目非常简单,就是查找一个 target。 2. 算法原理 根据最基本的二分查找算法: 在一个…

Java代码随想录第一章:-数组理论基础,704. 二分查找,27. 移除元素 ,

一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 举一个字符数组的例子如图: 需要两点注意的是 数组下标都是从0开始的。数组内存空间的地址是连续的 正是因为数组的在内存空间…

Unity 发布WebGL平台,C#与JavaScript交互

发布H5平台,接入SDK,比如微信等,涉及到C#与JS的交互。 jslib(JavaScript Library)是Unity的一种机制,允许你在C#中通过JavaScript代码来执行一些操作。这是一种高级的技巧,主要用于一些特殊情况…

【QT】Qt的随身笔记(持续更新...)

目录 Qt 获取当前电脑桌面的路径Qt 获取当前程序运行路径Qt 创建新的文本文件txt,并写入内容如何向QPlainTextEdit 写入内容QTimerQMessageBox的使用QLatin1StringQLayoutC在c头文件中写#include类的头文件与直接写class加类名有何区别mutable关键字前向声明 QFontQ…

Android AMS——APP启动流程

Android 应用启动方式主要有两种 , 冷启动和热启动。 冷启动:后台没有应用进程 , 需要先创建进程 , 然后启动 Activity ;热启动:后台有应用进程 , 不创建进程 , 直接启动 Activity ; 其实,还有一种问起动的方式,就是用户按了返回键退出应用,随后又从新启动,可是活…

【Python】{已解决}在命令行窗口查看的版本号与安装版本不一致问题

今天在使用一个新的第三方库的时候:先pip安装了一下,然后导入的时候报错了 然后以为是没有安装成功,就又pip了一下,发现已经成功安装了。 那是为什么呢? 是解释器出现了问题吗?于是我就去查看了一下pychar…

反射-认识反射

一、什么是反射 二、如何使用反射 1.第一步:加载类,获取类的字节码(获取类的Class对象) public class reflectTest {public static void main(String[] args) throws Exception {Class c1 Student.class; //通过类名得到学生类…

上班后很迷茫,到底该如何做一个合格的测试?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 如何做一个合格的测试?软件测试工程师的岗位职责到底是什么? 最初,我…

倒计时列表实现(小程序端Vue)

//rich-text主要用来将展示html格式的&#xff0c;可以直接使用这个标签 <view class"ptBox" v-for"(item,index) in orderList" :key"index"> <rich-text :nodes"item.limit_time|limitTimeFilter"></rich-text>…

vue+three.js中使用Ammo.js

直接通过npm i ammo.js安装进webpack的项目里调用时&#xff0c;会出现如下报错&#xff1a; ERROR in ./node_modules/ammo.js/ammo.js 1:1683-1696 Mo…

VMware中安装Ubuntu(2023年)

Ubuntu安装 前言 安装过程中电脑发热时正常的&#xff0c;这个还是稍微有点点大&#xff1b;下载的版本根据自己的喜好来&#xff0c;新版本肯定要比旧版本占用的空间更大&#xff0c;大家自行选择&#xff1b;仅供学习使用的话可以下载成熟稳定的版本&#xff0c;例如16、18…

【新版】系统架构设计师 - 案例分析 - 架构设计<SOA与微服务>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;SOA与微服务&#xff1e;例题1例题2例题3例题4 架构 - 案例分析 - 架构设计&#xff1c;SOA与微服务&#xff1e; 这里SOA与微服务的例题只对应找寻了几个&#x…

servlet开发-通过Tomcat部署一个简单的webapp

首先我们得下载安装Tomcat&#xff0c;推荐看Tomcat&#xff08;HTTP服务器&#xff09;下载以及认识&#xff0c; 我们将通过打印一个hello word的方式来熟悉servlet开发,通过Tomcat部署一个webapp的流程 servlet的含义 Tomcat提供了一系列的api接口&#xff0c;这些api背后…

dfs力扣1993树上的操作

文章目录 dfs力扣1993树上的操作题目示例提示做题历程做题思路数组定义编写代码 完整代码 dfs力扣1993树上的操作 题目 题目链接 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 parent[i] 是第 i 个节点…

Java多线程篇(5)——cas和atomic原子类

文章目录 CASAtomic 原子类一般原子类针对aba问题 —— AtomicStampedReference针对大量自旋问题 —— LongAdder CAS 原理大致如下&#xff1a; 在java的 Unsafe 类里封装了一些 cas 的api。以 compareAndSetInt 为例&#xff0c;来看看其底层实现。 可以发现&#xff0c;最…

基于abaqus的非等速生长Voronoi晶体模型生成插件

1. 非等速生长晶体模型简介 对于标准Voronoi而言&#xff0c;每个晶粒的生长速率是相同的&#xff0c;任意两个晶粒的交界线为其形核点连线的垂直平分线&#xff0c;交界线为一条直线&#xff0c;如图1.1所示。 图1.1 标准Voronoi晶粒交界线 而对于非等速生长Voronoi晶体而言…

项目篇——java文档搜索引擎

Java 文档搜索引擎 文章目录 Java 文档搜索引擎一、分词二、完成parser 类2.1、排除非html文件2.2、解析html以下是解析 HTML 标题的方法以下是解析 对应的 URL以下是解析 HTML的正文&#xff1a; 补充&#xff1a;倒序索引 三、实现 index 类3.1、实现索引结构3.2、索引中新增…