Milvus 向量数据库专为向量查询与检索设计,能够为万亿级向量数据建立索引,详见介绍请参见:

milvus: 专为向量查询与检索设计的向量数据库

Milvus的目标是:store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models.

Milvus 向量数据库专为向量查询与检索设计,能够为万亿级向量数据建立索引。

与现有的关系数据库主要按照预定义的模式处理结构化数据不同,Milvus采用自底向上设计,以处理从非结构化数据转换而来的Embedding向量。

特点如下:

  • 高性能:性能高超,可对海量数据集进行向量相似度检索。
  • 高可用、高可靠:Milvus 支持在云上扩展,其容灾能力能够保证服务高可用。
  • 混合查询:Milvus 支持在向量相似度检索过程中进行标量字段过滤,实现混合查询。
  • 开发者友好:支持多语言、多工具的 Milvus 生态系统。

2.Milvus架构

Milvus 采用共享存储架构,存储计算完全分离,计算节点支持横向扩展。

从架构上来看,Milvus 遵循数据流和控制流分离,整体分为了四个层次,分别为接入层(access layer)、协调服务(coordinator service)、执行节点(worker node)和存储层(storage)。各个层次相互独立,独立扩展和容灾。

Milvus 的内部无状态组件共 8 个,依赖 3 个外部服务/中间件

2.1. 系统层次划分

整个系统分为四个层次:

  • 接入层(Access Layer):系统的门面,由一组无状态 proxy 组成。对外提供用户连接的 endpoint,负责验证客户端请求并合并返回结果。
  • 协调服务(Coordinator Service):系统的大脑,负责分配任务给执行节点。协调服务共有四种角色,分别为 root coord、data coord、query coord 和 index coord。
  • 执行节点(Worker Node):系统的四肢,负责完成协调服务下发的指令和 proxy 发起的数据操作语言(DML)命令。执行节点分为三种角色,分别为 data node、query node 和 index node。
  • 存储服务 (Storage): 系统的骨骼,负责 Milvus 数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。

架构实现特点

Milvus2.x版本的架构实现特点:

  • 微服务化:Milvus将服务拆成多个角色,每个角色职责划分相对独立,其中IndexNode/QueryNode/DataNode 这些角色是实际工作的Woker节点,IndexCoord/QueryCoord/DataCoord 是负责协调Woker节点,及将任务协调并分派给其他角色的节点。
1
ETCD:负责存储元数据 对象存储:负责存储向量数据 Proxy:Milvus统一的访问层 DataNode/DataCoord: 负责向量的写入 IndexNode/IndexCoord:负责向量索引的构建 QueryNode/QueryCoord : 负责向量的查询 RootCoord: 负责处理DDL去协调其他Coord,全局时间分发,维护当前元数据快照
  • 支持云原生:Milvus 服务本身是没有状态的,数据存储在对象存储,元数据会存放在ETCD。原生支持K8s部署集群部署,可以根据集群或者个别角色的负载去动态扩缩资源。
  • 向量操作【读/写/建索引】之间进程级别隔离:向量 读/写/建索引都是通过不同的节点完成,这样操作之间都是通过进程之间隔离,不会抢占资源,相互影响。
  • 在查询的时候指定不同的一致性级别:在真实的业务场景中,一致性要求越强,查询对应的响应时间也会变长。用户可以根据自己的需求选择不同的一致性级别。

3. Milvus核心概念

所有概念及术语参见 Milvus glossary

3.1.向量相似度检索

向量相似性搜索是将一个向量与数据库中的数据进行比较,以找到与目标搜索向量最相似的向量的过程。

近似最近邻(ANN)搜索算法用于计算向量之间的相似性

3.2. 记录相关概念

collection-集合: 包含一组 entity,可以等价于关系型数据库系统(RDBMS)中的表。

entity-实体:包含一组 field。

注意: Milvus 2.0在一个集合中只支持一个主键字段。

可以自定义 primary key,否则 Milvus 将会自动生成 primary key

目前 Milvus 不支持 primary key 去重,因此有可能在一个 collection 内出现 primary key 相同的 entity。

field -字段:Entity 的组成部分

field 可以是代表对象属性的结构化数据,例如数字和字符串

field 可以是代表对象特征的向量。primary key 是用于指代一个 entity 的唯一值。

注意: Milvus 2.0 现已支持标量字段过滤

Milvus与关系型数据库的对应关系如下:

3.3.Partition-分区

分区是集合(Collection)的一个分区。Milvus 支持将收集数据划分为物理存储上的多个部分。这个过程称为分区,每个分区可以包含多个segment。

