boysxw
#1
生产环境 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是等否有区别呢?
论坛小助手
#4
根据文档库中的信息,以下是关于 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 模式更适合关系型数据存储。
总结建议
-
避免在 SQL 模式下使用 TTL 功能:
- 如果必须使用 TTL 功能,请尽量选择 OBKV 模式,以避免 SQL 场景下可能引发的数据误删除问题。
- 如果必须在 SQL 模式下使用 TTL 功能,请确保业务逻辑不依赖于过期数据,并定期监控 TTL 任务的执行状态。
-
合理选择模式:
- 对于键值对存储场景,推荐使用 OBKV 模式。
- 对于复杂查询和事务操作场景,推荐使用 SQL 模式。
-
监控和优化:
- 定期检查 TTL 任务的状态(通过视图
DBA_OB_KV_TTL_TASKS
和 DBA_OB_KV_TTL_TASK_HISTORY
)。
- 配合 Major Compaction 释放存储空间,避免因 LSM-Tree 架构导致的存储空间占用问题。
如果仍有疑问,建议联系 OceanBase 技术支持团队获取进一步帮助。
更多信息请查看:
- 用户自定义变量
- MemTable
- OceanBase 数据库社区版 V4.2.1
- SQL 调优典型场景和案例
- 阅读和管理 OceanBase 数据库 SQL 执行计划
- 与 MySQL 兼容性对比
- GV$OB_SQL_AUDIT
- 访问控制概述
- 兼容模式
1 个赞