天天看點

TiDB 如何擷取叢集建立時間

作者: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 位,再加一個随機數獲得。是以直接轉譯是無法獲得正确時間的。

TiDB 如何擷取叢集建立時間

        做了一些小改動,逆着代碼思路取出的時間基本符合要求,能確定年月日級别的準确性。大家也可以直接點選 ​​代碼連結​​ 直接修改其中 Cluster ID 值擷取結果。

TiDB 如何擷取叢集建立時間

        其實,之後嘗試過右移 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
}