解析OceanBase v4.2磁盘数据文件支持按需扩展的功能

前言

若你日常习惯使用MySQL,那当使用过Oceanbase分布式数据库后,也许会对OceanBase的磁盘数据文件样式产生这样的疑问:为何储存数据仅用一个大的block_file文件呢?

简要分析下,OceanBase是通过Linux系统调用fallocate函数来预先占用磁盘空间的。这种预分配策略的优势在于能够确保获取到一段尽可能连续的磁盘空间,防止其他应用程序的争夺导致磁盘资源短缺,并允许在其基础上构建定制化的文件系统,以提升数据访问的效率。然而,这样的做法也可能引发一些争议,比如一次性占用大量空间,即使未实际使用也无法释放,或者reboot不起来,原因是没有足够的磁盘空间来分配这个大文件。

针对预分配大块磁盘空间但不能被释放的问题,我们增加一种渐进磁盘扩容的用户配置选项,即预分配一个合理的磁盘大小,根据磁盘的实际使用情况自动扩容。这种方式的好处是不需要对磁盘预分配空间进行“一刀切”,而是让磁盘数据文件能根据业务实际使用,自动感知并扩容,简化操作。

做“刚刚好”的扩容

简单来说就是渐进式使用磁盘空间,灵活配置,告别简单粗暴的“一次性消费行为”。随时根据业务需要,手动调整扩容步长,让扩容更丝滑。

例如,有的业务可能需要使用1TB的磁盘空间,那么可以先设置1TB的空间,再设置能接受的最大上限,假设10TB,可能最终业务使用了5TB的空间,那么对于业务而言,并不需要一开始就设置10TB的空间,从而节省了5TB的磁盘成本开销。如果某一天业务的写入减少,对磁盘的需求增速降低的情况下,业务还可以降低每次自动扩容的大小,最大限度的降低对磁盘的分配,做“刚刚好”的系统。

当然,如果要启用磁盘数据文件自动扩容的功能,需要了解以下几个配置项的配合使用:

  • datafile_size 磁盘数据文件占用磁盘可用空间大小。
  • datafile_disk_percentage 磁盘数据文件占用磁盘可用空间的比例。
  • datafile_next 磁盘数据文件自动扩容的步长。
  • datafile_maxsize 磁盘数据文件自动扩容的最大空间。

要启用数据文件按需扩容功能,有两种方法:第一种方法是在yaml配置文件中,指定datafile_size、datafile_next,以及datafile_maxsize的值,并且要让datafile_maxsize大于datafile_size,datafile_next大于零;第二种方法是在集群启动后手动修改datafile_size、datafile_next、datafile_maxsize的值。如果不想使用自动扩容功能,可以直接把datafile_next或datafile_maxsize设置为零,或按照默认配置启动集群(自动扩容功能默认关闭)。

如何使用按需扩容功能?

上面介绍了磁盘数据文件相关的几个配置项,接下来介绍这几个配置项的具体使用,以及打开自动扩容正确姿势。

首先,datafile_size或datafile_disk_percentage配置项是OceanBase磁盘数据文件的初始值,如果datafile_size和datafile_disk_percentage同时配置,则以datafile_size为准。如果不配置datafile_size或datafile_disk_percentage,OceanBase会根据clog和数据文件blockfile是否共用一个物理盘决定磁盘数据文件大小,并具有以下分配逻辑:

  • 如果clog和数据文件blockfile共用物理盘,则默认blockfile预分配60%的磁盘空间。
  • 如果clog和数据文件blockfile非共用物理盘,则默认blockfile预分配90%的磁盘空间。

这里需要注意的是,datafile_size配置项是容量属性,需要指定单位,例如datafile_size='10GB',或datafile_size='10TB'等。

其次,集群启动时候是否指定配置项只会影响磁盘初始数据文件的大小。

启用自动扩容功能,除了需要设置datafile_maxsize,datafile_next外,还需要根据当前磁盘数据文件大小来决定,接下来的例子里,假设我们安装OBServer的机器磁盘大小为 4TB,分别介绍自动配置模式和手动配置模式。

场景一:集群启动时,手动同时配置datafile_size(或datafile_disk_percentage)、datafile_next、datafile_maxsize。

例如:

oceanbase-ce:tag: oblocalglobal:datafile_size: 1T	datafile_next: 1Tdatafile_maxsize: 4T

注意看,上述的配置中 datafile_maxsize 大于 datafile_size,此等配置下集群启动后扩容会生效。当然你也可以在集群启动时配置 datafile_maxsize 小于 datafile_size,然后再 alter system set datafile_maxsize='xxx'修改配置项。

场景二:集群启动时,不配置datafile_size(datafile_disk_percentage)、datafile_next、datafile_maxsize。

