# 路由功能

__*PD 路由*__

![left](./student-guide/diagram/RoutingCapabilities_aa_002_20220509.png)
-------------------------------------------------------------
因为 PD 保存了所有 TiKV 的集群信息,自然对 TiDB Server 提供了路由的功能。假设 

TiDB Server  要对 key 写入一个值。

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

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

3. 有可能 region 的 leader 已经漂移到其他 peer,TiKV 会返回 NotLeader 错误,并带上新的 leader 的地址,TiKV Client 在 Region Cache 里面更新,并重新向新的 leader 发送请求。

4. 也有可能 region 的 version 已经变化,譬如 split 了,这时候,key 可能已经落入了新的 region 上面,TiKV Client 会收到 StaleCommand 的错误,于是重新从 PD 获取,进入状态 1。