向量数据库Milvus源码开发贡献实践

文摘   2024-08-27 18:33   上海  

Milvus 是一款云原生的开源向量数据库,广泛应用于高维向量数据的管理和人工智能驱动的相似性搜索。无论是在构建智能搜索引擎还是开发数据驱动的应用,Milvus 都能提供强大的支持。我们将一起从头开始实践 Milvus 的标准开发流程,包括如何搭建开发环境、构建 Milvus、运行测试以及如何将您的代码贡献给 Milvus。
01
Hello Milvus
想要成为Milvus开发者为开源社区贡献,首先要做的就是为Milvus设置开发环境。由于Milvus有一些特定版本的第三方依赖项,如果你是使用linux系统,那么恭喜你不太会遇到编译问题。如果是mac 系统,尤其是M1可能会遇到一些编译上的问题,没有关系,我们在这里整理了常见几大类问题,方便社区开发者查阅,更多内容可以参考
https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md
本地构建
如果你想在本地构建Milvus,Milvus已经将所有要求放入install_deps.sh文件中。只需运行以下命令即可安装所有第三方依赖项:
# Install third-party dependencies.$ cd milvus/$ ./scripts/install_deps.sh
# Compile Milvus.$ make
Docker环境构建
有两种方法,一种是在构建的Docker容器中运行命令,另一种是进入开发容器进行开发。
# method 1: run a command in a built docker containerbuild/builder.sh make
# method 2: get into a dev container to make milvus./scripts/devcontainer.sh up docker-compose -f docker-compose-devcontainer.yml ps docker exec -ti milvus-builder-1 bash make milvus
02
常见的坑
  • Brew: Unexpected Disconnect while reading sideband packet
在使用Homebrew时,可能会遇到意外断开连接的问题,解决方法为加大postBuffer容量。
==> Tapping homebrew/coreremote: Enumerating objects: 1107077, done.remote: Counting objects: 100% (228/228), done.remote: Compressing objects: 100% (157/157), done.error: 545 bytes of body are still expected.44 MiB | 341.00 KiB/sfetch-pack: unexpected disconnect while reading sideband packetfatal: early EOFfatal: index-pack failedFailed during: git fetch --force origin refs/heads/master:refs/remotes/origin/mastermyuser~ %
git config --global http.postBuffer 1M
如果安装后出现“Brew: command not found”错误,请配置Git用户信息:
git config --global user.email xxxgit config --global user.name xxx
  • Docker: error getting credentials - err: exit status 1, out: ``
处理方法是从~/.docker/config.json中删除“credsStore”字段。
  • Python: No module named 'imp'
    Python 3.12已移除imp模块,目前需要降级到Python 3.11。
  • Conan: Unrecognized arguments: --install-folder conan
    请将Conan版本更改为1.61。
  • Conan command not found
    通过在bash中导出Python的bin路径来解决
    export PATH="/path/to/python/bin:$PATH"
  • Llvm: use of undeclared identifier 'kSecFormatOpenSSL'
重新安装 llvm@15
brew reinstall llvm@15export LDFLAGS="-L/opt/homebrew/opt/llvm@15/lib"export CPPFLAGS="-I/opt/homebrew/opt/llvm@15/include"
03
Vscode设置
使用Vscode将C++和Go集成在一起非常方便,只要将user.settings文件替换为以下配置即可。
{ "go.toolsEnvVars": { "PKG_CONFIG_PATH": "/Users/zilliz/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig", "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64", "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64" }, "go.testEnvVars": { "PKG_CONFIG_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig", "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64", "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64" }, "go.buildFlags": [ "-ldflags=-r /Users/zilliz/workspace/milvus/internal/core/output/lib" ], "terminal.integrated.env.linux": { "PKG_CONFIG_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib/pkgconfig:/Users/zilliz/workspace/milvus/internal/core/output/lib64/pkgconfig", "LD_LIBRARY_PATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64", "RPATH": "/Users/zilliz/workspace/milvus/internal/core/output/lib:/Users/zilliz/workspace/milvus/internal/core/output/lib64" }, "go.useLanguageServer": true, "gopls": { "formatting.gofumpt": true }, "go.formatTool": "gofumpt", "go.lintTool": "golangci-lint", "go.testTags": "dynamic", "go.testTimeout": "10m"}
04
构建Milvus
有两种模式来构建Milvus:Milvus Standalone和Milvus Cluster。两者都包括三个组件:
  • Milvus:核心功能组件。
  • Etcd:元数据引擎,访问和存储Milvus内部组件的元数据。
  • MinIO:存储引擎,负责Milvus的数据持久化。
Milvus Cluster包括额外的组件 — Pulsar,用于通过Pub/Sub机制进行分布式处理。
Milvus Standalone
Milvus Standalone独立运行为单个实例。
sudo docker-compose -f deployments/docker/dev/docker-compose.yml up -dbash ./scripts/start_standalone.sh
Milvus Cluster
Milvus Cluster跨多个节点运行。所有Milvus实例聚合在一起,形成一个统一的系统,以支持更大的数据量和更高的流量负载。
我们可以使用Milvus Operator来安装Milvus Cluster,它帮助我们将完整的Milvus服务堆栈部署和管理到K8s中,直接参考这篇就可以了。

https://milvus.io/docs/install_cluster-milvusoperator.md

Milvus Standalone
Milvus Standalone以单一instance独立运行。
05
运行E2E测试
无论是构建Milvus Standalone还是Milvus Cluster,我们都可以运行E2E测试。详细步骤如下:
https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md#e2e-tests
cd tests/python_clientpip install -r requirements.txtpytest --tags=L0 -n auto
06
最后一步 - 提交代码
恭喜你如果通过了所有单元测试和E2E测试。如果没有就修复修改并重新编译。通常第一次编译会比较久,但是后面会很快的,所以不要担心!
在通过所有测试后,我们可以最终提交更改。请注意,所有的Milvus Pull Request需要与Milvus Issue相关联,可以先去社区搜索是否存在相关的issue
https://github.com/milvus-io/milvus/issues
如果没有的话,就需要先创建一个与更改相关的新问题。
  • Fork Milvus到你的仓库
  • 克隆到本地并切出新分支
  • 提交你的代码:通过在提交中添加“signed-off-by”信息进行提交
git commit -m "Commit of your change" -s
更多详细信息,请查看
https://github.com/milvus-io/milvus/blob/master/CONTRIBUTING.md
07
最后的最后
Milvus提供了丰富的SDK(Python、Java、Go、Node.js),用户友好,易于上手。如果能成为Milvus开发者是一件非常酷的事情!期待你一起贡献Milvus代码!也希望这篇文章能够简化你的贡献过程。
作者介绍
推荐阅读












Zilliz
Simply The Fastest Vector Database for AI. Period.
 最新文章