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 container
build/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/core
remote: 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/s
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: index-pack failed
Failed during: git fetch --force origin refs/heads/master:refs/remotes/origin/master
myuser~ %
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@15
export 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 -d
bash ./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_client
pip install -r requirements.txt
pytest --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代码!也希望这篇文章能够简化你的贡献过程。
作者介绍
推荐阅读