1. 项目背景与挑战
去年在给某金融机构做知识库升级时,遇到了一个棘手的技术难题:客户内网环境完全隔离,无法访问任何外部镜像仓库,但业务又急需部署Milvus向量数据库来实现语义检索功能。这种"网络孤岛"环境下的离线部署需求,在金融、军工等行业其实非常普遍。
当时尝试了各种方案,最终摸索出一套完整的离线部署流程。整个过程涉及到Docker镜像离线导出、依赖组件兼容性处理、WSL2环境配置等多个技术环节,期间踩过的坑和总结的经验,对类似场景下的工程师应该会有直接参考价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 离线部署方案设计
2.1 核心组件分析
Milvus的标准部署包含以下关键组件:
- 核心服务:query node/data node/index node等
- 存储引擎:etcd(元数据存储)、MinIO/Pulsar(对象存储)
- 管理工具:Attu(Web UI)
在离线环境下,需要提前准备所有这些组件的Docker镜像。经测试发现,官方镜像存在以下依赖关系:
- Milvus镜像基于Ubuntu 20.04
- 需要特定版本的etcd(v3.5.5)
- Pulsar镜像包含JDK11运行时
2.2 镜像获取方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 官方离线包 | 版本匹配完善 | 文件体积大(约8GB) | 网络完全隔离 |
| 自行导出 | 可定制组件 | 需解决依赖冲突 | 部分网络访问 |
| 第三方仓库 | 下载速度快 | 存在安全风险 | 不推荐 |
最终选择在可联网环境提前下载这些镜像:
bash复制docker pull milvusdb/milvus:v2.3.3
docker pull bitnami/etcd:3.5.5
docker pull apachepulsar/pulsar:2.10.2
3. 详细实施步骤
3.1 镜像导出与传输
在可联网机器上执行:
bash复制docker save -o milvus.tar milvusdb/milvus:v2.3.3
docker save -o etcd.tar bitnami/etcd:3.5.5
docker save -o pulsar.tar apachepulsar/pulsar:2.10.2
通过安全U盘将tar文件拷贝到目标机器后:
bash复制docker load -i milvus.tar
docker load -i etcd.tar
docker load -i pulsar.tar
重要提示:确保导出和导入使用相同架构(amd64/arm64)
3.2 WSL2环境配置
在Windows 11上配置:
- 启用Hyper-V和虚拟机平台功能
- 安装WSL2内核更新包
- 设置默认版本:
powershell复制wsl --set-default-version 2 - 创建Ubuntu 20.04实例:
powershell复制wsl --install -d Ubuntu-20.04
3.3 离线安装Docker
在WSL2中:
bash复制# 下载离线包
curl -O https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_20.10.12~3-0~ubuntu-focal_amd64.deb
# 安装依赖
sudo dpkg -i ./docker-ce*.deb
sudo apt-get install -f
3.4 编写docker-compose.yml
关键配置示例:
yaml复制services:
etcd:
image: bitnami/etcd:3.5.5
environment:
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
pulsar:
image: apachepulsar/pulsar:2.10.2
command: bin/pulsar standalone
milvus:
image: milvusdb/milvus:v2.3.3
depends_on:
- etcd
- pulsar
ports:
- "19530:19530"
4. 常见问题解决
4.1 端口冲突处理
典型错误日志:
code复制Error starting userland proxy: listen tcp4 0.0.0.0:19530: bind: address already in use
解决方案:
- 查找占用进程:
bash复制sudo netstat -tulnp | grep 19530 - 修改compose文件中的端口映射:
yaml复制ports: - "19531:19530"
4.2 存储权限问题
WSL2中出现的典型错误:
code复制mkdir: cannot create directory '/var/lib/milvus/data': Permission denied
解决方法:
bash复制sudo chown -R 1000:1000 /var/lib/milvus
4.3 时间同步问题
容器日志出现:
code复制etcdserver: the clock difference against peer is too large
解决方案:
bash复制sudo apt install ntpdate
sudo ntpdate pool.ntp.org
5. 验证与优化
5.1 基础功能测试
使用Python SDK验证:
python复制from pymilvus import connections, utility
connections.connect("default", host="localhost", port="19530")
print(utility.list_collections())
5.2 性能调优建议
-
调整WSL2内存限制:
text复制
[wsl2] memory=8GB保存为
%USERPROFILE%\.wslconfig -
修改Milvus配置:
yaml复制queryNode: cacheEnabled: true cacheMemoryLimit: 4096
6. 扩展方案
对于需要长期维护的场景,建议:
- 搭建本地Registry:
bash复制
docker run -d -p 5000:5000 --restart=always --name registry registry:2 - 推送镜像到内网仓库:
bash复制
docker tag milvusdb/milvus:v2.3.3 localhost:5000/milvus docker push localhost:5000/milvus
实际部署中发现,在32核/64GB内存的物理机上,该方案可支持每秒5000+的向量查询量,完全满足金融风控场景的实时性要求。整个离线部署过程虽然比在线安装复杂,但通过合理的镜像管理和配置优化,最终实现了与云端部署相当的性能表现。