例如:

obclient [oceanbase]> show parameters like '%datafile_%';
+-------+----------+---------------+----------+--------------------------+-----------+-------+-------------------------------------------------------------------------------+---------+---------+---------+-------------------+
| zone  | svr_type | svr_ip        | svr_port | name                     | data_type | value | info                                                                          | section | scope   | source  | edit_level        |
+-------+----------+---------------+----------+--------------------------+-----------+-------+-------------------------------------------------------------------------------+---------+---------+---------+-------------------+
| zone1 | observer | 11.158.97.241 |     2882 | datafile_disk_percentage | NULL      | 0     | the percentage of disk space used by the data files. Range: [0,99] in integer | SSTABLE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone1 | observer | 11.158.97.241 |     2882 | datafile_maxsize         | NULL      | 0     | the auto extend max size. Range: [0, +∞)                                      | SSTABLE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone1 | observer | 11.158.97.241 |     2882 | datafile_next            | NULL      | 0     | the auto extend step. Range: [0, +∞)                                          | SSTABLE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
| zone1 | observer | 11.158.97.241 |     2882 | datafile_size            | NULL      | 0     | size of the data file. Range: [0, +∞)                                         | SSTABLE | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
+-------+----------+---------------+----------+--------------------------+-----------+-------+-------------------------------------------------------------------------------+---------+---------+---------+-------------------+
4 rows in set (0.060 sec)

通过show parameter 命令可以看到我在集群启动后,没有配置任务datafile相关的属性,所以你看到的默认值都为零,如果我想让自动扩容生效,会执行下面三个步骤。

第一步,通过GV$OB_SERVERS视图的data_disk_allocated字段查看当前磁盘预分配的大小,例如:

obclient [oceanbase]> select data_disk_allocated/1024/1024/1024 as datafile_G from GV$OB_SERVERS;
+-------------------+
| datafile_G        |
+-------------------+
| 1770.000000000000 |
+-------------------+
1 row in set (0.007 sec)

第二步,结合上面查看到的字段大小,使用alter system set 设置一个大于data_disk_allocated的datafile_maxsize的值,以及设置datafile_next步长,例如:

obclient [oceanbase]> alter system set datafile_maxsize='4TB';
Query OK, 0 rows affected (0.213 sec)obclient [oceanbase]> alter system set datafile_next='1TB';
Query OK, 0 rows affected (0.115 sec)obclient [oceanbase]> 

第三步,再次查看GV$OB_SERVERS视图的data_disk_capacity和data_disk_allocated,如果自动扩容生效,那么data_disk_capacity将会等于datafile_maxsize。

注意:data_disk_capacity 的值不会超过磁盘可用空间范围。

obclient [oceanbase]> select data_disk_allocated/1024/1024/1024 as datafile_G, data_disk_capacity/1024/1024/1024 as datafile_max_G from GV$OB_SERVERS;
+-------------------+-------------------+
| datafile_G        | datafile_max_G    |
+-------------------+-------------------+
| 1770.000000000000 | 4096.000000000000 |
+-------------------+-------------------+
1 row in set (0.011 sec)

场景三:集群启动时,只配置datafile_size(或datafile_disk_percentage)。

例如:

oceanbase-ce:tag: oblocalglobal:datafile_size: 2T

如果只配置datafile_size或datafile_disk_percentage,那么我们只需要手动设置dataflie_maxsize和datafile_next即可,当然,即便设置了datafile_size配置项,我们依然需要先确认当前磁盘已经预分配的空间:

obclient [oceanbase]> select data_disk_allocated/1024/1024/1024 as datafile_G from GV$OB_SERVERS;
+-------------------+
| datafile_G        |
+-------------------+
| 2048.000000000000 |
+-------------------+
1 row in set (0.010 sec)

然后设置一个比data_disk_allocated大的datafile_maxsize以及一个非0的datafile_next,例如:

obclient [oceanbase]> alter system set datafile_maxsize='4TB';
Query OK, 0 rows affected (0.311 sec)obclient [oceanbase]> alter system set datafile_next='1TB';
Query OK, 0 rows affected (0.343 sec)

最后,查看__all_virtual_server确认自动扩容是否生效,如果data_disk_capacity大于data_disk_allocated表示已经生效: 

obclient [oceanbase]> select data_disk_allocated/1024/1024/1024 as datafile_G, data_disk_capacity/1024/1024/1024 as datafile_max_G from GV$OB_SERVERS;
+-------------------+-------------------+
| datafile_G        | datafile_max_G    |
+-------------------+-------------------+
| 2048.000000000000 | 4096.000000000000 |
+-------------------+-------------------+
1 row in set (0.009 sec)

注意事项

