写点什么

TiDB 如何获取集群创建时间

  • 2022 年 7 月 11 日
  • 本文字数:1009 字

    阅读完需:约 3 分钟

作者: jansu-dev 原文来源:https://tidb.net/blog/654fa1be


【是否原创】是


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



        做了一些小改动,逆着代码思路取出的时间基本符合要求,能确保年月日级别的准确性。大家也可以直接点击 代码链接 直接修改其中 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}
复制代码


        希望对大家有帮助!


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB 如何获取集群创建时间_实践案例_TiDB 社区干货传送门_InfoQ写作社区