作者:jansu-dev
【是否原創】是 TiDB 社群
【正文】
一、前言
很久沒寫文章了,今天在同僚的提示的情況下,處理了一個 TiDB 擷取叢集建立時間的問題,覺得有必要記錄一下防止遺忘,也分享給大家。
二、探索
首先,翻遍 TiDB 官方文檔也沒有找到能夠查詢 TiDB 叢集初始化時間的方法。所有監控資訊(Dashboard、Grafana)都隻能僅查詢各元件的 Startup Time,查詢表的 Create Time 也不準确。
其次,之前知道在叢集初始化的時候 PD 會初始化一個 ClusterID 并持久化。即然,TiDB 官方沒有提供查詢接口,那能夠分别叢集的也許隻有這一個資訊了。最開始,一直在嘗試使用 pd-ctl 的
tiup ctl:v5.2.3 pd tso 1571036791
直接轉譯 TSO ,但始終沒有成功。
最後在一位同僚的提醒下,翻了下 PD 在初始化 Cluster_ID 時的源碼,才成功解決問題。詳情見 三、解決 部分。
三、解決
看了下 PD 代碼,在這個 initOrGetClusterID 函數中,Cluster ID 是取目前時間的 Unix 時間戳左移 32 位,再加一個随機數獲得。是以直接轉譯是無法獲得正确時間的。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5iMxMDM4U2M1AjNmFzN5UmYyYzX1MTM0QTMxAzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.jpg)
做了一些小改動,逆着代碼思路取出的時間基本符合要求,能確定年月日級别的準确性。大家也可以直接點選 代碼連結 直接修改其中 Cluster ID 值擷取結果。
其實,之後嘗試過右移 32 位再用 pd-ctl tso 轉譯還是不成功的。估計是因為 TiDB 的 TSO 由 “實體時間+邏輯時間” 組成,而 Cluster ID 的計算由 “實體時間+随機數” 組成吧,本身就不是一個東西吧。
四、代碼邏輯
package main
import ("fmt"
"time")
func main() {
//Get from pd.log (cat {{/path/to}}/pd.log|grep "init cluster id")
// [2019/10/14 10:35:38.880 +00:00] [INFO] [server.go:212] ["init cluster id"] [cluster-id=6747551640615446306]
history_ts := uint64(6747551640615446306)
sub_history_ts := history_ts >> 32
ret := time.Unix(int64(sub_history_ts),0)
fmt.Println(ret)
fmt.Println("And the direct >>32 cluster-id is : ", sub_history_ts ,",you can try it by pd-ctl,but not correct!!!")
//Although there is random number, but the year/month/day is still accurate
// --> 2019/10/14 vs 2019-10-14
}