以上操作过程中,我们需要注意:

  1. 建议在集群启动时通过yaml文件配置datafile_size、datafile_maxsize和datafile_next,并根据实际业务需求,通过alter system适当调整datafile_next步长,初始配置建议到datafile_maxsize的20%左右,避免频繁扩容。
  2. 开启数据文件自动扩容后,请做好同一机器上同时部署的其他程序的容量规划,避免造成实际可扩容的最大空间,小于配置指定的datafile_maxsize问题。
  3. 自动扩容生效后,原本GV$OB_SERVERS视图的data_disk_capacity字段将展示datafile_maxsize的值,表示当前自动扩容的最大上限空间,data_disk_allocated表示当前磁盘数据文件实际空间大小。

常见问题解答

另外,我也想到一些大家容易遇到的问题,列举如下,如果遇到列表之外的问题,欢迎大家在评论区探讨。

问1:是否只要设置了datafile_maxsize配置项,就会触发自动扩容?

答:不一定,如果设置的datafile_maxsize小于当前磁盘数据文件的大小,是不会触发扩容的

问2:如果datafile_maxsize设置超过了磁盘的最大值,怎么扩容?

答:按照实际磁盘可用大小作为最大值,datafile_next作为步长渐进扩容

问3:扩磁盘的场景下,是否会影响原本的扩容行为?

答:不影响

问4:是否会影响到版本升级?

答:不影响升级,从旧版本升级到新版本时可以设置新版本参数,设置后按照新参数以及旧版本实际数据文件大小决定是否启动自动扩容,不设置默认新参数设置为零,关闭自动扩容

问5:当datafile_next设置得很小,例如1MB,会按照1MB扩容吗?

答:会做最小值限制,例如设置datafile_next='1M',会按照最小1GB进行扩容,若磁盘剩余可用空间不足1GB,则按照磁盘剩余可用空间扩容 

问6:是否也支持datafile的动态缩容?

答:不支持

参考资料

OceanBase存储架构

OceanBase SSTable 简述

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

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

相关文章

HarmonyOS实战开发-音视频录制、如何实现音频录制和视频录制功能的应用

介绍 音视频录制应用是基于AVRecorder接口开发的实现音频录制和视频录制功能的应用,音视频录制的主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中,帮助开发者轻松实现音视频录制功能,包括开始录制…

启动Unity发布的exe并且添加启动参数

启动Unity发布的exe并且添加启动参数 在启动Unity的时候添加一些启动的参数。 代码解释 在启动的时候获取的启动参数如果没有获取到正确的启动参数那么就退出程序,这个代码仅仅在发布到windows之后才会生效,在编辑器下这个代码虽然会获取到参数但是不能…

【YOLOv9改进[损失函数]】使用MPDIou回归损失函数帮助YOLOv9模型更优秀

本文中,第一部分概述了各种回归损失函数,当然也包括了今天的主角MPDIou。第二部分内容为在YOLOv9中使用MPDIou回归损失函数的方法。 1 回归损失函数(Bounding Box Regression Loss) 边界框回归损失计算的方法包括GIoU、DIoU、CI…

微服务下使用sentinel进行服务熔断

首先引入sentinel对应依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>下面是示例service代码,通过openFeign完成服务调用 Service public class …

低频电磁仿真 | 新能源汽车性能提升的利器

永磁同步电机 新能源汽车的心脏 近年来&#xff0c;全球变暖的趋势日益加剧&#xff0c;极端天气事件层出不穷&#xff0c;这些现象都反映出当前气候形势的严峻性。为了应对这一全球性挑战&#xff0c;各国纷纷采取行动&#xff0c;制定了一系列降碳、减碳的措施。中国在2020年…

ElasticView一款ElasticSearch的web可视化工具

ElasticView 是一款用来监控ElasticSearch状态和操作ElasticSearch索引的web可视化工具。它由golang开发而成&#xff0c;具有部署方便&#xff0c;占用内存小等优点 ElasticSearch连接树管理&#xff08;更方便的切换测试/生产环境&#xff09;支持权限管理支持sql转换成dsl语…

Java搭配H5实现前后端交互评论功能

前言&#xff1a; 最近有个朋友有偿让我帮他们将这个评论组件整合到他们的静态网页当中&#xff0c;并实现数据持久化。后来他觉得太麻烦&#xff0c;就放弃了。尽管没有拿到相应的报酬&#xff0c;但只是花了短短的时间写完了这个简单功能&#xff0c;并有机会将其分享给大家。…

从IoTDB的发展回顾时序数据库演进史

面向工业物联网时代&#xff0c;以 IoTDB 为代表的时序数据库加速发展。 时序数据的主要产生来源之一是设备与传感器&#xff0c;具有监测点多、采样频率高、存储数据量大等多类不同于其他数据类型的特性&#xff0c;从而导致数据库在实现高通量写入、存储成本、实时查询等多个…

