事物提交问题咨询

当一个大事物开始后,所有的写操作都会在memtable 中,当memtable 使用的内存占满后,且这个大事物还未提交的情况下,还会继续写入memtable 吗?数据库是否会将未提交的数据转储释放空间呢?如果memtable 空间沾满会影响重放任务吗?是否会出现重放延时告警呢?

1 个赞

@论坛小助手

1 个赞

根据文档库中的信息,以下是关于您提出的问题的详细解答:

1. 当一个大事务开始后,所有的写操作都会在 MemTable 中,当 MemTable 使用的内存占满后,且这个大事务还未提交的情况下,还会继续写入 MemTable 吗?

  • 根据文档片段 4 和文档片段 8 的描述,OceanBase 数据库会将数据更新写入到 MemTable 中。如果 MemTable 内存达到一定阈值(例如 memory_limit),OceanBase 数据库会触发限速机制来限制客户端的写入速度(参见文档片段 2 中的 alter system set writing_throttling_trigger_percentage = 80 TENANT = ALL;)。这意味着,当 MemTable 占满时,OceanBase 不会继续无限制地写入 MemTable,而是通过限速机制来控制写入流量。

2. 数据库是否会将未提交的数据转储释放空间呢?

  • 根据文档片段 8 的描述,OceanBase 数据库会在 MemStore 使用超过一定阈值之后进行转储,将 MemStore 持久化到 SSTable 上。然而,未提交的数据不会直接被转储,因为这些数据仍然需要保持在内存中以确保事务的一致性和原子性。只有在事务提交成功后,相关的 clog 才会被多数派落盘,并异步回放到 Follower 副本的 MemStore 中。
  • 因此,在事务未提交之前,OceanBase 不会将未提交的数据转储释放空间。

3. 如果 MemTable 空间占满会影响重放任务吗?是否会出现重放延时告警呢?

  • 根据文档片段 6 和文档片段 8 的描述,MemTable 空间占满可能会间接影响重放任务。具体来说:
    • 当 MemTable 达到上限时,OceanBase 数据库会限制写入速度(参见文档片段 2 中的限速机制)。
    • 如果 MemTable 长时间无法释放空间,可能会导致 clog 回放速度受限(参见文档片段 2 中的注意部分:“限速会限制 clog 回放速度,可能会影响转储的触发时机”)。
    • 如果 clog 回放速度受限,可能会出现重放延时告警。这是因为 OceanBase 数据库依赖 clog 来保证数据的持久性和一致性,而重放延迟可能导致系统整体性能下降。

总结

  • MemTable 内存占满时,OceanBase 数据库会通过限速机制来控制写入速度,而不是继续无限制地写入。
  • 未提交的数据不会被转储,只有在事务提交后才会进行转储。
  • MemTable 空间占满可能会影响重放任务,并可能导致重放延时告警。

以上信息来源于以下文档片段:

如果您还有其他疑问,请随时提问!

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

  1. 产品 FAQ
  2. 事务相关规范
  3. 列存 FAQ
  4. 在您开始前
  5. 并发控制概述
  6. 系统内存不足/泄漏
  7. 节点数据盘空间满
  8. 集群管理 FAQ
  9. MemTable
  10. 内存管理概述
2 个赞

在v4版本中,如果一个大事物开始后,写满2MB缓冲区后会立即写到clog 并同步到从副本,并不用等事物提交后才写clog 和同步吧?@论坛小助手

1 个赞

根据文档库中的信息,以下是关于您提出的问题的详细解答:

问题分析

在 OceanBase 数据库 V4 版本中,是否会在事务写满 2MB 缓冲区后立即写到 Clog 并同步到从副本,而不用等到事务提交后再写 Clog 和同步?


回答

根据文档片段 1 的信息:

在 V3.x 及之后的版本中,OceanBase 数据库新增了即时写日志功能,当事务内数据超过 2 MB 时,生成 Redo 日志,提交到 Clog 模块。

这表明,在 V3.x 及更高版本(包括 V4)中,OceanBase 数据库支持 即时写日志功能。具体来说:

  • 如果事务在执行过程中产生的数据量超过了 2MB 缓冲区大小,OceanBase 数据库会立即将这些数据转换为 Redo 日志,并提交到 Clog 模块。
  • Clog 模块负责将日志通过 Multi-Paxos 协议同步到所有副本(包括 Follower 副本),以确保高可用性和持久性。

因此,在 V4 版本中,确实不需要等到事务提交后才写 Clog 和同步。只要事务的数据量达到 2MB,就会触发即时写日志功能,将日志写入 Clog 并同步到从副本。


关键点总结

  1. 即时写日志功能:V3.x 及之后的版本支持此功能,当事务数据量超过 2MB 时,会立即生成 Redo 日志并提交到 Clog 模块。
  2. Clog 同步:Clog 模块会通过 Paxos 协议将日志同步到多数派副本(包括 Follower 副本),确保数据一致性。
  3. 事务提交前的行为:即使事务尚未提交,只要数据量达到 2MB,就会触发日志写入和同步操作。

