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

2024-04-12 20:52

本文主要是介绍解析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 简述

这篇关于解析OceanBase v4.2磁盘数据文件支持按需扩展的功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/898215

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络