问题之始
有个springboot项目需要做人脸搜索的功能,mysql数据库没办法做向量检索的操作,只能使用向量数据库了,大概看了一下决定使用milvus,从而开启了一段坑坑洼洼的迷途之旅。
问题1:
作为一个资深码农(自称☺),开始网上找教程安装部署milvus,找了一大轮都是使用Docker部署的方法(也是milvus官方文档推荐),自己按照milvus官方的办法先是在我的开发电脑安装了Docker(因为虚拟化的问题也遇到不少坑,这个可以自行搜索解决),然后安装milvus的过程也很顺利,用attu可以成功登录进去了。但问题是项目是部署在云服务器上的,云服务器本身就是虚拟机,咨询了相关服务商后被告知无法二次虚拟化,连Docker都跑不起来,只能另谋蹊径。
解决过程:
既然用不了Docker进行部署,那可不可以直接绕过Docker,直接在window系统进行部署milvus呢?经过一段时间的网络冲浪,终于找到了办法:window版milvus,这个是window版的milvus,在:milvus/releases下载最新版本,按照文档:在 Windows 上运行 Milvus 2.0的方法终于成功在云服务器上成功启动了milvus!以下是文档的中文翻译截图
问题2:
项目在生产跑的时候一天会产生几千的人脸信息写入milvus,过了一段时间之后发现milvus崩掉了,从报错信息上看是etcd出现了问题 Error: etcdserver: mvcc: database space exceeded
,又是一通网络冲浪,查出来大概就是说,默认情况下,etcd 会保留所有数据的修改历史记录,直到数据量超过空间配额而无法提供服务为止,然后默认的分配空间是2g,需要处理一下。
解决过程:
和老朋友度娘和谷兄玩了一会后,找到的信息都是以下这种处理方式:
#使用API3
export ETCDCTL_API=3
#查看告警信息,告警信息通常 memberID:8630161756594109333 alarm:NOSPACE
etcdctl --endpoints=http://127.0.0.1:2379 alarm list
#获取当前版本
rev=$(etcdctl --endpoints=http://127.0.0.1:2379 endpoint status --write-out=“json” | egrep -o ‘“revision”:[0-9]’ | egrep -o '[0-9].’)
#压缩掉全部旧版本
etcdctl --endpoints=http://127.0.0.1:2379 compact $rev
#整理多余的空间
etcdctl --endpoints=http://127.0.0.1:2379 defrag
#取消告警信息
etcdctl --endpoints=http://127.0.0.1:2379 alarm disarm
这应该是linux的代码与我们window的环境不符,然后etcdctl这个工具在window版的milvus中也没有,只能去etcd下载了,我下载的是etcd-v3.5.11-windows-amd64版本,cd进入etcdctl.exe的目录,试了下可以用,下面是解决问题的操作步骤:
- 输入命令
etcdctl endpoint status --write-out="table"
DB SIZE显示的容量超过2g(默认的)就会报错用不了,我这里是正常的,其中
RAFT INDEX
显示的值,其实就是revision
的值,这个值在etcd每次写入操作的时候都会增大。 - 然后运行
etcdctl compact %revision%
这里的%revision%
用你刚刚查出来的RAFT INDEX
的值代替,比如这里我应该输入etcdctl compact 31873
- 接着运行
etcdctl defrag
清理磁盘碎片 - 最后运行
etcdctl alarm disarm
清除警告
然后重新启动run_etcd.bat
即可
ps:网上还有很多设置自动压缩的教程,但是我配置之后过段时间还是会爆空间,后面的办法是创建一个window定时任务,每天定时运行清理一下,后面再出一篇详细说明下。
2024-01-19补充
如果etcd爆了,这个配置亲测可以生效 (生效个屁,见2024-01-23补充)
- 先在这个目录找到这个文件
- 然后加上
auto-compaction-mode: revision
和auto-compaction-retention: 1000
,上面那个注释掉的配置试了好像没什么用,注释了。
2024-01-19补充
爆了,还是爆了(😀),就不分多一章了,直接附上window计划任务的办法
@echo off
cd /d D:\milvus\etcd-v3.5.11-windows-amd64\
for /f "tokens=2 delims=: " %%a in ('etcdctl endpoint status --write-out=fields ^| findstr /C:"Revision"') do set revision=%%a
etcdctl compact %revision%
etcdctl defrag
etcdctl endpoint status --write-out="table"
1.新建一个etcdctl-defrag.bat
文件,代码如上,D:\milvus\etcd-v3.5.11-windows-amd64\
这个地址需要换上你们etcdctl.exe
工具所在的路径
2.如图,打开计算机管理,点击任务计划,再点击创建任务
3.如下图所示设置
4.然后新建一个触发器,这个时间根据你们项目需求而定,我是一天一次
5.接着选中需要执行的那个etcdctl-defrag.bat
文件
6.我这边需要输入远程登录账号的密码才可以通过(搞定,顺手点个赞吧!)
最后再附上可能用到的各种网站:
etcd的文档: https://etcd.io/docs/v3.5/op-guide/hardware/
milvus的github:https://github.com/matrixji/milvus
milvus部署window的文档:https://milvus.io/blog/2021-11-19-run-milvus-2.0-on-windows.md
etcdctl的操作文档:https://github.com/etcd-io/etcd/tree/main/etcdctl