sql模式下 ttl 删除的风险

生产环境 CE_4.2.1.BP8版本,普通sql模式下表也有ttl功能,
测试普通sql模式下,也可以删除过期数据


但是看文档,普通sql模式下ttl会有丢数据风险
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001177723

疑问:
1、ttl功能在sql模式下删数据,具体风险点不知在哪,可能会导致问题
2、另obkv模式,跟sql模式,不知具体有哪些区别,比如因同一套observer的版本,部分用api写入,部分可以sql模式写入,底层clog、内存中的hash index/btree index是等否有区别呢?

@论坛小助手

根据文档库中的信息,以下是关于 TTL 功能在 SQL 模式下删除数据的风险点以及 OBKV 模式与 SQL 模式的区别的详细解答:


1. TTL 功能在 SQL 模式下删除数据的具体风险点

根据官方文档的说明,TTL 功能在 SQL 模式下的主要风险在于可能导致不可预期的数据误删除问题。具体风险点如下:

  • SQL 场景下禁用 TTL 的原因:

    • OceanBase 数据库明确指出,TTL 功能仅限于 OBKV 场景使用,SQL 场景下禁用该功能。
    • 在 SQL 场景下,TTL 删除任务可能会导致数据误删除,因为 SQL 查询和操作可能依赖于未被及时清理的过期数据。
  • 过期数据的可见性问题:

    • 在 OBKV 场景下,过期数据会被屏蔽(即对用户不可见),但在 SQL 场景下,过期数据在被 TTL 删除任务清理之前仍然是可见的。
    • 如果 SQL 查询或事务操作依赖于这些过期数据,而 TTL 删除任务提前清理了这些数据,则可能导致业务逻辑错误。
  • LSM-Tree 架构的影响:

    • OceanBase 使用 LSM-Tree 架构,删除操作实际上是一个追加写入操作。即使通过 TTL 删除了过期数据,实际存储空间可能不会立即释放,甚至可能暂时增加。
    • 存储空间的最终释放需要依赖 Major Compaction,这可能导致数据在一段时间内仍然存在于底层存储中,增加了误删除的风险。
  • 后台低优先级任务的不确定性:

    • TTL 删除任务是一个后台低优先级任务,无法保证过期数据的立即删除。
    • 如果系统内存压力较大(如 MemStore 内存超过阈值 FREEZE_TRIGGER),TTL 任务会暂停执行,直到内存降低到阈值以下。这种不确定性可能导致数据在 TTL 策略生效前被意外访问或修改。

2. OBKV 模式与 SQL 模式的区别

OBKV 模式和 SQL 模式是 OceanBase 数据库提供的两种不同场景下的数据操作方式,以下是它们的主要区别:

(1) 数据操作接口

  • OBKV 模式:

    • 提供 NoSQL 风格的 API 接口(如 TableAPI),适合键值对存储场景。
    • 支持更高效的 TTL 功能,能够自动屏蔽过期数据,确保用户读取不到已过期的记录。
    • 更适合高并发、低延迟的场景,例如缓存系统或实时数据分析。
  • SQL 模式:

    • 提供标准的 SQL 接口,支持复杂的查询和事务操作。
    • 不支持自动屏蔽过期数据,过期数据在被 TTL 删除任务清理之前仍然可见。
    • 更适合关系型数据库场景,例如 OLTP 和 OLAP 应用。

(2) 数据存储结构

  • OBKV 模式:

    • 使用 Hash Index 或 BTree Index 进行数据存储和索引。
    • 数据以键值对的形式存储,适合范围查询和精确匹配。
  • SQL 模式:

    • 使用 BTree 结构进行数据存储和索引。
    • 数据以表的形式存储,支持复杂的多列查询和联接操作。

(3) TTL 功能的支持

  • OBKV 模式:

    • 完全支持 TTL 功能,并且能够自动屏蔽过期数据。
    • TTL 删除任务完成后,过期数据对用户完全不可见。
  • SQL 模式:

    • 虽然从 V4.2.1_CE 版本开始支持 TTL 功能,但存在上述提到的风险。
    • 过期数据在被 TTL 删除任务清理之前仍然可见,可能导致业务逻辑错误。

(4) 性能差异

  • OBKV 模式:

    • 更适合高并发、低延迟的场景,性能优于 SQL 模式。
    • 数据写入和读取路径更短,适合简单的键值对操作。
  • SQL 模式:

    • 更适合复杂查询和事务操作,但性能可能低于 OBKV 模式。
    • 数据写入和读取路径较长,适合复杂的多列查询和联接操作。

(5) CLog 和索引的区别

  • OBKV 模式:

    • 使用 CLog 记录数据变更,支持高效的增量同步。
    • 索引基于 Hash Index 或 BTree Index,适合精确匹配和范围查询。
  • SQL 模式:

    • 同样使用 CLog 记录数据变更,但索引基于 BTree Index,适合复杂的多列查询。
    • 在同一套 Observer 版本中,部分数据可以通过 API 写入(OBKV 模式),部分数据可以通过 SQL 写入(SQL 模式)。底层的 CLog 和索引机制是一致的,但 OBKV 模式更适合键值对存储,SQL 模式更适合关系型数据存储。

总结建议

  1. 避免在 SQL 模式下使用 TTL 功能:

    • 如果必须使用 TTL 功能,请尽量选择 OBKV 模式,以避免 SQL 场景下可能引发的数据误删除问题。
    • 如果必须在 SQL 模式下使用 TTL 功能,请确保业务逻辑不依赖于过期数据,并定期监控 TTL 任务的执行状态。
  2. 合理选择模式:

    • 对于键值对存储场景,推荐使用 OBKV 模式。
    • 对于复杂查询和事务操作场景,推荐使用 SQL 模式。
  3. 监控和优化:

    • 定期检查 TTL 任务的状态(通过视图 DBA_OB_KV_TTL_TASKSDBA_OB_KV_TTL_TASK_HISTORY)。
    • 配合 Major Compaction 释放存储空间,避免因 LSM-Tree 架构导致的存储空间占用问题。

如果仍有疑问,建议联系 OceanBase 技术支持团队获取进一步帮助。

更多信息请查看:

  1. 用户自定义变量
  2. MemTable
  3. OceanBase 数据库社区版 V4.2.1
  4. SQL 调优典型场景和案例
  5. 阅读和管理 OceanBase 数据库 SQL 执行计划
  6. 与 MySQL 兼容性对比
  7. GV$OB_SQL_AUDIT
  8. 访问控制概述
  9. 兼容模式
1 个赞