贵阳网站公司,免费做网站公司推荐,wordpress 站点收录,微擎做网站费用参考#xff1a;https://www.xjx100.cn/news/1726910.html?actiononClick
Milvus 基于FAISS、Annoy、HNSW 等向量搜索库构建#xff0c;核心是解决稠密向量相似度检索的问题。在向量检索库的基础上#xff0c;Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量…参考https://www.xjx100.cn/news/1726910.html?actiononClick
Milvus 基于FAISS、Annoy、HNSW 等向量搜索库构建核心是解决稠密向量相似度检索的问题。在向量检索库的基础上Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能同时大幅优化了向量检索的性能可满足任何向量检索场景的应用需求。通常建议用户使用 Kubernetes 部署 Milvus以获得最佳可用性和弹性。
Milvus 采用共享存储架构存储计算完全分离计算节点支持横向扩展。从架构上来看Milvus 遵循数据流和控制流分离整体分为了四个层次分别为接入层access layer、协调服务coordinator service、执行节点worker node和存储层storage。各个层次相互独立独立扩展和容灾。 整个系统分为四个层次
接入层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三个部分。 Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据图片/视频/语音/文本检索。单节点 Milvus 可以在秒内完成十亿级的向量搜索分布式架构亦能满足用户的水平扩展需求。
milvus特点总结如下
高性能性能高超可对海量数据集进行向量相似度检索。高可用、高可靠Milvus 支持在云上扩展其容灾能力能够保证服务高可用。混合查询Milvus 支持在向量相似度检索过程中进行标量字段过滤实现混合查询。开发者友好支持多语言、多工具的 Milvus 生态系统。
2.2 Milvus关键概念
非结构化数据非结构化数据指的是数据结构不规则没有统一的预定义数据模型不方便用数据库二维逻辑表来表现的数据。非结构化数据包括图片、视频、音频、自然语言等占所有数据总量的 80%。非结构化数据的处理可以通过各种人工智能AI或机器学习ML模型转化为向量数据后进行处理。
特征向量向量又称为embedding vector是指由 embedding 技术从离散变量如图片、视频、音频、自然语言等各种非结构化数据转变而来的连续向量。在数学表示上向量是一个由浮点数或者二值型数据组成的 n 维数组。 通过现代的向量转化技术比如各种人工智能AI或者机器学习ML模型可以将非结构化数据抽象为 n 维特征向量空间的向量。这样就可以采用最近邻算法ANN计算非结构化数据之间的相似度。
向量相似度检索相似度检索是指将目标对象与数据库中数据进行比对并召回最相似的结果。同理向量相似度检索返回的是最相似的向量数据。近似最近邻搜索ANN算法能够计算向量之间的距离从而提升向量相似度检索的速度。如果两条向量十分相似这就意味着他们所代表的源数据也十分相似。
Collection-集合包含一组entity可以等价于关系型数据库系统RDBMS中的表。
Entity-实体包含一组 field。field 与实际对象相对应。field 可以是代表对象属性的结构化数据也可以是代表对象特征的向量。primary key 是用于指代一个 entity 的唯一值。注意你可以自定义primary key否则 Milvus 将会自动生成primary key。目前Milvus 不支持primary key去重因此有可能在一个collection内出现primary key相同的entity。
Field-字段Entity 的组成部分。Field可以是结构化数据例如数字和字符串也可以是向量。注意Milvus2.0现已支持标量字段过滤。并且Milvus 2.0在一个集合中只支持一个主键字段。 Partition-分区分区是集合Collection的一个分区。Milvus 支持将收集数据划分为物理存储上的多个部分。这个过程称为分区每个分区可以包含多个段。
Segment-段Milvus 在数据插入时通过合并数据自动创建的数据文件。一个collection可以包含多个segment。一个segment可以包含多个entity。在搜索中Milvus会搜索每个segment并返回合并后的结果。 Sharding-分片Shard是指将数据写入操作分散到不同节点上使 Milvus 能充分利用集群的并行计算能力进行写入。默认情况下单个Collection包含 2 个分片Shard。目前 Milvus 采用基于主键哈希的分片方式未来将支持随机分片、自定义分片等更加灵活的分片方式。注意 分区的意义在于通过划定分区减少数据读取而分片的意义在于多台机器上并行写入操作。
索引索引基于原始数据构建可以提高对 collection 数据搜索的速度。Milvus 支持多种索引类型。为提高查询性能你可以为每个向量字段指定一种索引类型。目前一个向量字段仅支持一种索引类型。切换索引类型时Milvus 自动删除之前的索引。相似性搜索引擎的工作原理是将输入的对象与数据库中的对象进行比较找出与输入最相似的对象。索引是有效组织数据的过程极大地加速了对大型数据集的查询在相似性搜索的实现中起着重要作用。对一个大规模向量数据集创建索引后查询可以被路由到最有可能包含与输入查询相似的向量的集群或数据子集。在实践中这意味着要牺牲一定程度的准确性来加快对真正的大规模向量数据集的查询。 PChannelPChannel 表示物理通道。每个 PChannel 对应一个日志存储主题。默认情况下将分配一组 256 个 PChannels 来存储记录 Milvus 集群启动时数据插入、删除和更新的日志。
VChannelVChannel 表示逻辑通道虚拟通道。每个集合将分配一组 VChannels用于记录数据的插入、删除和更新。VChannels 在逻辑上是分开的但在物理上共享资源。
Binlogbinlog 是一个二进制日志或者是一个更小的段单位记录和处理 Milvus 向量数据库中数据的更新和更改。 一个段的数据保存在多个二进制日志中。 Milvus 中的 binlog 分为三种InsertBinlog、DeleteBinlog 和 DDLBinlog。
日志代理Log broker日志代理是一个支持回放的发布订阅系统。它负责流数据持久化、可靠异步查询的执行、事件通知和查询结果的返回。当工作节点从系统崩溃中恢复时它还确保增量数据的完整性。
日志订阅者日志订阅方通过订阅日志序列来更新本地数据并以只读副本的形式提供服务。
日志序列Log sequence日志序列记录了在 Milvus 中更改集合状态的所有操作。
正则化正则化是指转换嵌入向量以使其范数等于1的过程。 如果使用内积 (IP) 来计算embeddings相似度则必须对所有embeddings进行正则化。 正则化后内积等于余弦相似度。 对象存储负责存储日志的快照文件、标量/向量索引文件以及查询的中间处理结果。Milvus 采用 MinIO 作为对象存储另外也支持部署于 AWS S3 和Azure Blob 这两大最广泛使用的低成本存储。但是由于对象存储访问延迟较高且需要按照查询计费因此 Milvus 未来计划支持基于内存或 SSD 的缓存池通过冷热分离的方式提升性能以降低成本。
消息存储消息存储是一套支持回放的发布订阅系统用于持久化流式写入的数据以及可靠的异步执行查询、事件通知和结果返回。执行节点宕机恢复时通过回放消息存储保证增量数据的完整性。
目前分布式版Milvus依赖 Pulsar 作为消息存储单机版Milvus依赖 RocksDB 作为消息存储。消息存储也可以替换为 Kafka、Pravega 等流式存储。
整个 Milvus 围绕日志为核心来设计遵循日志即数据的准则因此在 2.0 版本中没有维护物理上的表而是通过日志持久化和日志快照来保证数据的可靠性。
日志系统作为系统的主干承担了数据持久化和解耦的作用。通过日志的发布订阅机制Milvus 将系统的读、写组件解耦。一个极致简化的模型如上图所示整个系统主要由两个角色构成分别是消息存储log broker负责维护”日志序列“与“日志订阅者”。其中的“日志序列”记录了所有改变库表状态的操作“日志订阅者”通过订阅日志序列更新本地数据以只读副本的方式提供服务。 发布订阅机制还为系统在变更数据捕获CDC和全面的分布式部署方面的可扩展性提供了空间。 单机版 Milvus包括三个组件
Milvus 负责提供系统的核心功能。etcd 是元数据引擎用于管理 Milvus 内部组件的元数据访问和存储例如proxy、index node 等。MinIO 是存储引擎负责维护 Milvus 的数据持久化。 2.3.2 分布式版 Milvus
分布式版 Milvus 由八个微服务组件和三个第三方依赖组成每个微服务组件可使用 Kubernetes 独立部署。
微服务组件
Root coordProxyQuery coordQuery nodeIndex coordIndex nodeData coordData node
第三方依赖
etcd 负责存储集群中各组件的元数据信息。MinIO 负责处理集群中大型文件的数据持久化如索引文件和全二进制日志文件。Pulsar 负责管理近期更改操作的日志输出流式日志及提供日志订阅服务。 索引方式 FLAT准确率高 适合数据量小暴力求解相似。 IVF-FLAT量化操作 准确率和速度的平衡 IVF: inverted file 先对空间的点进行聚类查询时先比较聚类中心距离再找到最近的N个点。 IVF-SQ8量化操作disk cpu GPU 友好 SQ8对向量做标量量化浮点数表示转为int型表示4字节-1字节。 IVF-PQ快速但是准确率降低把向量切分成m段对每段进行聚类查询时查询向量分端后与聚类中心计算距离各段相加后即为最终距离。使用对称距离(聚类中心之前的距离)不需要计算直接查表但是误差回更大一些。HNSW基于图的索引高效搜索场景构建多层的NSW。ANNOY基于树的索引高召回率 milvus目录结构
│
├─conf //配置文件目录
│ server_config.yaml //配置文件 搜索引擎配置都在这里修改
│
├─db //数据库存储目录 你的索引与向量存储的位置
│
└─logs //日志存储目录
│
└─wal // 预写式日志相关配置 GitHub - milvus-io/milvus-sdk-java: Java SDK for Milvus.
dependencygroupIdio.milvus/groupIdartifactIdmilvus-sdk-java/artifactIdversion2.3.3/version/dependency
https://github.com/milvus-io/milvus-sdk-java/tree/master/examples