黄东旭解析 TiDB 的核心优势
661
2023-11-29
最近笔者在 asktug 回答问题的时候发现,在 6.5.0 版本出现了几个 显示未启动必要组件 NgMonitoring 的问题贴。经过排查发现,是 ngmonitoring.toml 中的配置文件出现了问题。文件中的 endpoints 应该是以逗号分隔的,但是却写成了以空格分隔的情况,所以才导致了报错。
临时的解决方案就是手动修改配置文件,并 restart prometheus。
(这里借用一下原帖中的截图)
原帖地址:
使用 TiUP 部署的集群显示集群中未启动必要组件 NgMonitoring
v6.5.1 dashboard 异常
前面已经发现问题了,先简单分析一下,这里是配置文件出现问题了,那么大概率是需要到 TiUP 的仓库中去修复 bug。所以笔者就到 github 中找到了 TiUP 仓库。
tiup 仓库地址:pingcap/tiup: A component manager for TiDB (github.com)
首先笔者需要知道出问题的具体代码在哪,所以笔者先根据文件中的注释进行查找。
这个配置文件与 ngmonitoring.toml 完全吻合,点进去查看,笔者发现这里使用的变量名是PDAddrs
继续使用 PDAddrs 进行查找,看看代码中是如何给 PDAddrs 赋值的。在结果中排除掉路径中带有 template 关键字的文件,发现只有路径为 pkg/cluster/spec/monitoring.go 的文件最符合。
查看代码后发现,NgMonitoringConfig 数据结构正是存储 ngmonitoring.toml 文件中数据的结构,变量 pds 正是出现 bug 的地方了。
笔者梳理了一下这里的逻辑:代码中首先定义了变量 pds 为 string 类型的切片,通过解析 PDServers 变量,把一个或者多个 PDServers 的信息用 append 函数加入到 pds 中,然后把 pds 赋值给 ngcfg。根据这个逻辑,笔者猜测:pds 增加元素之后,数据存储的方式就已经是用空格分隔了。之后,笔者就写了一个简单的 go 的代码,来还原 bug。
import ( "fmt" ) func main() { data := [...]string{"one", "two", "three"} fmt.Println(data) pds := []string{} for i := 0; i < 10; i++ { pds = append(pds, fmt.Sprintf("\"127.0.0.1:4000\"")) } fmt.Println(pds) }输出结果:
根据结果笔者发现,不管是数组还是切片,在 go 的结果中,都是用空格进行分隔的。这个时候笔者脑袋里又出现一个疑问,如果是因为切片存储数据导致的问题,那之前的 tiup 版本为什么没有同样的问题出现呢?
于是笔者翻了上一个 tiup 版本(1.11.1)的代码:
根据数据结构定义,能看到 1.11.3 版本中的 PDAddrs 是 string 类型的。而且赋值部分的代码有了很大的改变,所以可以认定是部分代码优化重构之后,数据结构发生改变导致的 bug。这样就好解决了,笔者只需要把 pds 中的元素改成逗号分隔并传入到 PDServers 中就行了。所以变更如下:
首先需要把 TiUP 项目 Fork 到自己的仓库中,点击这个地方:
然后到自己的仓库中,使用在线的 vscode 进行代码编写及代码提交:
代码修改完毕之后,填写好修改的bug信息,然后提交并推送:
之后到自己的 TiUP 仓库中,创建一个 pr :
写好相关信息直接提交即可。第一次参与 TiDB 开源项目需要签署 CLA 贡献者许可协议,留意 PR 中机器人的提示就行。
最后就等待反馈,比如有人会告诉你更好的写法,或者是更好的解决方案,或者直接把 PR 合并到了 master。
到这里,一个开源项目的 bug 修复就已经完成了。
由于笔者是第一次参与开源项目,整个过程花费了一些时间去摸索。所以在这里记录了自己成为 Contributor 的全过程,给想要为开源项目尽一份力的同学一个参考,为开源社区贡献自己的一份力量。
PS:第一次为 TiDB 开源项目做出自己的贡献还是非常令人激动的。在此感谢原厂大佬在我的 PR 基础上给了代码优化的建议。
作者介绍:caiyfc,来自神州数码钛合金战队,是一支致力于为企业提供分布式数据库TiDB整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有TiDB高级资格证书,并活跃于TiDB开源社区,是官方认证合作伙伴。目前已为10+客户提供了专业的TiDB交付服务,涵盖金融、证券、物流、电力、政府、零售等重点行业。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。