请教两个小问题:
- rocksdb中的raftcf(rocksdb.raftcf)的作用是什么?官档上没搜到相关说明
- tidb如何存储全局的事务信息,比如类似Innodb的readview。当GC时如果快速判断最早事务的startts从而能动态调整safepoint。
- prewrite因为锁冲突失败时回滚删除Lockcf操作应该也会走一遍raft然后在lockcf put一个delete记录吧。
谢谢!
请教两个小问题:
默认 RocksDB 实例将 KV 数据存储在内部的 default、write 和 lock 3 个 CF 内。
default CF 存储的是真正的数据,与其对应的参数位于 [rocksdb.defaultcf] 项中;
write CF 存储的是数据的版本信息(MVCC)以及索引相关的数据,相关的参数位于 [rocksdb.writecf] 项中;
lock CF 存储的是锁信息,系统使用默认参数。
参考 配置信息:
[rocksdb]
[rocksdb.defaultcf]
[rocksdb.writecf]
[rocksdb.lockcf]
[rocksdb.raftcf]
[raftdb]
[raftdb.defaultcf]
[rocksdb.raftcf]
block-size = "16KB"
block-cache-size = "128MB"
disable-block-cache = false
cache-index-and-filter-blocks = true
pin-l0-filter-and-index-blocks = true
use-bloom-filter = true
whole-key-filtering = true
bloom-filter-bits-per-key = 10
block-based-bloom-filter = false
read-amp-bytes-per-bit = 0
compression-per-level = ["no", "no", "no", "no", "no", "no", "no"]
write-buffer-size = "128MB"
max-write-buffer-number = 5
min-write-buffer-number-to-merge = 1
max-bytes-for-level-base = "128MB"
target-file-size-base = "8MB"
level0-file-num-compaction-trigger = 1
level0-slowdown-writes-trigger = 20
level0-stop-writes-trigger = 36
max-compaction-bytes = "2GB"
compaction-pri = 0
dynamic-level-bytes = false
num-levels = 7
max-bytes-for-level-multiplier = 10
compaction-style = 0
disable-auto-compactions = false
soft-pending-compaction-bytes-limit = "64GB"
hard-pending-compaction-bytes-limit = "256GB"
可以明确 RaftCF 是存放 Raft Log数据的
tidb 的全局事务是由 PD 来调度的,因而执行的时间和判断条件都是由 PD 的 TSO 来决策的
不论读或者写,都需要调用 TSO 来获取相应的版本,实现MVCC(写会调度两次 TSO )
所以事务在提交时,就可以获取到整体最大的 TSO 是多少了
每个tikv实例有 两个RocksDB实例。RocksDB为了保证数据持久化会有WAL log。WAL log单独指定存储感觉性能能提升些。
读也会获取一个时间戳的话,就是根据时间戳比较获取一个read view视图呗。
2.tidb 会定期把正在执行事务的最早的开启时间上报到 pd,gc leader 的 tidb-server 计算的时候会从 pd 读取全局最小的 start_ts
3.清锁操作也是走 raft 的
每个tidb内有没有一种内存结构来记录正在执行的事务,通过定期扫描这个结构就能找到最早事务?最早事务的上报是由某个单独线程来完成吗?
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。