br/docs/cn/2019-09-09-BR-key-rewrite-disscussion.md
Last updated: 2019-09-12
Key Rewrite 的目的有二:
一个 BR 的 SST 可能包含多个 Tables,所以要支持多条 Rewrite Rules 同时生效。SST 可能来自非 TiDB 系统,所以 Importer 不应该有 Key 编码格式的假设(不一定是 t«tid»_ 开头)。
给 Importer / TiKV 参考的 Key Rewrite 数据结构建议如下:
message RewriteRule {
bytes old_prefix = 1; // this can be empty for universal prefix insertion!
bytes new_prefix = 2; // these are _not_ just an integer!
}
message RestoreRequest {
...
repeated RewriteRule rewrite_rules = N;
...
}
正向替代一个 Key:
fn rewrite_key(rules: &[RewriteRule], key: &[u8]) -> Cow<[u8]> {
for rule in rules {
if key.starts_with(rule.old_prefix) {
return Cow::Owned(rule.new_prefix + key[rule.old_prefix.len()..])
}
}
Cow::Borrowed(key)
}
反向还原一个 Key:
fn undo_rewrite_key(rules: &[RewriteRule], key: &[u8]) -> Cow<[u8]> {
for rule in rules {
if key.starts_with(rule.new_prefix) {
return Cow::Owned(rule.old_prefix + key[rule.new_prefix.len()..])
}
}
Cow::Borrowed(key)
}
现在 BR 的导入流程如下:
因为 markdown 的缘故,我们在这里用粗体来表示 Rewrite 之前的,用斜体来表示 Rewrite 之后的。
当执行了 Key Rewrite,上下游的 Key Range 就会不一致。我们使用红色来标示使用 Rewrite 前的 Keys 的对象、用蓝色标示 Rewrite 后的对象。其中不变的是:
我们看到 Rewrite 前后的 Keys 在各步骤交叉被使用。这里的问题是怎么选一个合适的位置去 Rewrite Keys 来为 BR 提取最大性能。
每个 Peer 独自在 ingest 之前进行 Key Rewrite。