3.4.Segment-段

Milvus 在数据插入时,通过合并数据自动创建的数据文件。一个 collection 可以包含多个 segment。一个 segment 可以包含多个 entity。在搜索中,Milvus 会搜索每个 segment,并返回合并后的结果。

3.5.Sharding-分片

Sharding是指将写操作分配到不同的节点上,以最大限度地利用Milvus集群的并行计算潜力来写数据。默认情况下,单个集合包含两个分片。Milvus采用基于主键哈希的分片方法。Milvus未来支持更灵活的分片方法,如随机分片和自定义分片。

3.6. bitset

bitset是位的集合,位是只有两个可能值的元素,最典型的是0和1,或者布尔值true和false。

  • 在Milvus中,bitset是由位数0和1组成的数组,与整型、浮点数或字符不同,bitset可以用来紧凑而高效地表示某些数据。默认为0,只有满足特定要求时才会设置为1。
  • 对bitset的操作使用布尔逻辑进行,在布尔逻辑下,输出值要么有效,要么无效,也分别用1和0表示。如:逻辑运算符AND可用于基于位于相同索引位置的项比较两个bitset,并使用结果生成一个新的bitset,如果位置上的两个元素相同,则在新的bitset中,1将被写入该位置;如果不相同,则为0。

Bitset是一个简单而强大的机制,可以帮助Milvus执行属性过滤、数据删除和Time Travel查询。

  • Attribute filtering: 满足给定属性过滤器要求的数据被标记为1。
  • Data deletion:bitset作为一种简洁的方式来存储关于段中的一行是否被删除的信息。被删除的实体在相应的bitset中被标记为1,在搜索或查询期间不会计算

Query with Time Travel:当您使用Time Travel进行搜索时,Milvus使用bitsets来存储有关某个段中的数据是否满足travel_timestamp中的时间戳要求的信息

4. Milvus 应用

4.1 业务架构

在实际项目落地时,业务架构图示意如下:

4.2 Milvus 应用场景

可以使用 Milvus 搭建符合自己场景需求的向量相似度检索系统。Milvus 的使用场景如下所示:

  • 图片检索系统:以图搜图,从海量数据库中即时返回与上传图片最相似的图片。
  • 视频检索系统:将视频关键帧转化为向量并插入 Milvus,便可检索相似视频,或进行实时视频推荐。
  • 音频检索系统:快速检索海量演讲、音乐、音效等音频数据,并返回相似音频。
  • 生物化学分子式检索系统:超高速检索相似化学分子结构、超结构、子结构。
  • 推荐系统:根据用户行为及需求推荐相关信息或商品。
  • 智能问答机器人:交互式智能问答机器人可自动为用户答疑解惑。
  • DNA 序列分类系统:通过对比相似 DNA 序列,仅需几毫秒便可精确对基因进行分类。
  • 文本搜索引擎:帮助用户从文本数据库中通过关键词搜索所需信息。

5. Milvus Attu

Milvus Attu的一个高效的开源管理工具。它具有直观的图形用户界面(GUI),允许您轻松地与数据库进行交互。只需单击几下,就可以可视化集群状态、管理元数据、执行数据查询等等。

6. Docker Compose配置与部署

6.1 部署Milvus向量数据库

以下步骤都在Linux环境中进行,Windows环境下在安装好Docker Desktop前提下可以类似操作:

依据自已环境是否有GPU或使用GPU,下载milvus-standalone-docker-compose.yml或milvus-standalone-docker-compose-gpu.yml下载到本地。

1、新建一个目录milvus

2、将milvus-standalone-docker-compose.yml放到milvus文件夹内,改名为docker-compose.yml

3、docker compose up -d

6.2 同时部署Milvus与Milvus Attu

其它步骤与6.1节操作准备相同,主要是在docker-compose.yml配置文件中增加Milvus向量数据库可视化管理工具Milvus Attu服务,具体增加服务的代码如下:

1
attu: container_name: attu image: zilliz/attu:latest environment: MILVUS_URL: milvus-standalone:19530 ports: - "8000:3000" depends_on: - "standalone"

**注:**如果docker image下载时间过长,可以先使用命令:docker-compose pull命令下载服务相关的所有镜像。然后再使用docker-compose up -d 命令启动服务。如果启动服务时报端口错误,依据实际需要对相关端口端口进行修改。

访问:http://IP:8000,即可看到如下界面:

单击连接后,进入如下界面:

参考链接

[1] Vector database - Milvus

[2] milvus: 专为向量查询与检索设计的向量数据库

[3] Milvus Attu

[4] 向量数据库milvus的docker compose安装