0
1
0
0
专栏/.../

TiDB 如何获取集群创建时间

 jansu-dev  发表于  2022-02-08

【是否原创】是
【首发渠道】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 位,再加一个随机数获得。因此直接转译是无法获得正确时间的。

image

        做了一些小改动,逆着代码思路取出的时间基本符合要求,能确保年月日级别的准确性。大家也可以直接点击 代码链接 直接修改其中 Cluster ID 值获取结果。

image

        其实,之后尝试过右移 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
}

        希望对大家有帮助!

0
1
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论