tikv启动和关闭流程

tikv启动和关闭流程,能否详细说下(包括region的处理)?

TiKV 启动后会先读取本地 region 信息,然后为每个 region 创建一个 raft 实例,之后会启动 raftstore 线程池让这些 raft 实例选举出 leader,只有选举出 leader 的 region 才能提供服务。更多细节请阅读 TiKV 源码解析系列

@Little-Wallace-PingCAP 谢谢回复

问题:

region信息是存在kv rocksdb里面么;

是不是在每个key-value写入到rocksdb中都会在key中带上region信息?

请阅读官网文章中 region 的概念

请问是哪篇文章有介绍?

@Little-Wallace-PingCAP 谢谢

里面讲的基本上都是内存中的操作,唯一有讲region存储的是raft rocksdb(pd上的region是缓存就不算),那这样是说region的信息是存储在raft rocksdb中么?

问题还是:tikv启动的时候从哪里读取region信息

建议了解下存储和调度这两块的理论知识

https://docs.pingcap.com/zh/tidb/v4.0/tidb-scheduling

https://docs.pingcap.com/zh/tidb/v4.0/tidb-storage

能否直接说下region信息是保存在哪里?

物理数据信息是在 rocksdb,对应的 region 元信息是保存在 PD。每次访问 TiDB 的时候会先去 PD 里面获取 数据的位置信息,也就是 region 的元信息,然后再去对应的存储节点操作数据。

我其实就是想知道,tikv在startup的时候,是从哪里读取一个region信息(包括region id,region中的key范围)

真正的region信息不是保存在tikv中么,pd上的region应该也是缓存;那么在tikv节点stop的时候是怎么保存这些信息(如region id,region中的key范围),在startup的时候又是从哪里恢复region信息

region 这是一个逻辑概念,真正的数据是保存在 TiKV 里面,那么每个 region 的逻辑信息是保存在 PD 里面,且已经持久化,每次访问的时候从 cache 来获取 region 的元信息,cache 里面的信息也是从 PD 里面加载得到的。

难道tikv节点每次重启的时候,上面的region id都会改变;意思是tikv每次重启都是根据kv rocksdb中数据来切分然后再生成一个个region(按96M一个region)?

又或者说其实region id不会改变,因为region id是按key顺序来生成,所以region id中的key范围也就确定了

先理解下概念的东西,比如 table 和 region 的关系。在建表之后,没有任何处理的时候,默认是有一个初始的 region ,然后在不断写数据之后进行分裂,在每次有新 region 生成的时候,都会把 ID 以及 key 范围信息上报给 PD,这些信息是固定的。后面再进行 merge 等操作时,PD 也会更新对应的 region 信息。

应该是这样;但是tikv节点每次启动的时候,都需要先恢复region信息吧;或者说需要把key切分成一个个region;那问题是如果region信息不保存,那么每次tikv启动的时候,region id是不是都会改变(或者说有些key属于的region id跟先前没有重启的时候不一样)?

意思是,tikv中启动的时候region信息需要去找pd-server么?

region 是逻辑的概念,其物理属性和数据最终存储在 rocksdb kv 里面,tikv 每次启动时会读取 rocksdb 本地存储。

tikv 启动后 pd-worker 线程定期将 region 信息及所在 store 位置上报到 pd,为 tidb 访问 tikv 提供路由信息。

为了避免每次启动都要从所有 tikv 获取全量的 region 信息,pd 也会将 region 信息存储到 etcd,pd leader 节点启动后也会将这部分信息 load 到内存中。

在 pd 集群出现灾难性故障,完全丢失数据的情况下,可以使用 pd-recover 工具进行故障恢复,恢复后 tikv 会重新上报到 pd。

使用 pd-ctl 的 region 命令可以看到全量的 region 信息,也可以根据 region_id 看到每个 region 元信息。

使用 tikv-ctl 可以在每个 tikv 上看到本地存储的 region 信息,比如

本地查看部署在 /path/to/tikv 的 TiKV 上面 Region 2 的 properties 信息

tikv-ctl --db /path/to/tikv/data/db region-properties -r 2

@qizheng 谢谢回复

上面说到,region 是逻辑的概念,其物理属性和数据最终存储在 rocksdb kv 里面,tikv 每次启动时会读取 rocksdb 本地存储。

1、region是逻辑概念
那这么说rocksdb kv中是不会存储region的信息(如果会存储那么第2个问题就不是问题了)?

感觉这样问有些问题,因为region中包含key的范围,而key的数据是存储在rocksdb kv中;

就比如说类似region id,region中key范围这些元数据信息会不会被存储,
还是tikv重启的时候重新划分,这也就是第2个问题了

2、tikv每次重启时会读取rocksdb kv中的信息,
那意思是tikv每次重启的时候都要根据rocksdb中key的范围来重新进行划分region?

region id、region 中 key 范围这些信息也会存储在 tikv,类似 table id 和 table 中包含哪些 region 这些信息也是作为元数据存储的,存储下来后就固定了,但是 region split 分裂后会产生新的 region 和 key 范围。