milvus测试
目标
其实,我应该弄明白他的输入输出分别是什么?
输入是图片,图片经过ml模型进行特征提取,再在milvus中进行存储或者检索
部署
✘ dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus master lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
clang
, clang-format-10
, 和 clang-tidy-10
都是 LLVM 项目的一部分,但它们有不同的用途和功能。以下是它们之间的主要区别:
- clang:
- 描述:
clang
是 LLVM 项目的一个组成部分,它是一个编译器前端,用于 C、C++、Objective-C 和 Objective-C++ 编程语言。 - 功能:它负责解析源代码、生成中间表示(Intermediate Representation,简称 IR)并与 LLVM 的其他部分结合使用以生成机器代码。其主要目标是提供快速的编译时间、低内存使用量、以及良好的诊断(例如,有帮助的错误和警告消息)。
- 用途:编译 C/C++/Objective-C/Objective-C++ 程序。
- 描述:
- clang-format-10:
- 描述:
clang-format
是一个工具,用于自动格式化 C、C++、Objective-C、Java、JavaScript、Protobuf 和 C# 代码,使其符合某种代码风格。 - 功能:它可以处理代码的排版、缩进、括号、空格等,确保代码有一致的风格。
- 用途:自动格式化代码以符合给定的代码风格,特别是在大型项目或团队中,为了确保代码风格的一致性。
- 描述:
- clang-tidy-10:
- 描述:
clang-tidy
是一个用于 C++ 的静态代码分析工具。 - 功能:它提供了许多内置的检查器,用于检测代码中的常见问题,如潜在的错误、性能问题、不建议的编码实践等。此外,它还允许用户定义自己的检查器。
- 用途:静态分析 C++ 代码以找出潜在的问题、性能瓶颈和不符合最佳实践的代码片段。
- 描述:
总之,clang
是一个编译器,clang-format
是一个代码格式化工具,而 clang-tidy
是一个静态代码分析工具。每个工具都有其特定的用途和功能。
source.list
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
✘ dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus master ± sudo apt install lib32gcc-s1 lib32stdc++6 libc6-i386
[sudo] dell 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:libc6-dev:i386 libcrypt-dev:i386 libncurses-dev:i386 linux-libc-dev:i386
使用'sudo apt autoremove'来卸载它(它们)。
下列软件包将被【卸载】:lib64ncurses-dev:i386 lib64ncurses6:i386 lib64ncursesw6:i386 lib64readline-dev:i386 lib64readline8:i386 lib64tinfo6:i386 libc6-amd64:i386 libc6-dev-amd64:i386
下列【新】软件包将被安装:lib32gcc-s1 lib32stdc++6 libc6-i386
升级了 0 个软件包,新安装了 3 个软件包,要卸载 8 个软件包,有 44 个软件包未被升级。
需要下载 3,295 kB 的归档。
解压缩后将会空出 19.1 MB 的空间。
您希望继续执行吗? [Y/n] y
获取:1 https://mirrors.ustc.edu.cn/ubuntu focal-updates/main amd64 libc6-i386 amd64 2.31-0ubuntu9.12 [2,724 kB]
获取:2 https://mirrors.ustc.edu.cn/ubuntu focal-updates/main amd64 lib32gcc-s1 amd64 10.5.0-1ubuntu1~20.04 [49.1 kB]
获取:3 https://mirrors.ustc.edu.cn/ubuntu focal-updates/main amd64 lib32stdc++6 amd64 10.5.0-1ubuntu1~20.04 [522 kB]
已下载 3,295 kB,耗时 5秒 (713 kB/s)
(正在读取数据库 ... 系统当前共安装有 292741 个文件和目录。)
正在卸载 lib64readline-dev:i386 (8.0-4) ...
正在卸载 lib64ncurses-dev:i386 (6.2-0ubuntu2.1) ...
正在卸载 lib64ncurses6:i386 (6.2-0ubuntu2.1) ...
正在卸载 lib64ncursesw6:i386 (6.2-0ubuntu2.1) ...
正在卸载 lib64readline8:i386 (8.0-4) ...
正在卸载 lib64tinfo6:i386 (6.2-0ubuntu2.1) ...
正在卸载 libc6-dev-amd64:i386 (2.31-0ubuntu9.12) ...
正在卸载 libc6-amd64:i386 (2.31-0ubuntu9.12) ...
正在选中未选择的软件包 libc6-i386。
(正在读取数据库 ... 系统当前共安装有 292241 个文件和目录。)
准备解压 .../libc6-i386_2.31-0ubuntu9.12_amd64.deb ...
正在解压 libc6-i386 (2.31-0ubuntu9.12) ...
被已安装的软件包 libc6:i386 (2.31-0ubuntu9.12) 中的文件替换了...
正在选中未选择的软件包 lib32gcc-s1。
准备解压 .../lib32gcc-s1_10.5.0-1ubuntu1~20.04_amd64.deb ...
正在解压 lib32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在选中未选择的软件包 lib32stdc++6。
准备解压 .../lib32stdc++6_10.5.0-1ubuntu1~20.04_amd64.deb ...
正在解压 lib32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在设置 libc6-i386 (2.31-0ubuntu9.12) ...
正在设置 lib32gcc-s1 (10.5.0-1ubuntu1~20.04) ...
正在设置 lib32stdc++6 (10.5.0-1ubuntu1~20.04) ...
正在处理用于 libc-bin (2.31-0ubuntu9.12) 的触发器 ...#有些许忐忑对于以下包:lib64readline-dev:i386 lib64readline8:i386
dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus master ± make install
Download milvus-proto repo ...
Build 3rdparty ...
/nvme/baum/git-project/milvus/cmake_build /nvme/baum/git-project/milvus
Running on
Configuration:
[settings]
arch=x86_64
arch_build=x86_64
build_type=Release
compiler=gcc
compiler.libcxx=libstdc++11
compiler.version=9
os=Linux
os_build=Linux
[options]
[build_requires]
[env]
......
-- Up-to-date: /nvme/baum/git-project/milvus/internal/core/output/lib/librdkafka++.so
-- Up-to-date: /nvme/baum/git-project/milvus/internal/core/output/lib/libglog.so.1
make[1]: 离开目录“/nvme/baum/git-project/milvus/cmake_build”
cache directory /home/dell/.ccache
primary config /home/dell/.ccache/ccache.conf
secondary config (readonly) /etc/ccache.conf
stats updated Sat Oct 7 14:42:32 2023
cache hit (direct) 80
cache hit (preprocessed) 0
cache miss 1457
cache hit rate 5.20 %
called for link 34
cleanups performed 0
files in cache 4293
cache size 841.0 MB
max cache size 5.0 GB
/nvme/baum/git-project/milvus
Build Tag: v2.2-testing-20230824-289-gcd5f03f80-dev
Build Time: Sat 07 Oct 2023 06:42:35 AM UTC
Git Commit: cd5f03f80
Go Version: go version go1.19.5 linux/amd64
Building Milvus ...
Installing binary to './bin'
cp -r -P /nvme/baum/git-project/milvus/internal/core/output/lib/*.dylib* /nvme/baum/git-project/milvus/lib 2>/dev/null
make: [Makefile:317:install] 错误 1 (已忽略)
cp -r -P /nvme/baum/git-project/milvus/internal/core/output/lib/*.so* /nvme/baum/git-project/milvus/lib 2>/dev/null
cp -r -P /nvme/baum/git-project/milvus/internal/core/output/lib64/*.so* /nvme/baum/git-project/milvus/lib 2>/dev/null
make: [Makefile:319:install] 错误 1 (已忽略)
Installation successful.
理论知识
向量数据库的存储引擎是文件系统吗?
参考链接:
https://www.milvus-io.com/milvus_lite
https://www.milvus-io.com/overview
https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md
- milvus workflow
-
定义
词汇 词义 位集(bitset) 在 Milvus 中,位集是由 0
和1
构成的位数数组,相对于整数、浮点数或字符,它们可以被用于紧凑、高效地表示某些数据。默认情况下,位数为0
,只有满足某些要求时才会设置为1
。通道(channel) 在 Milvus 中,有两个不同的通道。它们分别是 PChannel 和 VChannel。每个 PChannel 对应日志存储的主题,而每个 VChannel 对应集合中的一个分片。 集合 集合=RDBMS中的表,在Milvus中,集合用于存储和管理实体 实体(entity) 实体=现实世界对象的一组字段,在 Milvus 中,每个实体都由唯一的主键表示。 依赖项(dependency) 依赖项是其他程序在工作时所依赖的程序。Milvus 的依赖项包括 etcd (存储元数据)、MinIO 或 S3(对象存储)和 Pulsar(管理快照日志) 字段(Field) 字段是组成实体的单元。字段可以是结构化数据(例如数字、字符串)或向量。-------- 日志中间件(Log broker) 日志中间件是一种支持回放的发布-订阅系统。它负责流式数据持久化、可靠异步查询的执行、事件通知和查询结果的返回。它还确保了当工作节点从系统故障中恢复时,增量数据的完整性 消息存储(Message storage) 消息存储是 Milvus 的日志存储引擎。 Milvus 集群(Milvus cluster) 在 Milvus 的集群部署中,一组节点提供服务,以实现高可用性和易扩展性。 Milvus 独立部署(Milvus standalone) 在 Milvus 的独立部署中,所有操作包括数据插入、索引构建和向量相似度搜索都在一个进程中完成。 归一化(Normalization) 归一化是指将嵌入(向量)转换为其范数等于1的过程。如果使用内积(IP)来计算嵌入相似度,则所有嵌入必须被标准化。标准化后,内积等于余弦相似度。 分区(Partition) 分区是集合的一个划分。Milvus 支持将集合数据划分为多个物理存储部分。这个过程被称为分区,并且每个分区可以包含多个段。 PChannel PChannel 代表物理通道。每个 PChannel 对应日志存储的主题。Milvus 集群启动时,会默认分配一组 256 个 PChannel 来记录数据插入、删除和更新的日志。 Vector index 向量索引是从原始数据派生出的重新组织的数据结构,可以大大加速向量相似度搜索的过程。Milvus支持多种向量索引类型。 段(Segment) 段是由 Milvus 自动创建的用于容纳插入数据的数据文件。一个集合可以有多个段,一个段可以有多个实体。在向量相似度搜索期间,Milvus 扫描每个段并返回搜索结果。一个段可以是正在增长的,直到它被封存为止。一个封存的段不再接收任何新数据,并将被刷新到对象存储中,剩余的新数据将被插入到新创建的增长段中。增长段将被封存,因为它所包含的实体数达到了预定义的阈值,或者“增长”状态的持续时间超过了指定的限制。 -
索引类型
索引是数据的组织单位。在搜索或查询插入的实体之前,必须声明索引类型和相似度度量。如果您未指定索引类型,则Milvus将默认使用暴力搜索。
大多数由Milvus支持的向量索引类型使用近似最近邻搜索(ANNS),包括:
- FLAT:FLAT最适合于在小规模,百万级数据集上寻求完全准确和精确的搜索结果的场景。
- IVF_FLAT:IVF_FLAT是一种量化索引,最适合于在精度和查询速度之间寻求理想平衡的场景。
- IVF_SQ8:IVF_SQ8是一种量化索引,最适合于在磁盘、CPU和GPU内存消耗非常有限的场景中显著减少资源消耗。
- IVF_PQ:IVF_PQ是一种量化索引,最适合于在高查询速度的情况下以牺牲精度为代价的场景。
- HNSW:HNSW是一种基于图形的索引,最适合于对搜索效率有很高需求的场景。
- ANNOY:ANNOY是一种基于树形结构的索引,最适合于寻求高召回率的场景。
-
相似度度量
在 Milvus 中,相似度度量用于衡量向量之间的相似性。选择一个好的距离度量方法可以显著提高分类和聚类的性能。根据输入数据的形式,选择特定的相似度度量方法可以获得最优的性能。
对于浮点嵌入,通常使用以下指标:
- 欧氏距离(L2):该指标通常用于计算机视觉领域(CV)。
- 内积(IP):该指标通常用于自然语言处理领域(NLP)。
在二元嵌入中广泛使用的度量标准包括:
- 哈明距离:这个度量标准通常用于自然语言处理(NLP)领域。
- 杰卡德距离:这个度量标准通常用于分子相似性搜索领域。
- 塔尼莫托距离:这个度量标准通常用于分子相似性搜索领域。
- 超结构距离:这个度量标准通常用于搜索分子的类似超结构。
- 亚结构距离:这个度量标准通常用于搜索分子的类似亚结构。
-
架构
-
两种运行模式
Milvus 有两种运行模式:独立模式和集群模式。这两种模式共享相同的功能。您可以选择最适合您的数据集大小、流量数据等的模式。目前,Milvus 独立模式无法“在线”升级到 Milvus 集群。
-
独立模式
Milvus 独立模式包括三个组件:
-
**Milvus:**核心的功能组件。
-
**etcd:**元数据引擎,负责访问和存储 Milvus 的内部组件的元数据,包括代理、索引节点等。
-
**MinIO:**存储引擎,负责 Milvus 的数据持久化。
-
-
集群模式
Milvus 集群模式包括八个微服务组件和三个第三方依赖项。所有微服务可以独立于 Kubernetes 部署。
微服务组件
- 根协调器
- 代理
- 查询协调器
- 查询节点
- 索引协调器
- 索引节点
- 数据协调器
- 数据节点
第三方依赖
-
**etcd:**存储集群中各组件的元数据。
-
**MinIO:**负责集群中大文件的数据持久化,例如索引和二进制日志文件。
-
**Pulsar:**管理最近的变异操作日志,输出流日志,并提供日志发布订阅服务。
-
参考链接:
https://segmentfault.com/a/1190000041470259#item-4
-
非结构化数据处理流程
Milvus 为解决非结构化数据的检索问题而生:海量的非结构化数据一般会存储在分布式文件系统或对象存储上,之后通过深度学习网络完成推理,将这些非结构数据转化成 embedding 向量,并在向量空间内完成近似性检索,从而发现数据背后的一些特征。
场景一般是:
例如:图片经过训练和推理,转化成了embedding向量,该向量通过在向量空间的近似度比对来表征其相似性
-
向量和标量
基本操作:
-
对于标量数据,针对数值类数据一般会做加减乘除的操作;对字符串类型的数据一般会做一些 term 的匹配, 或者一些类似 like 的近似匹配,抑或一些前缀匹配。
-
针对向量数据而言,很少进行这种 100% 的完全匹配,更多是看近似度,也就是高维空间下的距离。较常见的距离表示有余弦距离、欧式距离等。空间中向量之间的距离,很大程度上能表示非结构化数据之间的相似度。
数据的组织方式:
- 传统数据很容易比较大小,无论是数值类,还是字符串,都可以通过二叉树或者 skip list 的方式排列组合,然后做二分查找。
- 对于向量数据来讲,则更加复杂,因为它维度较高,很难像传统的数值类数据一样通过排序的方式做加速,往往需要一些特殊的索引结构和存储方式
-
-
-
milvus介绍
- 为云而生
Milvus 2.0 的第三个考量是拥抱云原生。
过去十几年,传统数据库基本采用 share nothing 的架构。随着 Snowflake 的出现,很多数据库采用了 shared storage ,越来越多的数据库开始做存储计算分离。Snowflake 给予业界很大启发,利用云上的基础设施去做数据持久化,然后基于本地存储做缓存,这种模这种模式被称为 share something,获得了很多产品的共识。
-
milvus单机与分布式
-
milvus角色
具体到所有角色来看,整个 Milvus 的分布式方案有八个角色和三个不同的依赖。
每种角色到底有什么作用呢?
从最前端讲起, Proxy 就是充当系统门面,所有的 SDK 查询都会通过一个 load balancer,发给 Pulsar Proxy 去处理连接,做一些静态检查。比如,一个请求,可能 collection 名字根本不存在,Pulsar Proxy 就会直接报错,或者当插入的数据缺少了某些列,就会由 SDK 发现。完成了预处理之后, Proxy 就会把数据投递到 Message Broker 里。
整体来讲,Proxy 会处理三类数据:写请求、读请求、控制请求,比如 DDL。Proxy 需要把数据投递到对应的 channel 里, Root Coord 类似于传统系统中的 Master,主要做一些 DDL 和 DCL 的管理,比如建 Collection、删 Collection。
除此之外,Root Coord 还承担着非常大的责任,就是为系统分配时间戳。TimeTick 的机制会保证数据根据时间戳定序。
很多朋友可能会担心,是不是会有单点的存在?对于 Milvus 而言,第一,性能瓶颈这块是比较好处理的,不太需要去做过多考虑,写入往往都是批量插入的,所以 TPS 本身没有那么高,只要满足吞吐的要求即可。第二,Milvus 在读链路的时候,对中心授权模块没有过多的依赖,因此 Root Coord 节点宕机不会对整个系统的读入有任何影响。第三,Milvus 依赖云原生的设计,Root Coord 如果宕机,可以快速被 Kubernetes 拉起来,可用性有保障。
Data 有两种角色,Data Coord 和 Data node。Data Coord 是协调者,会做一些 load balance 的分配、管理 segment、处理 Data Node 故障的恢复,比如有些 Data Node 宕机的话,是通过 Data Coord 发现和恢复的。Data Node 就做一件事情,把 log 里面的数据转化成 log snapshot,log snapshot 可以理解为 binlog,会生成一块大的 binlog,每个 binlog 通过 parquet 的格式存。Data Node 生成文件后,就会把文件传给 Index Node、生成 Sealed Segment,然后 Index Coord 会对 Sealed Segment 建索引。
有的同学会好奇,为什么建索引还要抽单独的角色去做,直接加一块做完可不可以?其实也是可以的。但是抽单独的角色去做的好处在于,第一, Index 很消耗性能,对弹性的要求更高。它不需要长时间保存的内存,如果有见缝插针的资源,Index 就可以用起来。第二, Index 本身很消耗资源,所以通常情况下用户做一些异构加速,Index Node 可以用 GPU 或专用硬件对索引做加速。Index Node 生成数据之后,就会把数据给到 Query Node 管理。所有的 Segment 都在 Query Node 上提供服务,通过 Query Node 执行查询。Query Node 有很多除了故障恢复以外的查询逻辑,同时也是整个 Milvus 里最复杂的节点。
-
架构
-
数据模型
首先,我们为用户提供的最大概念叫做 Collection,即可以映射到传统数据库的一个表。每个 Collection 我们会分多个 Shard,默认情况下是两个 Shard,到底要取多少 Shard 取决于你的写入量有多大、需要把写入分到多少个节点去做处理。如果你的写入比较少,默认两个 Shard 就可以满足你的需求。
如果你的集群规模是 10 台或 100 台,我们推荐 Shard 的规模做到 Data Node 的两到三倍。每个 Shard 中间又有很多 Partition ,Partition 自带数据的属性, Shard 本身是根据主键的哈希去分的,而 Partition 往往是根据你指定的字段或 Partition 的 tag 去分的。常见的 Partition 方式有根据数据写入的日期划分、根据用户是男女去划分、根据用户的年龄去划分等。Partition 的一个很大优势是在查询过程中,如果你加上 Partition tag 的话,可以帮你过滤掉很多数据。
Shard 更多是帮你去扩展写的操作,而 Partition 是帮你在读操作的情况下去提升读的一个性能,每个 Shard 里的每个 partition 又会对应到很多小的 Segment 。Segment 就是我们整个系统调度的最小单元,分为 Growing Segment 和 Sealed Segment。Growing Segment 就是 Query Node 订阅,用户持续写入 Segment,等 Growing Segment 写大了以后,就不允许继续;默认上限是 512MB,写到上限以后,我们就把它 seal 掉,并对 seal 的 Segment 建一些向量索引。
在读的时候,Growing Segment 和 Sealed Segment 都是需要去被读到的,可以保证用户数据的可见实时性比较高。每个 Segment 里又分为很多 Entitity,Entity 是传统数据库里面“一行”的概念。Entity 是有 Schema 的,通常一个 Entitity 中必须有一个 Primary Key。一般来讲,我们会有一个隐式的 ts 字段,Primary Key 如果不是主动指定的话,往往可以自增。除此之外,还有一个列和 Vector,一个 Entitity 会有一个 Vector, Vector 也是整个 Milvus 系统的核心。
-
数据存储
首先,存储过程是以 Segment 为单位,用的是列存的方式,每个 Primary Key 、Column、Vector 都是单独用一个文件存储。Segment seal 掉之后,我们会针对性地构建 Vector Index,整个 segment 只构建一个。
Vector Index 目前来讲只能支持建一个索引,我们很快就会支持一个表建多个索引。比如你想尝试 HNSW 和 IVF-PQ 到底哪个性能好的话,可以建多个索引。后续我们可能还会再加入一些自动调优的部分,帮用户自动选择建一些索引。
为什么要选择存储的过程中去列存呢?第一,列存的压缩率比较高,通常我们都是存一些 int 型的数据,或者存一些稠密的 float int 向量,可以通过列存去做比较好的压缩。第二,做标量过滤可能会通过回盘的方式去做读取,那么列式存储可以用来做加速。
Sealed Segment 一旦写入完成,就不能修改。实际过程中,用户会有删除或者修改数据的需求,因此我们就在 Segment 加了 Delta Log,每个 Delta Log 包含了几行删除或追加的数据。
用户做删除的时候,我们会通过路由找到对应的 Segment,在 Segment 里面生成 Delta Log。Delta Log 有点类似于传统的 LSM 树的架构,我们会先去读原始文件,然后把 Delta Log 根据时间戳慢慢打到读出来的数据上。如果 Delta Log 的 ts 大于原始数据的 ts,那么原始数据就会被删除。Delta Log 写多了或者删除多了之后,也需要做清理,不然你的读取就会变得越来越慢。因此我们基于文件格式做 compaction ,定时把 Delta Log 整合到原有的文件里面,使得在读的过程中保证不需要往回打太多的数据。
docker测试
参考链接:
https://milvus.io/blog/how-to-get-started-with-milvus.md/#How-to-Use-Milvus
https://github.com/milvus-io/milvus/discussions/16559
https://blog.csdn.net/sinat_39620217/article/details/131847096?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-131847096-blog-124567338.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-131847096-blog-124567338.235%5Ev38%5Epc_relevant_anti_t3_base&utm_relevant_index=1#t24
https://zhuanlan.zhihu.com/p/473624021
https://github.com/milvus-io/milvus/blob/master/DEVELOPMENT.md#building-milvus-on-a-local-osshell-environment
独立运行milvus
下载docker compose配置
三个容器去跑milvus的单机
- etcd:用于元数据存储和访问的分布式键值存储
- minio:与 AWS S3 兼容的日志和索引文件持久存储
- milvus:数据库服务器
dell@dell-Precision-3630-Tower /nvme/baum/git-project mkdir milvus_composedell@dell-Precision-3630-Tower /nvme/baum/git-project cd milvus_compose dell@dell-Precision-3630-Tower /nvme/baum/git-project wget https://github.com/milvus-io/milvus/releases/download/v2.0.2/milvus-standalone-docker-compose.yml -O docker-compose.yml--2023-10-10 10:53:21-- https://github.com/milvus-io/milvus/releases/download/v2.0.2/milvus-standalone-docker-compose.yml
正在连接 127.0.0.1:7890... 已连接。
已发出 Proxy 请求,正在等待回应... 302 Found
位置:https://objects.githubusercontent.com/github-production-release-asset-2e65be/208728772/6c538a38-db7b-43ac-b831-fa76d50ec417?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231010%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231010T025322Z&X-Amz-Expires=300&X-Amz-Signature=f213675bc22d8bc2c7bfcc28837534daa596a2bb44e53039d402eb0de9dee241&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=208728772&response-content-disposition=attachment%3B%20filename%3Dmilvus-standalone-docker-compose.yml&response-content-type=application%2Foctet-stream [跟随至新的 URL]
--2023-10-10 10:53:22-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/208728772/6c538a38-db7b-43ac-b831-fa76d50ec417?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231010%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231010T025322Z&X-Amz-Expires=300&X-Amz-Signature=f213675bc22d8bc2c7bfcc28837534daa596a2bb44e53039d402eb0de9dee241&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=208728772&response-content-disposition=attachment%3B%20filename%3Dmilvus-standalone-docker-compose.yml&response-content-type=application%2Foctet-stream
正在连接 127.0.0.1:7890... 已连接。
已发出 Proxy 请求,正在等待回应... 200 OK
长度: 1303 (1.3K) [application/octet-stream]
正在保存至: “docker-compose.yml”docker-compose.yml 100%[============================================================>] 1.27K --.-KB/s 用时 0s 2023-10-10 10:53:23 (32.1 MB/s) - 已保存 “docker-compose.yml” [1303/1303])
#关于docker-compose.yml
#该配置为 etcd 分配了一个卷,用于存储持久数据。它定义了四个环境变量,并通过命令行运行服务,指示其监听 2379 端口的请求。
#该配置还为 minio 提供了一个卷,并使用默认访问密钥。不过,您应该创建一个新的带有唯一密钥的 minio 映像,以供生产使用。此外,配置还包括 minio 的健康检查,如果出现故障,它会重新启动服务。请注意,Minio 默认使用端口 9000 处理客户端请求。
#最后是运行 Milvus 的独立服务。它也有一个卷和环境变量,用于将其指向 etcd 和 minio 的服务端口。最后一部分为服务共享的网络提供了一个名称。这样,监控工具就更容易识别了。
- 使用 docker compose up -d 启动服务。
dell@dell-Precision-3630-Tower /nvme/baum/git-project sudo docker compose up -d
[sudo] dell 的密码:
[+] Running 27/27✔ standalone 11 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 33.2s ✔ 171857c49d0f Pull complete 8.7s ✔ 419640447d26 Pull complete 2.2s ✔ 61e52f862619 Pull complete 1.6s ✔ 2580b47486e5 Pull complete 23.7s ✔ cd742921730d Pull complete 10.8s ✔ 936cb7027fe4 Pull complete 10.0s ✔ 319dd389c04d Pull complete 29.4s ✔ 543c11caaeb6 Pull complete 12.3s ✔ 06d62b89360c Pull complete 15.7s ✔ 5186d5863148 Pull complete 17.1s ✔ b410b80e82c0 Pull complete 19.8s ✔ minio 6 layers [⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 34.0s ✔ 188c0c94c7c5 Pull complete 22.4s ✔ ed66f2d577c3 Pull complete 24.1s ✔ b40a74db8d08 Pull complete 24.2s ✔ c77f9df7200e Pull complete 25.7s ✔ 14d4e804ec54 Pull complete 27.4s ✔ 3bd551264400 Pull complete 29.6s ✔ etcd 7 layers [⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 41.0s ✔ 1813d21adc01 Pull complete 32.9s ✔ 6e96907ab677 Pull complete 32.1s ✔ 444ed0ea8673 Pull complete 33.4s ✔ 0fd2df5633f0 Pull complete 35.8s ✔ 8cc22b9456bb Pull complete 34.4s ✔ 7ac70aecd290 Pull complete 35.0s ✔ 4b376c64dfe4 Pull complete 35.9s
[+] Running 4/4✔ Network milvus Created 0.1s ✔ Container milvus-etcd Started 0.1s ✔ Container milvus-minio Started 0.1s ✔ Container milvus-standalone Started 0.0s
- docker ps 将显示三个容器正在运行:
dell@dell-Precision-3630-Tower /nvme/baum/git-project docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
milvus-etcd quay.io/coreos/etcd:v3.5.0 "etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd" etcd 2 minutes ago Up 2 minutes 2379-2380/tcp
milvus-minio minio/minio:RELEASE.2020-12-03T00-03-10Z "/usr/bin/docker-entrypoint.sh minio server /minio_data" minio 2 minutes ago Up 2 minutes (healthy) 9000/tcp
milvus-standalone milvusdb/milvus:v2.0.2 "/tini -- milvus run standalone" standalone 2 minutes ago Up 2 minutes 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp
- 还可以通过 docker 日志检查 Milvus 服务器:
dell@dell-Precision-3630-Tower /nvme/baum/git-project docker logs milvus-standalone
2023/10/10 02:54:25 maxprocs: Leaving GOMAXPROCS=16: CPU quota undefined__ _________ _ ____ ______ / |/ / _/ /| | / / / / / __/ / /|_/ // // /_| |/ / /_/ /\ \ /_/ /_/___/____/___/\____/___/ Welcome to use Milvus!
Version: v2.0.2
Built: Sat Apr 2 03:29:24 UTC 2022
GitCommit: 898533c5
GoVersion: go version go1.16.9 linux/amd64open pid file: /run/milvus/standalone.pid
lock pid file: /run/milvus/standalone.pid
[2023/10/10 02:54:25.136 +00:00] [DEBUG] [base_table.go:78] ["config directory"] [configDir=/milvus/configs/]
[2023/10/10 02:54:25.137 +00:00] [DEBUG] [component_param.go:592] ["init cacheSize"] ["cacheSize (GB)"=0]
使用python进行连接
- 用 Python 示例程序来测试您的数据库。首先用 pip3 安装 PyMilvus:
dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose pip3 install pymilvus
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:1131)'))': /simple/pymilvus/
Collecting pymilvusDownloading pymilvus-2.3.1-py3-none-any.whl (168 kB)|████████████████████████████████| 168 kB 867 kB/s
Requirement already satisfied: numpy<1.25.0; python_version <= "3.8" in /usr/lib/python3/dist-packages (from pymilvus) (1.17.4)
Collecting pandas>=1.2.4Downloading pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.4 MB)|████████████████████████████████| 12.4 MB 1.3 MB/s
Collecting protobuf>=3.20.0Downloading protobuf-4.24.4-cp37-abi3-manylinux2014_x86_64.whl (311 kB)|████████████████████████████████| 311 kB 1.8 MB/s
......
-
下载hello_milvus例子
dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose wget https://raw.githubusercontent.com/milvus-io/pymilvus/v2.2.6/examples/hello_milvus.py
-
运行
该脚本将创建一个集合、添加索引并运行一些计算。运行。根据您的处理器和可用内存,这将需要几分钟才能完成。
python3 ./hello_milvus.py
attu可视化工具
docker run -p 8000:3000 -e HOST_URL=http://{ your machine IP }:8000 -e MILVUS_URL={your machine IP}:19530 zilliz/attu:latest修改docker-compose.yaml
version: '3.5'services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.0environment:- ETCD_AUTO_COMPACTION_MODE=revision- ETCD_AUTO_COMPACTION_RETENTION=1000- ETCD_QUOTA_BACKEND_BYTES=4294967296volumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcdcommand: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcdminio:container_name: milvus-minioimage: minio/minio:RELEASE.2020-12-03T00-03-10Zenvironment:MINIO_ACCESS_KEY: minioadminMINIO_SECRET_KEY: minioadminvolumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_datacommand: minio server /minio_datahealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3attu:container_name: attuimage: zilliz/attu:v2.0.5environment:MILVUS_URL: milvus-standalone:19530ports:- "8000:3000"depends_on:- "standalone"standalone:container_name: milvus-standaloneimage: milvusdb/milvus:v2.0.2command: ["milvus", "run", "standalone"]environment:ETCD_ENDPOINTS: etcd:2379MINIO_ADDRESS: minio:9000volumes:- ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvusports:- "19530:19530"depends_on:- "etcd"- "minio"networks:default:name: milvusdell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose docker compose up -d
[+] Running 4/4✔ Container milvus-minio Started 0.0s ✔ Container milvus-etcd Started 0.0s ✔ Container milvus-standalone Started 0.0s ✔ Container attu Started 0.0s dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
attu zilliz/attu:latest "docker-entrypoint.sh /bin/bash -c '/app/build/env.sh && yarn start:prod'" attu 34 seconds ago Up 33 seconds 0.0.0.0:8000->3000/tcp, :::8000->3000/tcp
milvus-etcd quay.io/coreos/etcd:v3.5.0 "etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd" etcd 34 seconds ago Up 33 seconds 2379-2380/tcp
milvus-minio minio/minio:RELEASE.2020-12-03T00-03-10Z "/usr/bin/docker-entrypoint.sh minio server /minio_data" minio 34 seconds ago Up 33 seconds (healthy) 9000/tcp
milvus-standalone milvusdb/milvus:v2.0.2 "/tini -- milvus run standalone" standalone 34 seconds ago Up 33 seconds 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp#run
docker compose logs standalone
问题
在attu登陆milvus-standalone:19530时,遇到错误Error: Milvus is not ready yet.
#停止所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c751ced721e zilliz/attu:latest "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:8000->3000/tcp, :::8000->3000/tcp attu
656601ee17f6 milvusdb/milvus:v2.0.2 "/tini -- milvus run…" 10 minutes ago Up 10 minutes 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp milvus-standalone
66a741011521 minio/minio:RELEASE.2020-12-03T00-03-10Z "/usr/bin/docker-ent…" 10 minutes ago Up 10 minutes (healthy) 9000/tcp milvus-minio
b81f4ddb637e quay.io/coreos/etcd:v3.5.0 "etcd -advertise-cli…" 10 minutes ago Up 10 minutes 2379-2380/tcp milvus-etcddell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose docker stop $(docker ps -q)4c751ced721e
656601ee17f6
66a741011521
b81f4ddb637e
#并且删除
localhost:8000/connect
#error:Network Error
docker compose down --volumes --remove-orphans
这个命令将停止并删除docker-compose.yml
定义的所有服务。此外,它还会删除由docker-compose up
创建的默认网络和数据卷以及删除在当前docker-compose.yml
中没有定义但在上次docker-compose up
命令中创建的容器。
您已经正确地执行了命令来停止和删除所有容器和相关资源。如果您需要重启服务,可以使用 docker compose up -d
。如果您希望完全重新开始并从干净的 slate 创建所有资源,请确保删除所有相关的数据卷和网络,然后再次运行 docker compose up -d
。
docker run -p 8000:3000 -e HOST_URL=http://{ your machine IP }:8000 -e MILVUS_URL={your machine IP}:19530 zilliz/attu:v2.0.5
网络
✘ dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose docker network ls
NETWORK ID NAME DRIVER SCOPE
2f1a509e0e2d bridge bridge local
a64353e264b2 host host local
187aeff5bafd kwdb-br bridge local
3f0732598413 milvus bridge local
066dd83dd1b7 none null localdell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose docker network inspect milvus
[{"Name": "milvus","Id": "3f0732598413e82012bc83f52a6d361ee3349317db6668c2fcef00f4a6d325f5","Created": "2023-10-10T21:18:08.659747219+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.23.0.0/16","Gateway": "172.23.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"41a27a7af5d26b664fa85a592e1cbf9d9610ca7a14c04962ce1e208121c105ab": {"Name": "milvus-etcd","EndpointID": "5ac05b8920421b28beed6bfe404c91bdc4e22da9d5793c69c7c5a3aa5d5a0300","MacAddress": "02:42:ac:17:00:02","IPv4Address": "172.23.0.2/16","IPv6Address": ""},"4d704500f4e5fc300001f580604fd1fa8e157f77bb0b01ea68f482e24ac8d78d": {"Name": "milvus-minio","EndpointID": "746ed1522f55efac79602dd5f77ccae83c21866d62f2bdcbf578f95b9a86e861","MacAddress": "02:42:ac:17:00:03","IPv4Address": "172.23.0.3/16","IPv6Address": ""},"9791c3b39d7e7ccc24b7211598ca45dd58544fd17811833323861aee02da552c": {"Name": "milvus-standalone","EndpointID": "b79758d99b524dd980fd1413122dc51006e0637a84e1d471e05585affe90152d","MacAddress": "02:42:ac:17:00:04","IPv4Address": "172.23.0.4/16","IPv6Address": ""}},"Options": {},"Labels": {"com.docker.compose.network": "default","com.docker.compose.project": "milvus_compose","com.docker.compose.version": "2.21.0"}}
]docker inspect your-container-ID -f "{{json .NetworkSettings.Networks }}"
两个docker添加到一个网络中
兼容性:
Milvus Version | Recommended Attu Image Version |
---|---|
v2.0.x | v2.0.5 |
v2.1.x | v2.1.5 |
v2.2.x | v2.2.6 |
虚拟环境
✘ dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose sudo apt install python3.8-venv
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:libc6-dev:i386 libcrypt-dev:i386 libncurses-dev:i386 libpkgconf3 linux-libc-dev:i386
使用'sudo apt autoremove'来卸载它(它们)。
下列【新】软件包将被安装:python3.8-venv
升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 37 个软件包未被升级。
需要下载 5,448 B 的归档。
解压缩后会消耗 27.6 kB 的额外空间。
获取:1 https://mirrors.ustc.edu.cn/ubuntu focal-updates/universe amd64 python3.8-venv amd64 3.8.10-0ubuntu1~20.04.8 [5,448 B]
已下载 5,448 B,耗时 10秒 (535 B/s)
正在选中未选择的软件包 python3.8-venv。
(正在读取数据库 ... 系统当前共安装有 296249 个文件和目录。)
准备解压 .../python3.8-venv_3.8.10-0ubuntu1~20.04.8_amd64.deb ...
正在解压 python3.8-venv (3.8.10-0ubuntu1~20.04.8) ...
正在设置 python3.8-venv (3.8.10-0ubuntu1~20.04.8) ...dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose python3 -m venv milvus_com ✘ dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose source milvus_com/bin/activate
(milvus_com) dell@dell-Precision-3630-Tower /nvme/baum/git-project/milvus_compose pip install "pymilvus>=2.1.0" "hnswlib>=0.5.2" pybind11 "milvus>=2.1.0"Collecting pymilvus>=2.1.0Using cached pymilvus-2.3.1-py3-none-any.whl (168 kB)
Collecting hnswlib>=0.5.2Downloading hnswlib-0.7.0.tar.gz (33 kB)Installing build dependencies ... doneGetting requirements to build wheel ... donePreparing wheel metadata ... done
Collecting pybind11Using cached pybind11-2.11.1-py3-none-any.whl (227 kB)
Collecting milvus>=2.1.0Downloading milvus-2.3.1-py3-none-manylinux2014_x86_64.whl (48.4 MB)......#exit->deactivate
停止milvus
docker compose down --volumes --remove-orphans
sudo rm -rf volumes