# 路由功能

__*PD 路由*__

![`smart`](./student-guide/diagram/RoutingCapabilities_aa_002_20220509.png)
-------------------------------------------------------------
因为 `PD` 保存了所有 `TiKV` 的集群信息, 自然对 `TiDB` server 提供了路由的功能。假设 `TiDB` server 要写入一个值。

1. `TiKV Client` 先从 `PD` 获取 key 属于哪一个 `Region`, `PD` 将这个 `Region` 相关的元信息返回。

2. `TiKV Client` 有一个 `Region Cache` 可以缓存元信息, 这样就不需要每次都从 `PD` 获取。然后直接给 `Region` 的 `leader` 发送命令。

3. 有可能 `Region` 的 `leader` 已经漂移了, `TiKV` 会返回 `NotLeader` 错误, 并带上新的 `leader` 的地址, `TiKV Client` 在 `Region Cache` 内更新, 并重新向新的 `leader` 发送请求。

4. 也有可能 `Region` 的 `version` 已经变化, 譬如分裂了, 这时, key 可能已经落入了新的 `Region`, `TiKV Client` 会收到 `StaleCommand` 的错误, 于是重新从 `PD` 获取。


