当前位置:网站首页>GC 机制简介
GC 机制简介
2022-07-19 13:24:00 【添香小铺】
TiDB 的事务的实现采用了 MVCC(多版本并发控制)机制,当新写入的数据覆盖旧的数据时,旧的数据不会被替换掉,而是与新写入的数据同时保留,并以时间戳来区分版本。Garbage Collection (GC) 的任务便是清理不再需要的旧数据。
整体流程
一个 TiDB 集群中会有一个 TiDB 实例被选举为 GC leader,GC 的运行由 GC leader 来控制。
GC 会被定期触发。每次 GC 时,首先,TiDB 会计算一个称为 safe point 的时间戳,接下来 TiDB 会在保证 safe point 之后的快照全部拥有正确数据的前提下,删除更早的过期数据。每一轮 GC 分为以下三个步骤:
- "Resolve Locks" 阶段会对所有 Region 扫描 safe point 之前的锁,并清理这些锁。
- "Delete Ranges" 阶段快速地删除由于
DROP TABLE
/DROP INDEX
等操作产生的整区间的废弃数据。 - "Do GC" 阶段每个 TiKV 节点将会各自扫描该节点上的数据,并对每一个 key 删除其不再需要的旧版本。
默认配置下,GC 每 10 分钟触发一次,每次 GC 会保留最近 10 分钟内的数据(即默认 GC life time 为 10 分钟,safe point 的计算方式为当前时间减去 GC life time)。如果一轮 GC 运行时间太久,那么在一轮 GC 完成之前,即使到了下一次触发 GC 的时间也不会开始下一轮 GC。另外,为了使持续时间较长的事务能在超过 GC life time 之后仍然可以正常运行,safe point 不会超过正在执行中的事务的开始时间 (start_ts)。
实现细节
Resolve Locks(清理锁)
TiDB 的事务是基于 Google Percolator 模型实现的,事务的提交是一个两阶段提交的过程。第一阶段完成时,所有涉及的 key 都会上锁,其中一个锁会被选为 Primary,其余的锁 (Secondary) 则会存储一个指向 Primary 的指针;第二阶段会将 Primary 锁所在的 key 加上一个 Write 记录,并去除锁。这里的 Write 记录就是历史上对该 key 进行写入或删除,或者该 key 上发生事务回滚的记录。Primary 锁被替换为何种 Write 记录标志着该事务提交成功与否。接下来,所有 Secondary 锁也会被依次替换。如果因为某些原因(如发生故障等),这些 Secondary 锁没有完成替换、残留了下来,那么也可以根据锁中的信息取找到 Primary,并根据 Primary 是否提交来判断整个事务是否提交。但是,如果 Primary 的信息在 GC 中被删除了,而该事务又存在未成功提交的 Secondary 锁,那么就永远无法得知该锁是否可以提交。这样,数据的正确性就无法保证。
Resolve Locks 这一步的任务即对 safe point 之前的锁进行清理。即如果一个锁对应的 Primary 已经提交,那么该锁也应该被提交;反之,则应该回滚。而如果 Primary 仍然是上锁的状态(没有提交也没有回滚),则应当将该事务视为超时失败而回滚。
Resolve Locks 有两种执行模式:
LEGACY
(默认模式):由 GC leader 对所有的 Region 发送请求扫描过期的锁,并对扫到的锁查询 Primary 的状态,再发送请求对其进行提交或回滚。PHYSICAL
:TiDB 绕过 Raft 层直接扫描每个 TiKV 节点上的数据。
警告
PHYSICAL
模式(即启用 Green GC)目前是实验性功能,不建议在生产环境中使用。
你可以通过修改系统变量 tidb_gc_scan_lock_mode 的值切换 Resolve Locks 的执行模式。
Delete Ranges(删除区间)
在执行 DROP TABLE/INDEX
等操作时,会有大量连续的数据被删除。如果对每个 key 都进行删除操作、再对每个 key 进行 GC 的话,那么执行效率和空间回收速度都可能非常的低下。事实上,这种时候 TiDB 并不会对每个 key 进行删除操作,而是将这些待删除的区间及删除操作的时间戳记录下来。Delete Ranges 会将这些时间戳在 safe point 之前的区间进行快速的物理删除。
Do GC(进行 GC 清理)
这一步即删除所有 key 的过期版本。为了保证 safe point 之后的任何时间戳都具有一致的快照,这一步删除 safe point 之前提交的数据,但是会对每个 key 保留 safe point 前的最后一次写入(除非最后一次写入是删除)。
在进行这一步时,TiDB 只需要将 safe point 发送给 PD,即可结束整轮 GC。TiKV 会自行检测到 safe point 发生了更新,会对当前节点上所有作为 Region leader 进行 GC。与此同时,GC leader 可以继续触发下一轮 GC。
注意
从 TiDB 5.0 版本起,CENTRAL
GC 模式(需要 TiDB 服务器发送 GC 请求到各个 Region)已经废弃,Do GC 这一步将只以 DISTRIBUTED
GC 模式(从 TiDB 3.0 版起的默认模式)运行。
边栏推荐
猜你喜欢
查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题
What is the difference between shallow copy and deep copy?
Ceres robust curve fitting
吃透Chisel语言.19.Chisel组合电路(一)——Chisel组合电路与Chisel条件语句
无心剑英译吴飞《经纬之歌》
网络原理(2)——网络开发
QGIS mosaic tile grid data
[matlab project practice] Research on UAV image compression technology based on region of interest
有奖互动|7.19数据库升舱计划实战峰会:行业领袖齐聚,他们因何而来?
[introduction series of redis] get to know redis and the installation of redis
随机推荐
C语言深度剖析笔记1
Bi skills - same month on month calculation
Linux 编译安装redis 离线
吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块
What does the server white list mean
[introduction series of redis] get to know redis and the installation of redis
PHP anonymous function usage
【WSN通信】基于matlab生物地理学优化HWSN节能聚类协议【含Matlab源码 1989期】
Immediate assertion and concurrent assertion in SystemVerilog
kubeadm介绍
PLC lislam line face cylinder laser slam
技术人如何打响个人品牌?五大顶级KOL独家传授
【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键
UVM in UVM_ Usage with parameters in event
[ERROR] COLLATION ‘utf8_ unicode_ ci‘ is not valid for CHARACTER SET ‘latin1‘
Question 121: the best time to buy and sell stocks
面试必问之项目的组成
DS(ArrayStructure)
走进首个通用无代码开发平台—iVX
Omnipeek 抓包工具