结论

在 OceanBase 数据库 V4 版本中,如果一个大事务开始后,写满 2MB 缓冲区后会立即写到 Clog 并同步到从副本,而不用等到事务提交后再写 Clog 和同步。

以上信息来源于以下文档片段:

Redo 日志 → 日志的产生

如果您还有其他疑问,请随时提问!

检索到的文档如下:

  1. Redo 日志
  2. 集群管理 FAQ
  3. 并发控制概述
  4. 事务相关规范
  5. 日志同步问题
  6. ilog_index_expire_time
  7. OceanBase 数据库整体架构
  8. 体验并行导入和数据压缩
2 个赞

MEMSTORE满了事务就直接报错了,如果有一部分事务的数据已经发生了转储,那么转储的数据不会进行立马的清除,但是这部分数据肯定数据库会标记一个状态,在L0层往L1层下压的过程,会回收这个事务执行失败的数据,这个是我的理解,不知道是否准确

2 个赞

重放任务延时后,会自动重试吗?重试的规则是如何定义的呢?@论坛小助手

1 个赞

根据文档库中的信息,以下是关于您提出的问题的详细解答:

问题分析

当重放任务出现延时后,OceanBase 数据库是否会自动重试?如果会,重试的规则是如何定义的?


回答

1. 重放任务延时后是否会自动重试

根据文档片段 3 和文档片段 8 的描述,OceanBase 数据库在某些情况下会对失败的任务进行自动重试。例如:

  • get_tenant 失败的情况下,系统会清理 retry 标记并尝试重新获取租户资源。
  • 对于 Clog 的重放任务,如果因网络或其他原因导致重放失败,OceanBase 数据库通常会自动重试以确保数据一致性。

因此,重放任务延时后,OceanBase 数据库会根据具体场景进行自动重试


2. 重试规则的定义

重试规则的具体定义取决于任务类型和上下文环境。以下是一些可能的规则(综合多个文档片段的信息):

  1. 基于超时机制的重试

    • 如果某个任务(如 Clog 重放)因网络延迟或节点故障导致超时,OceanBase 数据库会在一定时间内多次尝试重试。
    • 超时时间由相关配置项控制,例如:
      • ob_trx_timeout:事务超时时间,单位为微秒。
      • ob_trx_idle_timeout:事务空闲超时时间,单位为微秒。
    • 如果重试仍然失败且超出了最大重试次数或超时时间,任务可能会被标记为失败,并需要人工干预。
  2. 基于心跳检测的重试

    • OceanBase 数据库通过心跳机制监控节点状态。如果某个节点暂时不可用(例如网络抖动),系统会在心跳恢复后自动重试未完成的任务。
    • 配置项 server_permanent_offline_time 定义了节点心跳中断多久后被认为永久下线。在此时间范围内,系统会持续尝试重试任务。
  3. 基于 Paxos 协议的重试

    • 在分布式环境中,Clog 的重放依赖 Paxos 协议来保证多数派副本的一致性。如果某个副本暂时无法参与投票,OceanBase 数据库会等待该副本恢复或切换到其他可用副本,并重新发起 Paxos 投票过程。
  4. 手动触发重试

    • 对于某些特定任务(如 obshell 中的任务),可以通过命令手动触发重试。例如:
      /home/admin/oceanbase/bin/obshell task retry -i <task_id>
      
      (参考文档片段 1)

3. 重试失败后的处理

如果重试多次仍然失败,OceanBase 数据库可能会采取以下措施:

  • 将任务标记为失败状态,并记录日志以便排查问题。
  • 触发告警通知运维人员进行人工干预。
  • 在某些情况下(如节点永久下线),系统会自动补齐丢失的副本以恢复服务。

总结

  1. 重放任务延时后会自动重试:OceanBase 数据库会根据任务类型和上下文环境自动重试失败的任务。
  2. 重试规则的定义
    • 基于超时机制:由 ob_trx_timeoutob_trx_idle_timeout 等配置项控制。
    • 基于心跳检测:由 server_permanent_offline_time 控制。
    • 基于 Paxos 协议:通过多数派投票机制保证一致性。
    • 手动触发重试:通过工具(如 obshell)手动执行。

以上信息来源于以下文档片段:

  • 文档片段 1obshell task retry 命令说明。
  • 文档片段 8:高可用 FAQ 中关于副本自动补齐和选举机制的描述。

如果您还有其他疑问,请随时提问!

详情请参考:

  1. obshell 任务命令组
  2. MySQL 事务控制
  3. get_tenant 失败后重试无法退出
  4. 管理历史统计信息
  5. 重启节点
  6. server_permanent_offline_time
  7. 使用 MySQL 租户做常见数据库开发
  8. 高可用 FAQ
  9. 锁机制
1 个赞

这个应该是基础理论

1 个赞