OB行者
#1
【 使用环境 】生产环境 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 个赞
OB行者
#3
还有个问题,这是自增缓存的配置,那应该只有mysql租户才用到,为什么是集群级配置,而不是租户级?
1 个赞
1、定期向leader续租本地自增Cache的有效期,非持久化,非清空回收
2、提供租约机制,防范分布式网络分区或节点宕机导致的 ID 冲突。
3、保持较大间隔可大幅减少后台心跳 RPC 损耗,让高并发写入更平滑。
4、在OceanBase中,无论在MySQL租户还是Oracle租户下,只要你创建了一张’无主键表’,底层一律会调用自增服务。因为创建无主键表,OceanBase会在底层自动为该表生成一个隐藏的自增主键(一个 BIGINT 类型的隐藏列)
4 个赞
论坛小助手
#7
autoinc_cache_refresh_interval 设置自增列缓存的刷新间隔。刷新机制具体是指定期将自增 Cache 的分配进度同步持久化到内部表中,而不会将 Cache 中未使用的部分完全回收并重新申请。刷新的价值在于确保在节点重启或其他异常情况下,自增列能够从最近的持久化点继续分配,避免重复值的出现,从而保证数据的一致性和正确性。
关于为何是集群级配置而非租户级配置,这是因为自增列缓存涉及到整个集群中多个 OBServer 节点之间的协调。如果将此配置项设为租户级,可能会导致各个 OBServer 节点之间的缓存同步出现问题,影响数据的一致性和可靠性。因此,为了保证全局一致性,将其设为集群级配置。
具体信息可参考以下文档:
- autoinc_cache_refresh_interval
- location_cache_refresh_min_interval
- enable_auto_refresh_location_cache
1 个赞
文中提到的cache问题很常见,通过优化refresh和调整interval配置,通常可以解决。
辞霜
#10
autoinc_cache_refresh_interval 的“刷新”既不是把本地 Cache 分配进度写回内部表,也不是回收未使用的 Cache 并重新申请。它做的是一件更窄的事:定期从全局(内部表 / GAIS)拉取最新的 sync_value,更新本机内存里的 local_sync_。
autoinc_cache_refresh_interval 控制的是 NOORDER 模式下,本机定期从全局拉取 sync_value 更新 local_sync_ 的频率;本地 Cache 的分配、回收,以及向内部表的写入,分别由其他路径负责。
OB行者
#12
1.Cache的有效期是多久?我刷的频率多少才能保证在有效期;
2.如果超出有效期会怎么样?
3.你说的这些有官方文档依据没?
OB行者
#13
sync_value 是全局的ID分配进度? local_sync_是每个节点的ID分配进度?
OB行者
#15
为什么要刷这个东西,有啥好处。我不刷或者间隔特别大会造成什么影响
假调我调整参数过小,刷的太频繁有什么影响没?
辞霜
#16
这里的“刷新自增列缓存”更准确地说,是刷新本机缓存的全局同步水位让本机知道“集群里已经同步到多大的自增值”。
作用主要是:
- 减少不必要的全局同步
- 插入显式自增值或处理自增值时,如果本机知道
insert_value <= local_sync_,就可以判断这个值已经不需要再推到全局。
- 否则可能会额外访问全局自增服务,更新
sync_value。
- 让不同 OBServer 对全局自增水位的认知更及时
- NOORDER 模式下,不同 OBServer 会各自持有本地自增 Cache。
- 定期刷新
sync_value 可以让本机更快感知其他节点已经推进过的全局水位。
- 降低显式插入较大自增值时的冲突或重复风险窗口
- 如果某个节点插入了较大的显式自增值,并同步到了全局,其他节点通过刷新可以更快看到这个水位。
- 但它不是回收本地未用完的 Cache,也不是把本地 Cache 当前分配进度写回内部表。
刷新太频繁的影响主要是性能开销增加:
- 每次刷新需要访问全局自增服务,底层可能涉及 RPC 或内部表读取。
- 在高并发 INSERT、很多自增表、很多 OBServer 的场景下,刷新太频繁会增加全局自增服务和内部表访问压力。
- 还会增加锁竞争,因为刷新时会进入
sync_mutex_ 保护逻辑。
- 对业务来说,可能表现为自增值分配路径上的额外延迟,尤其是 NOORDER 模式大量写入时。
1 个赞
OB行者
#17
大概明白了。我理解核心作用:
1.解决noorder模式下插入显式自增值的冲突风险,但无法彻底解决;
2.解决noorder模式下插入显式自增值RPC全局访问的可能性;
结合收益、影响以及这个场景的使用频率,综合判断,这个值调低没必要,可以调大。