背景
在 OceanBase 社区版 3.1.4 版本发布之前,我们知道 OceanBase 数据文件的大小由 datafile_size
或者 datafile_disk_percentage
来控制,且采用全额预分配的方式。在业务早期,虽然没有多少数据,但如果前面的参数设置太大,主机的磁盘使用率就会很高;如果设置的太小,当业务量上来后,又会担心数据文件哪天大小又不足了,数据文件动态按需分配的机制就是在这样的背景下产生了。
如何开启数据文件动态按需分配
在 OceanBase 社区版 3.1.4 版本中为了提供数据文件动态按需分配的机制,引入了以下参数:
-
datafile_next
:控制磁盘空间的增长步长 -
datafie_maxsize
:限制磁盘空间的增长上限 -
_datafile_usage_upper_bound_percentage
:触发磁盘调整的百分比 -
_datafile_usage_lower_bound_percentage
:暂未实现对应的功能
datafile_size>0 | datafile_next=0 | datafile_maxsize=0 | 未开启数据文件动态按需分配 |
datafile_size>0 | datafile_next>0 | datafile_size>datafile_maxsize>0 | 未开启数据文件动态按需分配 |
datafile_size>0 | datafile_next>0 | datafile_maxsize>datafile_size | 开启数据文件动态按需分配 |
举例:
设置 datafile_size=100G
,datafile_next=50G
,datafile_maxsize=1T
,_datafile_usage_upper_bound_percentage=80
,表示当数据所需的磁盘使用达到 80G 大小时,触发磁盘空间扩容,扩容大小为 50G,最终动态扩容不会超过 datafile_maxsize
设置的 1T。
引入数据文件动态按需分配带来的变化
-
参数含义的变化1
引入前:datafile_size
表示当前数据文件最大的空间。
引入后:datafile_size
表示数据文件初始空间,datafile_maxsize
表示数据文件最大的空间。 -
参数含义的变化2
引入前:datafile_disk_percentage
表示当前数据文件所在磁盘的预分配百分比。
引入后: 需要将datafile_disk_percentage
经过手动计算转换为datafile_size
。即在动态按需分配的时候不支持datafile_disk_percentage>0
且datafile_size=0
的情况。
举例: 磁盘大小 1T,datafile_disk_percentage=30
,调整后datafile_size
不小于 300G 作为初始值。 -
虚拟表
__all_virtual_disk_stat.total_size
字段的变化
引入前:total_size
对应datafile_size
的值,表示当前预分配设置的数据文件大小
从数值关系上total_size = free_size + used_size
引入后:total_size
对应datafile_maxsize
的值,表示当前设置的最大数据文件大小
从数值关系上total_size <> free_size + used_size
-
虚拟表
__all_virtual_server_stat
增加了disk_actual
字段,表示实际数据占磁盘的大小
常见问题
-
在开启数据文件动态按需分配,假设
datafile_size=100G
,datafile_maxsize=1T
,datafile_next=80G
,_datafile_usage_upper_bound_percentage=80
经过多次的自动扩容后,此时触发动态扩容:已使用大小(980G)+ datafile_next(80G)> datafile_maxsize(1T)
,此时是扩容 20G,还是直接不扩容? 如果可以扩容,跟每次扩容datafile_next
大小的操作是否有区别?
答: 如果当前 980G,next=80G,max=1T,那么在计算实际扩容空间时,会根据最大剩余空间和 next 取 min,也就是会扩容 20G。 -
在开启数据文件动态按需分配,如何统计当前已经使用的大小?
答: OceanBase 内部维护了一个free_block_cnt
变量,在磁盘分配或者回收(实际磁盘空间不回收)的时候会操作该变量,可以查内部表__all_virtual_macro_block_marker_status
查看当前已经使用的宏块和实际总的宏块,或__all_virtual_disk_stat
查看总空间和已用空间。 -
开启数据文件动态按需分配,在扩容的期间是否会对业务造成影响?
答: 一般扩容会提前扩容,并且有后台线程专门做磁盘扩容任务,操作上只是预分配,不涉及磁盘数据拷贝,比较轻量,应该不会对业务造成严重影响。但有一点可能需要注意,如果设置_datafile_usage_upper_bound_percentage
比较大,例如 99%,可能会导致在alloc_block
的时候进行扩容,扩容后磁盘空间并不会立刻生效,这里有可能会影响用。