Docker環(huán)境下Milvus向量數(shù)據(jù)庫(kù)的穩(wěn)定部署與常見(jiàn)問(wèn)題總結(jié)
前言
Milvus 作為高性能開(kāi)源向量數(shù)據(jù)庫(kù),在 AI 應(yīng)用中被廣泛使用。但在 Docker 環(huán)境下部署時(shí),很多小伙伴會(huì)遇到鏡像拉取失敗、容器反復(fù)重啟、磁盤(pán)空間爆滿(mǎn)、數(shù)據(jù)“不翼而飛”、鎖屏后服務(wù)中斷等一系列問(wèn)題。本文將結(jié)合我在 VMware 虛擬機(jī) + CentOS 7 環(huán)境下的真實(shí)排坑經(jīng)歷,從零到一,帶你完成一個(gè)穩(wěn)定、持續(xù)運(yùn)行的 Milvus 獨(dú)立部署,并附上各類(lèi)常見(jiàn)故障的解決方案。
環(huán)境介紹
- 宿主機(jī):Windows 10 + VMware Workstation 16
- 虛擬機(jī):CentOS 7.9(帶圖形界面)
- Docker 版本:20.10.x
- Milvus 版本:v2.6.2(standalone 模式)
- 其他工具:Attu(Milvus 可視化管理)、pymilvus、Dify(知識(shí)庫(kù)應(yīng)用)
一、安裝 Milvus:使用官方腳本
Milvus 官方提供了 standalone_embed.sh 腳本,可以一鍵拉取鏡像并啟動(dòng)內(nèi)嵌 etcd 的 standalone 版本,非常適合本地開(kāi)發(fā)與測(cè)試。
1.1 下載安裝腳本
由于 raw.githubusercontent.com 在國(guó)內(nèi)經(jīng)常被屏蔽,我們改用 jsDelivr CDN 下載:
curl -sfL https://cdn.jsdelivr.net/gh/milvus-io/milvus/scripts/standalone_embed.sh -o standalone_embed.sh chmod +x standalone_embed.sh
如果 CDN 也失敗,你可以手動(dòng)創(chuàng)建腳本內(nèi)容(文末附有簡(jiǎn)潔版腳本)。
1.2 配置 Docker 鏡像加速(必須)
編輯 /etc/docker/daemon.json,添加國(guó)內(nèi)鏡像源:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker1.3 啟動(dòng) Milvus
bash standalone_embed.sh start
腳本會(huì)自動(dòng)拉取鏡像(默認(rèn) milvusdb/milvus:v2.6.2),創(chuàng)建容器并等待約 90 秒初始化??吹?“Start successfully.” 即安裝成功。
端口說(shuō)明:
19530:gRPC 服務(wù)端口(SDK 連接用)9091:WebUI 管理界面(可通過(guò)瀏覽器訪(fǎng)問(wèn))2379:內(nèi)嵌 etcd 端口(一般不用關(guān)心)
二、讓 Milvus 持續(xù)駐留,告別“自動(dòng)掉線(xiàn)”
很多同學(xué)反映容器運(yùn)行一段時(shí)間后就自己停了,尤其是在鎖屏或重啟虛擬機(jī)之后。問(wèn)題核心在于:
- 容器沒(méi)有自動(dòng)重啟策略
- 虛擬機(jī)鎖屏后可能掛起(Suspend)
2.1 添加容器自動(dòng)重啟策略
在腳本啟動(dòng)成功后,立即執(zhí)行:
docker update --restart unless-stopped milvus-standalone
這樣即使容器異常退出(如 OOM、etcd 故障),Docker 也會(huì)自動(dòng)把它拉起來(lái)。
2.2 安全地禁止虛擬機(jī)掛起(非常重要?。?/h3>
千萬(wàn)不要用 systemctl mask sleep.target ... ,它會(huì)導(dǎo)致圖形界面無(wú)法啟動(dòng)或黑屏!取而代之,我們編輯 /etc/systemd/logind.conf 并重啟服務(wù):
sudo sed -i 's/^#HandleSuspendKey=.*/HandleSuspendKey=ignore/' /etc/systemd/logind.conf sudo sed -i 's/^#HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf sudo systemctl restart systemd-logind
這樣鎖屏或合上筆記本蓋都不會(huì)觸發(fā)掛起,且完全不影響桌面環(huán)境。
2.3 限制 Docker 日志防止磁盤(pán)爆滿(mǎn)(血的教訓(xùn)?。?/h3>
如果容器日志無(wú)限制,幾天就可能占滿(mǎn)整個(gè)虛擬機(jī)磁盤(pán),導(dǎo)致容器退出(狀態(tài) Exited)。在 /etc/docker/daemon.json 中追加日志限制:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart docker配置后已經(jīng)運(yùn)行的容器不會(huì)立即生效,需要重建容器或重啟 Docker 后重新創(chuàng)建容器。如果當(dāng)前容器未限制日志,可先 docker stop milvus-standalone && docker rm milvus-standalone 再重新運(yùn)行腳本啟動(dòng)即可。
三、數(shù)據(jù)持久化與恢復(fù)
3.1 數(shù)據(jù)到底存在哪兒?
腳本啟動(dòng)時(shí)會(huì)自動(dòng)將當(dāng)前目錄下的 volumes/milvus 映射到容器內(nèi)的 /var/lib/milvus,因此所有向量數(shù)據(jù)和 etcd 元數(shù)據(jù)都在宿主機(jī)上。只要這個(gè)目錄不被刪除,容器怎么換都丟不了數(shù)據(jù)。
千萬(wàn)不要執(zhí)行 bash standalone_embed.sh delete,這個(gè)命令會(huì)徹底刪除數(shù)據(jù)目錄!
3.2 “數(shù)據(jù)不見(jiàn)了”怎么辦?
常見(jiàn)場(chǎng)景:重啟 Milvus 后,用 Attu 或 pymilvus 連上發(fā)現(xiàn)集合為空。這大概率不是數(shù)據(jù)丟了,而是內(nèi)嵌 etcd 元數(shù)據(jù)損壞或服務(wù)未正常啟動(dòng)。可通過(guò)以下步驟修復(fù):
# 1. 停止故障容器 docker stop milvus-standalone docker rm milvus-standalone # 2. 備份并重置 etcd 元數(shù)據(jù)(原有的向量數(shù)據(jù)還在) mv /root/volumes/milvus/etcd /root/volumes/milvus/etcd_backup_$(date +%Y%m%d%H%M%S) # 3. 重新用腳本啟動(dòng)(會(huì)自動(dòng)生成新的 etcd 并掃描舊數(shù)據(jù)) bash standalone_embed.sh start docker update --restart unless-stopped milvus-standalone
啟動(dòng)后,之前的 collection 和向量數(shù)據(jù)會(huì)重新出現(xiàn)。
3.3 磁盤(pán)空間爆滿(mǎn)的排查
突然發(fā)現(xiàn)根分區(qū) 100% 占用,常見(jiàn)元兇是:
- 容器內(nèi)部數(shù)據(jù)(忘記掛載外部卷):如果你某次用了錯(cuò)誤的
docker run -v或沒(méi)用掛載,Milvus 會(huì)將數(shù)據(jù)全部寫(xiě)入容器可寫(xiě)層,快速占滿(mǎn)磁盤(pán)。此時(shí)docker container prune -f刪除已停止的舊容器即可瞬間釋放幾十 GB。 - Docker 日志無(wú)限增長(zhǎng):日志大小限制必須提前設(shè)置,否則很快就吞掉磁盤(pán)。
四、常見(jiàn)錯(cuò)誤與解決
| 錯(cuò)誤信息 | 原因 | 解決辦法 |
|---|---|---|
iptables: No chain/target/match by that name | Docker 的 iptables 規(guī)則鏈丟失 | 重啟 Docker 服務(wù):sudo systemctl restart docker |
etcdserver: request timed out | etcd 連接超時(shí),元數(shù)據(jù)損壞 | 按上述“重置 etcd 元數(shù)據(jù)”步驟處理 |
| 容器反復(fù)重新啟動(dòng) (Exited 255) | 通常為 etcd 損壞或 OOM | 查看日志 docker logs milvus-standalone,并考慮增加內(nèi)存或重置 etcd |
pymilvus 連接 ECONNRESET | 服務(wù)未完全就緒或 etcd 故障 | 等待 1-2 分鐘,或檢查日志;若 etcd 報(bào)錯(cuò)則重置 etcd |
| Attu 連接成功但看不到集合 | etcd 元數(shù)據(jù)丟失 | 同樣需要重置 etcd |
| 虛擬機(jī)鎖屏后 Milvus 停止 | 系統(tǒng)掛起導(dǎo)致 | 按上面方法配置 logind.conf |
五、管理與連接
5.1 Attu 圖形化連接
下載 Attu 桌面版或使用 Docker 版,連接地址:127.0.0.1:19530(如果在虛擬機(jī)內(nèi)部訪(fǎng)問(wèn))。
如果從宿主機(jī)訪(fǎng)問(wèn),需在 VMware 中配置端口轉(zhuǎn)發(fā)(NAT 模式)或使用橋接網(wǎng)絡(luò),防火墻放行 9091/19530/5432 等端口。
5.2 pymilvus 連接示例
from pymilvus import connections connections.connect(host="localhost", port="19530")
5.3 備份 Milvus 數(shù)據(jù)
建議定期備份:
sudo tar -czf /backup/milvus_$(date +%Y%m%d).tar.gz /root/volumes/milvus
六、總結(jié)與最佳實(shí)踐
- 啟動(dòng)腳本:始終用
standalone_embed.sh start,避免手動(dòng)docker run時(shí)遺漏掛載參數(shù)。 - 自動(dòng)重啟:創(chuàng)建后立即
docker update --restart unless-stopped。 - 防掛起:使用
HandleSuspendKey=ignore代替systemctl mask。 - 日志限制:部署之初就配置 Docker deamon 日志上限。
- 數(shù)據(jù)備份:定期打包
/root/volumes/milvus。 - 清理舊容器:每周運(yùn)行
docker container prune -f回收空間。
按照這樣的配置,你的 Milvus 服務(wù)就能在 Docker 環(huán)境中非常穩(wěn)定地運(yùn)行,無(wú)論是開(kāi)發(fā)調(diào)試還是作為 Dify 等應(yīng)用的向量存儲(chǔ)后端,都不會(huì)輕易掉線(xiàn)。
到此這篇關(guān)于Docker環(huán)境下Milvus向量數(shù)據(jù)庫(kù)的穩(wěn)定部署與常見(jiàn)問(wèn)題總結(jié)的文章就介紹到這了,更多相關(guān)Docker下Milvus向量數(shù)據(jù)庫(kù)部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Docker實(shí)現(xiàn)Redis主從+哨兵搭建的示例實(shí)踐
本文主要介紹了基于Docker實(shí)現(xiàn)Redis主從+哨兵搭建的示例實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
使用Docker構(gòu)建開(kāi)發(fā)環(huán)境的方法步驟(?Windows和mac)
利用Docker,我們可以做很多事情。所以本文就詳細(xì)介紹了使用Docker構(gòu)建開(kāi)發(fā)環(huán)境的方法步驟,分為?Windows和mac版本,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
在 Centos 7.9 中如何安裝與配置 Docker 20.10.
這篇文章主要介紹了在 Centos 7.9 中如何安裝與配置 Docker 20.10.18,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
window-docker的容器使用宿主機(jī)音頻設(shè)備的過(guò)程詳解
這篇文章主要介紹了window-docker的容器使用宿主機(jī)音頻設(shè)備的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-05-05
Docker容器使用jenkins部署web項(xiàng)目(總結(jié))
這篇文章主要介紹了Docker容器使用jenkins部署web項(xiàng)目(總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Docker部署前后端分離項(xiàng)目的實(shí)現(xiàn)示例
本文主要介紹了Docker部署前后端分離項(xiàng)目的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Docker+Jenkins實(shí)現(xiàn)一鍵自動(dòng)化部署項(xiàng)目的圖文教學(xué)
Jenkins是一個(gè)廣泛使用的開(kāi)源持續(xù)集成工具,它能自動(dòng)化構(gòu)建,測(cè)試和部署軟件項(xiàng)目,本文主要介紹了關(guān)于docker搭建Jenkins實(shí)現(xiàn)一鍵自動(dòng)化部署項(xiàng)目,需要的朋友可以參考下2025-05-05
基于Kubernetes和Docke實(shí)現(xiàn)留言簿案例
這篇文章主要介紹了基于Kubernetes和Docke實(shí)現(xiàn)留言簿案例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10

