尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Ubuntu 22.04 手动部署 Milvus 向量数据库与 Attu 可视化实战指南

Ubuntu 22.04 手动部署 Milvus 向量数据库与 Attu 可视化实战指南 1. 项目缘起为什么要在Ubuntu上折腾Milvus和可视化最近在搞一个本地知识库的检索增强项目核心需求是把一堆文档向量化后存起来实现语义级别的快速搜索。向量数据库是绕不开的一环而Milvus作为这个领域的明星选手自然成了我的首选。不过官方文档虽然详尽但大多是针对Docker Compose或者Kubernetes的快速启动对于想在纯净的Ubuntu系统上“从零开始”部署并希望能直观看到数据状态的朋友来说信息就有点分散了。我这次的目标很明确在一台Ubuntu 22.04 LTS的服务器上不依赖云服务手动安装并配置一个单机版的Milvus然后给它配上一个图形化的管理界面。这个过程里你会遇到从系统依赖、服务启停到网络配置的一系列细节问题。网上很多教程要么是纯Docker命令的堆砌要么是点到为止真正部署时那些“坑”一个都不会少。这篇文章就是我这次完整部署过程的实录包含了每一步的操作意图、背后的原理以及我踩过并填平的坑。无论你是想学习Milvus的部署还是单纯需要一个可复现的Ubuntu服务搭建指南相信都能从中找到答案。2. 环境准备与核心组件解析在开始敲命令之前我们必须先理清我们要安装的到底是什么以及它们之间的依赖关系。这能帮你理解每一步在做什么而不是机械地复制粘贴。2.1 Milvus的架构与安装模式选择Milvus是一个专为向量相似度搜索设计的数据库。它本身不是一个单一的进程而是一组协同工作的微服务主要包括协调服务 (Coordinator Service) 负责请求调度、元数据管理是大脑。数据节点 (Data Node) 负责向量数据的持久化存储与索引构建。查询节点 (Query Node) 负责加载索引到内存并执行搜索查询。索引节点 (Index Node) 负责为向量数据构建索引如IVF_FLAT, HNSW等。代理 (Proxy) 对外提供统一的gRPC和RESTful API接口。对于安装Milvus官方主要推荐两种方式Docker Compose 最快捷通过一个YAML文件一键拉起所有组件包括Etcd、MinIO等依赖。适合快速体验和开发测试。从RPM/DEB包安装 更贴近生产环境适合需要深度定制、资源控制或无法使用Docker的场景。我们的目标是在Ubuntu上获得更“原生”的控制感因此选择从DEB包安装。这意味着我们需要手动处理它的所有依赖主要是Etcd用于元数据存储和MinIO用于对象存储存放实际的向量数据文件。至于可视化我们会选择一个独立的、通过连接Milvus服务来工作的Web工具。2.2 基础系统环境确认我的操作环境是一台干净的Ubuntu 22.04.4 LTS x86_64虚拟机。首先进行基础检查# 检查系统版本和内核 lsb_release -a uname -r # 更新软件包列表并升级现有包这是一个好习惯 sudo apt update sudo apt upgrade -y # 安装一些后续可能需要的工具 sudo apt install -y wget curl vim net-tools注意 确保你的系统架构是x86_64。Milvus也支持ARM但包和依赖可能不同。如果使用虚拟机请确认已在BIOS/固件设置中开启了虚拟化支持如Intel VT-x/AMD-V这对于后续运行Docker如果我们用Docker跑MinIO或保证性能很重要。3. 分步安装构建Milvus的运行基石我们将按照依赖层自底向上的顺序安装先搞定存储和协调依赖Etcd, MinIO再安装Milvus本体。3.1 安装并配置Etcd (v3.5)Etcd是一个高可用的键值存储Milvus用它来存储集合Collection、分区Partition、索引定义等元数据。下载Etcd二进制包 访问Etcd的GitHub发布页找到适合的版本。这里以3.5.13为例。ETCD_VERSION3.5.13 wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz解压并安装到系统路径tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz cd etcd-v${ETCD_VERSION}-linux-amd64 sudo mv etcd etcdctl /usr/local/bin/ cd ..创建Etcd系统服务 为了让Etcd在后台稳定运行且能开机自启我们创建systemd服务。sudo vim /etc/systemd/system/etcd.service将以下配置粘贴进去。这里我们让Etcd监听本地的2379客户端端口和2380节点间通信端口数据目录设为/var/lib/etcd。[Unit] Descriptionetcd key-value store Afternetwork.target [Service] Typenotify ExecStart/usr/local/bin/etcd \ --name default \ --data-dir /var/lib/etcd \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://localhost:2379 \ --listen-peer-urls http://0.0.0.0:2380 \ --initial-advertise-peer-urls http://localhost:2380 \ --initial-cluster defaulthttp://localhost:2380 Restartalways RestartSec10s LimitNOFILE40000 [Install] WantedBymulti-user.target启动并验证Etcd服务# 创建数据目录 sudo mkdir -p /var/lib/etcd sudo chown $USER:$USER /var/lib/etcd # 根据情况调整权限 # 重载systemd并启动服务 sudo systemctl daemon-reload sudo systemctl enable etcd sudo systemctl start etcd # 检查状态和端口 sudo systemctl status etcd sudo netstat -tlnp | grep 2379如果状态为active (running)且能看到2379端口在监听说明Etcd安装成功。可以用etcdctl version验证客户端工具。3.2 安装并配置MinIOMinIO是一个高性能的对象存储兼容Amazon S3 API。Milvus将向量数据分段Segment后以文件形式存储在MinIO中。这里我们选择用Docker运行MinIO因为它能极大简化部署和管理。安装Docker 如果你的系统还没有Docker请先安装。# 卸载旧版本 sudo apt remove docker docker-engine docker.io containerd runc # 设置仓库并安装 sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 将当前用户加入docker组避免每次用sudo sudo usermod -aG docker $USER newgrp docker # 或注销重新登录生效使用Docker运行MinIO 我们创建一个本地目录来持久化MinIO的数据并通过环境变量设置默认的访问密钥用户名和密码。# 创建数据目录 mkdir -p ~/minio/data # 运行MinIO容器 docker run -d \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -v ~/minio/data:/data \ -e MINIO_ROOT_USERminioadmin \ -e MINIO_ROOT_PASSWORDminioadmin \ quay.io/minio/minio server /data --console-address :9001参数解释-p 9000:9001 9000是API端口S3兼容9001是Web控制台端口。-v 将主机目录挂载到容器内实现数据持久化。-e 设置环境变量这里设置了默认的管理员账号密码。在生产环境中务必使用强密码--console-address 指定控制台端口。验证MinIO 访问http://你的服务器IP:9001使用上面设置的用户名(minioadmin)和密码(minioadmin)登录。你应该能看到MinIO的控制台。可以尝试创建一个Bucket例如命名为milvus-bucket后续Milvus会用到。3.3 安装Milvus Standalone现在主角Milvus可以登场了。我们安装其“单机版”Standalone它包含了所有必要的微服务组件但以单个进程包的形式呈现便于管理。下载Milvus DEB安装包 前往 Milvus官网的Release页面 找到最新稳定版的milvus-xxx-amd64.deb文件。例如wget https://github.com/milvus-io/milvus/releases/download/v2.4.3/milvus_2.4.3-1_amd64.deb安装DEB包sudo dpkg -i milvus_2.4.3-1_amd64.deb # 如果提示缺少依赖运行以下命令修复 sudo apt --fix-broken install -y安装完成后Milvus的相关文件会部署在/var/lib/milvus和/etc/milvus等目录。关键一步配置Milvus 这是最容易出错的地方。我们需要修改Milvus的配置文件告诉它Etcd和MinIO在哪里。sudo vim /etc/milvus/milvus.yaml在这个庞大的YAML文件中找到并修改以下几个关键部分a. 配置Etcd地址 (在etcd部分)etcd: endpoints: - localhost:2379 # 改为你Etcd的地址这里是本地b. 配置MinIO对象存储地址 (在minio部分)minio: address: localhost:9000 # MinIO的API地址 port: 9000 accessKeyID: minioadmin # 你在启动MinIO时设置的用户名 secretAccessKey: minioadmin # 对应的密码 useSSL: false # 我们本地测试不用SSL bucketName: milvus-bucket # 你在MinIO控制台提前创建好的Bucket名称c. 确认服务端口 (在proxy部分)proxy: port: 19530 # Milvus的服务端口客户端通过这个端口连接踩坑提示 配置文件的缩进是YAML语法的一部分务必保持正确。建议使用vim的:set paste模式粘贴防止自动缩进混乱。另外bucketName指定的Bucket必须提前在MinIO中创建好否则Milvus启动时会报错。启动Milvus服务sudo systemctl start milvus sudo systemctl enable milvus # 设置开机自启 sudo systemctl status milvus使用journalctl -u milvus -f可以实时查看日志。如果看到[INFO] [sessionutil/session_util.go:xxx] [server is ready]之类的日志并且状态显示为active (running)恭喜你Milvus服务启动成功了基础功能验证 我们可以用Python客户端快速测试一下服务是否正常。# 安装Milvus Python SDK pip install pymilvus创建一个简单的Python测试脚本test_connect.pyfrom pymilvus import connections, utility # 连接到Milvus服务 connections.connect(hostlocalhost, port19530) # 尝试获取服务版本信息 print(utility.get_server_version()) # 列出所有集合刚开始应该是空的 print(utility.list_collections())运行脚本如果成功输出版本号和一个空列表说明Milvus安装、配置、连接全部正常。4. 可视化方案选型与实战部署服务跑起来了但黑乎乎的终端不是长久之计。我们需要一个可视化工具来管理集合、查看数据、执行查询。这里我对比了几种方案最终选择了Attu。4.1 为什么选择Attu官方出品兼容性最佳 由Milvus团队开发维护与Milvus版本同步更新功能最全。功能全面 支持集合管理、数据插入/查询/删除、索引管理、系统监控等。部署简单 提供Docker镜像一条命令即可启动。开源免费 无需额外费用。其他可选方案如MongoDB Compass不适用、各种基于SDK自研的简单UI在易用性和功能完整性上都不如Attu。4.2 使用Docker部署AttuAttu同样提供了Docker镜像部署非常方便。docker run -d \ -p 8000:3000 \ --name attu \ -e MILVUS_URL你的Milvus服务IP:19530 \ zilliz/attu:latest参数解释-p 8000:3000 将容器的3000端口映射到主机的8000端口。-e MILVUS_URL这是最关键的环境变量必须设置为你的Milvus Proxy服务地址。如果你的Attu和Milvus安装在同一台机器且Milvus配置的proxy.address是0.0.0.0或localhost这里可以填localhost:19530。如果Attu部署在其他机器则需要填写Milvus服务器的真实IP地址。重要网络坑点 这里最容易出问题。如果Milvus的milvus.yaml中proxy.address配置的是localhost或127.0.0.1那么它只接受来自本机的连接。当Attu通过Docker运行即使在同一台主机从Docker容器内访问localhost指的是容器自己而不是宿主机。因此你有两个选择修改Milvus配置 将proxy.address改为0.0.0.0让Milvus监听所有网卡然后Attu的MILVUS_URL设置为宿主机的IP如192.168.1.100:19530。使用Docker网络 创建一个自定义Docker网络将Milvus如果用Docker运行和Attu加入同一网络然后使用容器名访问。但因为我们Milvus是宿主机安装的方法1更直接。我选择方法1。编辑/etc/milvus/milvus.yaml找到proxy: address: 0.0.0.0 # 确保是这个 port: 19530然后重启Milvus服务sudo systemctl restart milvus。 最后运行Attu容器时MILVUS_URL设置为http://宿主机IP:19530例如-e MILVUS_URLhttp://192.168.1.100:19530。4.3 访问与使用Attu在浏览器中打开http://你的服务器IP:8000即可进入Attu的登录界面。首次使用无需密码直接点击连接。在连接配置页面Address 填入你的Milvus地址同上例如192.168.1.100:19530。如果Milvus配置了用户名密码默认没有则在下方填写。 点击连接后你就能看到Attu的主界面了。在这里你可以创建集合 定义向量维度、索引类型等。插入数据 通过上传CSV或JSON文件或手动输入来插入向量和标量数据。执行搜索 输入一个向量进行相似度搜索并可视化结果。查看系统信息 监控节点状态、内存使用等。5. 性能调优与生产环境考量把服务跑通只是第一步。如果要用于开发测试甚至小规模生产还需要考虑一些优化和稳定性问题。5.1 Milvus关键配置调优回到/etc/milvus/milvus.yaml有几个参数对性能影响很大缓存相关配置 (在queryNode部分)queryNode: cache: cacheSize: 16GB # 分配给查询节点的缓存大小用于加载索引。建议设置为机器可用内存的50%-70%。更大的缓存意味着更多的索引可以驻留内存搜索速度更快。索引构建参数 (在indexNode部分)common: defaultIndex: # 默认索引构建参数 index_type: IVF_FLAT metric_type: L2 params: nlist: 2048 # IVF索引的聚类中心数。值越大搜索精度越高但构建和搜索耗时也越长。需要根据数据量权衡。nlist是一个关键参数。一个粗略的起点是设置为数据量的平方根然后根据实际测试调整。日志级别 默认是info在调试时可以改为debug但生产环境建议改回info或warn以减少磁盘IO。5.2 系统层面优化文件描述符限制 Milvus可能同时打开大量文件。调整系统限制# 编辑 /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535重启后生效。Swappiness 降低系统的交换倾向避免内存不足时频繁换页影响向量搜索性能。sudo sysctl vm.swappiness1 # 永久生效将 vm.swappiness1 加入 /etc/sysctl.conf5.3 数据备份与监控MinIO数据备份 定期备份~/minio/data目录到其他存储。MinIO本身也支持mc工具的镜像命令。Etcd数据备份 使用etcdctl snapshot save命令定期对Etcd元数据进行快照备份。监控 Milvus暴露了Prometheus格式的指标默认在9091端口。可以搭配Grafana使用官方提供的仪表板进行监控关注QPS、延迟、内存使用等关键指标。6. 常见问题排查与解决思路即使按照步骤操作也难免会遇到问题。这里记录几个我遇到的和可能遇到的典型问题。6.1 Milvus服务启动失败症状sudo systemctl status milvus显示failed或inactive。排查步骤查看详细日志sudo journalctl -u milvus -n 100 --no-pager。这是最重要的线索。常见错误1配置文件语法错误。日志中会有YAML解析错误提示。仔细检查milvus.yaml的缩进和冒号后的空格。常见错误2依赖服务连接失败。如“failed to connect to etcd”或“dial tcp [::1]:2379: connect: connection refused”。这说明Milvus连不上Etcd。请确认Etcd服务是否正在运行sudo systemctl status etcd以及milvus.yaml中的etcd.endpoints配置是否正确如果是本机用localhost:2379如果是其他机器用IP。常见错误3端口被占用。Milvus默认使用19530端口。用sudo netstat -tlnp | grep 19530检查是否被其他进程占用。6.2 Attu无法连接Milvus症状 在Attu界面输入地址后连接超时或失败。排查步骤检查网络连通性 在运行Attu的机器上如果是Docker进入容器docker exec -it attu sh执行nc -zv Milvus_IP 19530看端口是否能通。确认Milvus监听地址 确保Milvus的proxy.address是0.0.0.0而不是127.0.0.1。后者只允许本机连接。检查防火墙 Ubuntu的UFW或云服务商的安全组规则可能屏蔽了19530端口。使用sudo ufw status查看并确保19530端口开放sudo ufw allow 19530。检查Attu环境变量 确认启动Attu容器时MILVUS_URL环境变量设置正确包含了http://前缀和正确的IP、端口。6.3 插入或搜索数据时性能慢症状 插入大批量数据或执行搜索时耗时很长。排查方向索引未构建 对于向量字段插入数据后必须手动构建索引搜索才会快。在Attu的“索引”标签页为集合创建索引。索引类型选择不当FLAT索引最精确但最慢IVF_FLAT、HNSW是精度和速度的权衡。根据数据规模和性能要求选择。硬件资源不足 检查CPU、内存特别是缓存是否够用、磁盘IO。向量搜索是计算和内存密集型操作。段Segment自动合并 Milvus会自动将小段合并成大段以优化查询。合并过程会暂时影响性能。可以通过milvus.yaml中的dataCoord.segment.maxSize等参数控制合并策略。整个部署过程从系统准备到可视化界面可用其实是一个典型的现代服务部署案例理解架构、处理依赖、配置联通、处理网络、后期调优。相比于直接使用Docker Compose一键脚本手动部署让你对Milvus的各个组件和它们之间的协作关系有了更清晰的认识。下次再遇到类似的服务你就能举一反三了。
返回列表