第G2周:人脸图像生成(DCGAN)

第G2周&#xff1a;人脸图像生成&#xff08;DCGAN&#xff09; 第G2周&#xff1a;人脸图像生成&#xff08;DCGAN&#xff09;一、前言二、我的环境三、代码实现1、导入第三方库2、设置超参数3、导入数据 四、定义模型4.1 初始化权重4.2 定义生成器4.3 定义鉴别器 五、训练模…

蚂蚁云科技集团正式发布「以正」教育大模型

4月12日&#xff0c;蚂蚁云科技集团成功举办“智以育人、慧正无界——以正教育大模型产品发布会”&#xff0c;助力智慧教育变革&#xff0c;让因材施教成为可能。 蚂蚁云科技集团CEO蒋俊致辞并演讲 蒋俊对本次发布会的成功举办表达了最美好的祝愿&#xff0c;并回顾了蚂蚁云…

2024年蓝桥杯40天打卡总结

2024蓝桥杯40天打卡总结 真题题解其它预估考点重点复习考点时间复杂度前缀和二分的两个模板字符串相关 String和StringBuilderArrayList HashSet HashMap相关蓝桥杯Java常用算法大数类BigInteger的存储与运算日期相关考点及函数质数最小公倍数和最大公约数排序库的使用栈Math类…

Go语言图像处理实战:深入image/color库的应用技巧

Go语言图像处理实战&#xff1a;深入image/color库的应用技巧 引言image/color库基础颜色模型简介颜色类型和接口 image/color库实际应用基本颜色操作创建颜色颜色值转换颜色比较 颜色转换与处理与image库结合使用 性能优化和高级技巧性能考量避免频繁的颜色类型转换使用并发处…

web服务器是如何运行的?tomcat基本原理

tomcat基本流程 tomcat在启动时将webapps下的每个项目中的web.xml读取&#xff0c;获取相关信息。tomcat只关心Servlet 程序、Filter 过滤器、Listener 监听器&#xff0c;不关心其他类。 tomcat接收到请求后会将请求报文转换成一个httpServletRequest对象&#xff0c;包含请求…

【MATLAB源码-第45期】基于matlab的16APSK调制解调仿真,使用卷积编码软判决。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 16APSK调制解调 16APSK (16-ary Amplitude Phase Shift Keying) 是一种相位调制技术&#xff0c;其基本思想是在恒定幅度的条件下&#xff0c;改变信号的相位&#xff0c;从而传送信息。 - 调制&#xff1a;在16APSK中&am…

在vue和 js 、ts 数据中使用 vue-i18n,切换语言环境时,标签文本实时变化

我的项目需要显示两种语言(中文和英文)&#xff0c;并且我想要切换语言时&#xff0c;页面语言环境会随之改变&#xff0c;目前发现&#xff0c;只能在vue中使用$t(‘’)的方式使用&#xff0c;但是这种方式只能在vue中使用&#xff0c;而我的菜单文件是定义在js中&#xff0c;…

修改当前Git仓库的地址、用户名、密码

1.修改仓库地址 git remote set-url origin 新的仓库地址2.修改用户名和密码 2.1 修改用户名和密码1 分两步操作&#xff1a; 修改用户名&#xff1a; git config --global user.name "Your New Name"修改密码&#xff1a; 如果是 HTTPS 访问方式&#xff0c;并…

gpt系列概述——从gpt1到chatgpt

GPT建模实战&#xff1a;GPT建模与预测实战-CSDN博客 OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型是自然语言处理领域的重要里程碑。从2018年至2020年&#xff0c;该公司相继推出了GPT-1、GPT-2和GPT-3&#xff0c;这些模型在文本生…

CTFshow电子取证——内存取证1

关于内存与注册表 内存中的注册表项 当Windows操作系统启动时&#xff0c;它会将注册表的部分数据加载到内存中&#xff0c;以便系统和应用程序可以快速地访问这些信息。这些数据在内存中可以更快地被读取和修改&#xff0c;以便系统能够动态地调整其行为和配置。 系统性能和…

加权轮询负载均衡算法Golang实现

加权轮询负载均衡算法&#xff08;Weighted Round Robin Load Balancing Algorithm&#xff09;是一种常见的负载均衡策略&#xff0c;它结合了轮询调度和权重分配的特点&#xff0c;使得请求可以依据服务器的能力不同而被合理地分配。 在加权轮询算法中&#xff0c;每个服务器…

工业相机飞拍功能的介绍(转载学习)

转载至&#xff1a; https://baijiahao.baidu.com/s?id1781438589726948322&wfrspider&forpc