autoinc_cache_refresh_interval 刷新的啥

【 使用环境 】生产环境 or 测试环境

【 OB or 其他组件 】OB

【 使用版本 】v4.2.5–v4.4.2

【问题描述】

请问 autoinc_cache_refresh_interval 的刷新机制具体是指什么?是将当前自增 Cache 的分配进度同步持久化到内部表中,还是将 Cache 中未使用的部分完全回收并重新申请?” 或者是其他?

刷新的价值收益是什么?
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005685508

5 个赞

还有个问题,这是自增缓存的配置,那应该只有mysql租户才用到,为什么是集群级配置,而不是租户级?

1 个赞

1、定期向leader续租本地自增Cache的有效期,非持久化,非清空回收
2、提供租约机制,防范分布式网络分区或节点宕机导致的 ID 冲突。
3、保持较大间隔可大幅减少后台心跳 RPC 损耗,让高并发写入更平滑。
4、在OceanBase中,无论在MySQL租户还是Oracle租户下,只要你创建了一张’无主键表’,底层一律会调用自增服务。因为创建无主键表,OceanBase会在底层自动为该表生成一个隐藏的自增主键(一个 BIGINT 类型的隐藏列)

4 个赞

签到…

@论坛小助手

autoinc_cache_refresh_interval 设置自增列缓存的刷新间隔。刷新机制具体是指定期将自增 Cache 的分配进度同步持久化到内部表中,而不会将 Cache 中未使用的部分完全回收并重新申请。刷新的价值在于确保在节点重启或其他异常情况下,自增列能够从最近的持久化点继续分配,避免重复值的出现,从而保证数据的一致性和正确性。

关于为何是集群级配置而非租户级配置,这是因为自增列缓存涉及到整个集群中多个 OBServer 节点之间的协调。如果将此配置项设为租户级,可能会导致各个 OBServer 节点之间的缓存同步出现问题,影响数据的一致性和可靠性。因此,为了保证全局一致性,将其设为集群级配置。

具体信息可参考以下文档:

  1. autoinc_cache_refresh_interval
  2. location_cache_refresh_min_interval
  3. enable_auto_refresh_location_cache
1 个赞

文中提到的cache问题很常见,通过优化refresh和调整interval配置,通常可以解决。

666

autoinc_cache_refresh_interval 的“刷新”既不是把本地 Cache 分配进度写回内部表,也不是回收未使用的 Cache 并重新申请。它做的是一件更窄的事:定期从全局(内部表 / GAIS)拉取最新的 sync_value,更新本机内存里的 local_sync_
autoinc_cache_refresh_interval 控制的是 NOORDER 模式下,本机定期从全局拉取 sync_value 更新 local_sync_ 的频率;本地 Cache 的分配、回收,以及向内部表的写入,分别由其他路径负责。

点赞

1.Cache的有效期是多久?我刷的频率多少才能保证在有效期;
2.如果超出有效期会怎么样?
3.你说的这些有官方文档依据没?

sync_value 是全局的ID分配进度? local_sync_是每个节点的ID分配进度?

支持支持

为什么要刷这个东西,有啥好处。我不刷或者间隔特别大会造成什么影响
假调我调整参数过小,刷的太频繁有什么影响没?

这里的“刷新自增列缓存”更准确地说,是刷新本机缓存的全局同步水位让本机知道“集群里已经同步到多大的自增值”。

作用主要是:

  1. 减少不必要的全局同步
  • 插入显式自增值或处理自增值时,如果本机知道 insert_value <= local_sync_,就可以判断这个值已经不需要再推到全局。
  • 否则可能会额外访问全局自增服务,更新 sync_value
  1. 让不同 OBServer 对全局自增水位的认知更及时
  • NOORDER 模式下,不同 OBServer 会各自持有本地自增 Cache。
  • 定期刷新 sync_value 可以让本机更快感知其他节点已经推进过的全局水位。
  1. 降低显式插入较大自增值时的冲突或重复风险窗口
  • 如果某个节点插入了较大的显式自增值,并同步到了全局,其他节点通过刷新可以更快看到这个水位。
  • 但它不是回收本地未用完的 Cache,也不是把本地 Cache 当前分配进度写回内部表。

刷新太频繁的影响主要是性能开销增加:

  • 每次刷新需要访问全局自增服务,底层可能涉及 RPC 或内部表读取。
  • 在高并发 INSERT、很多自增表、很多 OBServer 的场景下,刷新太频繁会增加全局自增服务和内部表访问压力。
  • 还会增加锁竞争,因为刷新时会进入 sync_mutex_ 保护逻辑。
  • 对业务来说,可能表现为自增值分配路径上的额外延迟,尤其是 NOORDER 模式大量写入时。
1 个赞

大概明白了。我理解核心作用:

1.解决noorder模式下插入显式自增值的冲突风险,但无法彻底解决;
2.解决noorder模式下插入显式自增值RPC全局访问的可能性;

结合收益、影响以及这个场景的使用频率,综合判断,这个值调低没必要,可以调大。

学习!!!

点赞点赞点赞