OB数据库如何处理一台 OBServer 多个重叠的冻结动作?

本文主要介绍 OceanBase 数据库处理一台 OBServer 上多个重叠冻结动作的机制。

在 OceanBase 数据库中,您可以通过以下几种方式触发冻结操作:

  • 通过

    ALTER SYSTEM MAJOR FREEZE

    手动发起。

  • 当增量数据写到超过

    freeze_trigger_percentage

    设置的阈值时,系统自动发起。

  • 控制 OceanBase 数据库冻结阈值的配置项为

    freeze_trigger_percentage

    ,默认为 70,表示当内存使用超过 70% 时会触发冻结。

  • 通过设置配置项

    major_freeze_duty_time

    定时发起。

有关该以上配置项的详细信息,请参见《OceanBase 数据库 参考指南》中的 系统配置项 章节。

在某些场景下,可能会出现在一台 OBServer 上发起多个重叠的冻结动作。例如,系统里已经运行了手动发起的冻结,在一定时间内,增量数据超过了阈值,又触发了新的冻结请求,两个冻结请求会重叠。针对同一 OBServer 上多个重叠的冻结动作,OceanBase 数据库会遵循以下处理规则:

  • 多个手动发起的冻结 ,只有完成了上一个版本的 merge 完成才能继续执行后续版本的冻结。

  • 先达到

    freeze_trigger_percentage

    设置的阈值发起冻结,再手动发起冻结时,会在完成了上一个版本的 merge 完成才能继续执行后续版本的冻结。

  • 先达到

    freeze_trigger_percentage

    设置的阈值发起冻结,再根据 duty_time 的设置定时发起冻结时,只会执行第一个冻结。第二个冻结会失败,并返回以下错误信息。

fail as ‘cannot do major freeze triggered by cluster self, out of version limit’

  • 先手动发起冻结,再根据 duty_time 的设置定时发起冻结时,只会执行第一个冻结。第二个冻结会失败,并返回以下错误信息。

fail as ‘cannot do major freeze triggered by cluster self, out of version limit’

  • 先触发由 duty_time 定时发起的冻结,再手动发起冻结时,再根据 duty_time 的设置定时发起冻结完成后,再执行手动发起的冻结。

  • 注意无论由 duty_time 定时发起的冻结前后是否有冻结请求,在

    rootservices.log

    中都会记

    录 major freeze has already been launched, no need to do again

你好问一下,freeze_trigger_percentage 这个参数到底是触发major 还是触发minor? 《OceanBase 数据库 开发者指南》中的 附录- OceanBase 常用参数和变量章节这样写的:"freeze_trigger_percentage 70 指定增量内存使用比例的一个阈值,达到这个值会触发 Minor Freeze" 。

触发minor freeze,当minor freeze次数用尽,就触发 major freeze。

1 个赞

好的,感谢!