0

例如:

  1. 有两个项目,k1 和 k2,时间为 t1。
  2. 然后,一个读事务(A)得到一个时间为 t1 的快照。事务(A)用 t1 成功读取了 k1。
  3. 同时,另一个事务(B)在时间 t2(t2>t1)写入 k2。
  4. yugabytedb 以某种方式进行垃圾收集,因此带有 t1 的 k1 将被删除。
  5. 如果事务(A)在时间 t1 读取 k2,它将找不到时间小于 t1 的任何版本的 k2。

我很困惑 yugabytedb 如何保持一致的快照。

几乎搜遍了 yugabytedb 的事务文档,但没有找到任何与垃圾回收相关的内容。

我看过google spanner关于垃圾回收的一些描述,就是将旧版本保留一小时。但是yugabytedb使用HLC而不是Truetime。

谁能介绍一下yugabytedb的垃圾回收机制?和扳手一样吗?

4

1 回答 1

2

YugabyteDB 用于一致性的一般机制是使用混合逻辑时钟(HLC)。请参阅此演示文稿:HLC。使用 HLC,事务可以选择与其事务时间一致的行版本。我相信这是已经知道的。

因为我们使用 LSM 树存储,所以没有数据被覆盖。更新的行意味着同一行的另一个条目,具有不同的 HLC 时间戳。这样,当请求一行时,事务可以选择与其 HLC 一致的行版本。

垃圾收集,别名是清除旧的、非当前版本的行,发生在主要压缩期间。主要压缩是合并 SST 文件的过程。如果大量数据发生更改,则可能会在短时间内发生重大压缩,因此我们实现了参数/gflag --timestamp_history_retention_interval_sec 以保证更改保持可用的最短时间。

显然,如果更改量很少,非当前版本可能会在很长一段时间内保持可用。

压缩发生在每个rocksdb 数据库中,即每个tablet 或二级索引。

于 2021-08-07T18:29:21.680 回答