【SOP 系列 13】OceanBase 中数据文件动态按需分配和带来的变化

背景

在 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=100Gdatafile_next=50Gdatafile_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>0datafile_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=100Gdatafile_maxsize=1Tdatafile_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 的时候进行扩容,扩容后磁盘空间并不会立刻生效,这里有可能会影响用。