给 Milvus 项目贡献代码的一次经历

2023-5-4|2024-9-13
wuxiaobai24
wuxiaobai24
type
status
date
slug
summary
tags
category
icon
password
💡
这篇文章记录了我给 Milvus 贡献代码的过程。

🚀 起因

最近 ChatGPT 火出了圈,让越来越非从业者也接触到了 AI,大家对于技术的关注又开始聚集到 AI 上了(上一次个人认为是 CNN 大火的时候,算法工程师的地位被空前的拔高,但是在19年左右,可能又回到了冷淡期,没想到那么快又有火出圈的东西出现了),作为一个刚开始工作的后端小白,也在思考着怎么让自己的职业规划更加贴近 AI。
由于在工作中没有特别适合的机会,除非直接跳槽。除了在主职工作中接触 AI 相关的技术外,还有一条路径就是开源
Milvus 是在毕业前就关注到的一个开源项目,他们是国内做向量数据库的领头羊,而且从issue上来看也对开发者非常友好,时常有 issue 被标记为 good first issue。因此我在4月25号的时候,我在翻了一会他们的issue后,觉得下面这个 issue 下面回复认领该issue,并很快得到了回复:
[Feature]: Log Module support print NodeID
Updated Apr 25, 2023
notion image

🧑🏻‍💻 开发环境准备

开发环境的配置可以参考这个文档,使用 devcontainer 就可以获得不错的开发体验了。
但是在尝试搭建时还是会遇到一些问题的:
notion image
后面发现是 docker-compose-devcontainer.yml 有些问题,翻了一下 issue 和 PR,可以找到一个PR是修复devcontainer的:
improvement for devcontainer
Updated May 24, 2023
按照这个PR修复后,就可以正常把 devcontainer 跑起来了:
notion image
notion image

❓ Issue 分析

💡
Currently all log format is
time level line details.
For a cluster we need to know NodeID to distinguish diffenerent nodes.
问题描述还是挺简短的,就是在 Milvus 集群中希望通过 NodeID 来区分不同节点的日志。
在想着如何完成这个issue之前,我们可以通过官方文档我们可以简单了解到 Milvus 的基本架构:
Milvus 架构图
Milvus 架构图
从上图可以看出来,Milvus 又多个 Worker Node,Worker Node 又可以分为 Query Node、Data Node和Index Node,而且我们可以知道这些节点应该是通过 etcd 来管理的
这个问题可以简单先划分为两个子问题:
  1. 如何获取 NodeID?
  1. 怎么在日志中加入 NodeID?

如何获取 NodeID?

光靠看代码和思考,肯定不能很好的解决方法,我们可以先看看现有的日志是怎样的。
从之前的启动脚本 ./scripts/start_cluster.sh,我们看到这些服务的日志都被写到了 /tmp/中了
notion image
随便找一个日志看看,query.log
notion image
可以看到这个日志中已经包含了 NodeID 了,并且在其他日志中也可以看到类似的日志。
这时我们可以翻一下对应的代码:
看起来所谓的 nodeID,其实也是 session 的 ServerID,同时查看session_util.go的代码,我们可以可以知道在 ServerID 是 session.Init 时完成初始化的。并且初始化后保存到了 paramtable 里面。
💡
通过追踪日志和阅读代码,我们基本可以解决”如何获取 NodeID ?”的问题了。

怎么在日志中加入 NodeID?

简单翻阅代码,我们可以知道,Milvus 是使用 zap 日志库,并在 zap 上面封装了一层,其代码在pkg/log 中。
利用 phind.com 我们可以很容易知道 zap 可以使用`With`来让一个 logger 增加一列:
notion image
(后面它胡说八道了一大堆,这里选择忽视)
通过追踪代码,我们可以发现每个服务都在 roles.go 里面调用了 logutil.SetupLogger ,同时这个地方又能使用 paramtable 获取到 NodeID,因此,这里可以在这里把 NodeID 穿到 LoggerConfig里面,并在初始化 logger 的时候调用`With`方法将 node_id 注入日志中。
相关更改:

提交MR

进行简单的测试,确认功能没问题后,可以运行下面这些命令进行格式检查:
然后再将修改push到github:
最后,到 Github 上提交PR即可:
notion image

后续

Waiting…
CMU15-445 Project0 CppPrimer读《检索匹配:深度学习在搜索、广告、推荐系统中的应用》