Milvus安装部署使用

2023年 8月 22日 146.1k 0

1. 应用场景

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

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

    注意:

    Milvus 2.0 后已支持标量字段过滤。并且,Milvus 2.0在一个集合中只支持一个主键字段。

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

    Milvus向量数据库 关系型数据库
    Collection
    Entity
    Field 表字段

    Partition

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

    Segment

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

    Sharding

    Shard 是指将数据写入操作分散到不同节点上,使 Milvus 能充分利用集群的并行计算能力进行写入。默认情况下,单个 Collection 包含 2 个分片(Shard)。目前 Milvus 采用基于主键哈希的分片方式,未来将支持随机分片、自定义分片等更加灵活的分片方式。

    注意: 分区的意义在于通过划定分区减少数据读取,而分片的意义在于多台机器上并行写入操作。

    Index

    索引基于原始数据构建,可以提高对 collection 数据搜索的速度。Milvus 支持多种索引类型。为提高查询性能,你可以为每个向量字段指定一种索引类型。目前,一个向量字段仅支持一种索引类型。切换索引类型时,Milvus 自动删除之前的索引。

    相似性搜索引擎的工作原理是将输入的对象与数据库中的对象进行比较,找出与输入最相似的对象。索引是有效组织数据的过程,极大地加速了对大型数据集的查询,在相似性搜索的实现中起着重要作用。对一个大规模向量数据集创建索引后,查询可以被路由到最有可能包含与输入查询相似的向量的集群或数据子集。在实践中,这意味着要牺牲一定程度的准确性来加快对真正的大规模向量数据集的查询。

    3. 安装部署

    单机版 Milvus

    安装docker( Ubuntu版 )

  • 卸载旧版本(可选操作)
  • sudo apt-get remove docker docker-engine docker.io containerd runc

  • 升级apt包索引
  • sudo apt-get update

  • 安装能够让apt使用HTTPS的包
  • sudo apt-get install \

    apt-transport-https \

    ca-certificates \

    curl \

    software-properties-common

  • 添加官方的GPG key
  • curl -fsSL download.docker.com/linux/ubunt… | sudo apt-key add -

  • 查看现在是否拥有了指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的密匙,执行下面搜索命令,如果有类似回显说明拥有此密匙。
  • sudo apt-key fingerprint 0EBFCD88

  • 设置稳定版源( x86_64 / amd64架构)
  • sudo add-apt-repository \

    "deb [arch=amd64] download.docker.com/linux/ubunt… \

    $(lsb_release -cs) \

    stable"

  • 安装docker CE
  • sudo apt-get update

    sudo apt-get install docker-ce

  • 运行如下命令验证 Docker 服务是否在运行
  • systemctl status docker
    如果没有运行,运行以下命令运行 Docker 服务

    sudo systemctl start docker

  • 使 Docker 服务在每次重启时自动启动
  • sudo systemctl enable docker

  • 查看已安装的 Docker 版本(docker 建议使用 19.03 或以上版本)
  • sudo docker version

    安装DockerCompose

  • 运行下列命令安装 Docker Compose
  • sudo curl -L "github.com/docker/comp… compose-(uname−s)−(uname -s)-(uname−s)−(uname -m)" -o /usr/local/bin/docker-compose

  • 赋予二进制文件可执行权限
  • sudo chmod +x /usr/local/bin/docker-compose

  • 检查安装的 Docker Compose 版本
  • docker-compose version(Docker Compose 建议使用 1.25.1 或以上版本)

    安装单机版milvus

  • Install Milvus Standalone with Docker Compose(官网链接)
  • 下载安装文件(建议去官网下载最新版)
  • wget github.com/milvus-io/m… compose.yml -O docker-compose.yml

    或可以直接用下面的yml,需要新建/data/volumes目录

    📎docker-compose.yml

  • 启动 Milvus
  • sudo docker-compose up -d

  • 检查容器的状态
  • sudo docker-compose ps

  • docker 容器设置自启动
    docker update --restart=always 容器id 或 容器名称
  • 分布式版 Milvus

    安装k8s集群(Ubuntu版)

  • 设置主机名
    以192.168.77.60,192.168.3.151,192.168.77.172三台主机搭建k8s集群
    主机192.168.77.60

    hostnamectl --static set-hostname k8s-master

    主机192.168.3.151

    hostnamectl --static set-hostname k8s-node01

    主机192.168.77.172

    hostnamectl --static set-hostname k8s-node002

    执行完毕后重启或执行下面的命令即可生效

    hostname $hostname

  • 每台机器都做域名解析,绑定hosts
    sudo vi /etc/hosts

    添加内容

    192.168.77.60 k8s-master

    192.168.3.151 k8s-node01

    192.168.77.172 k8s-node02

    确保各个主机间ping的通(ping k8s-master, ping k8s-node01,ping k8s-node02)

  • 禁止swap分区
    K8s的要求,确保禁止掉swap分区,不禁止,初始化会报错。

    在每个宿主机上执行:

    sudo swapoff -a

    修改/etc/fstab,注释掉swap那行,持久化生效

    sudo vi /etc/fstab

  • 确保时区和时间正确(最好给每个主机定时做时间同步),这里直接使用chronyd服务
    systemctl start chronyd
    systemctl enable chronyd
    date

  • 关闭防火墙和selinux
    ufw status

    ufw disable

    vi /etc/selinux/config

    修改SELINUX=disabled

  • 各主机安装 docker-ce(可参考单机版milvus中的docker安装)
    配置 docker-hub 源,国内网络拉取国外源时可能会失败
    vim /etc/docker/daemon.json
    {

  • "registry-mirrors": [

    "hub-mirror.c.163.com",

    "ustc-edu-cn.mirror.aliyuncs.com",

    "ghcr.io",

    "mirror.baidubce.com"

    ]

    }

    更改docker默认驱动为systemd(kubectl默认驱动为systemd,所以需要更改docker驱动)
    可查看自己docker驱动命令:
    sudo docker info|grep Driver

    更改docker驱动,编辑 /etc/docker/daemon.json (没有就新建一个)

    sudo vim /etc/docker/daemon.json

    添加内容

    {

    "exec-opts": ["native.cgroupdriver=systemd"]

    }

    重启 docker

    systemctl daemon-reload && systemctl restart docker

  • 各个主机安装kubeadm、kubelet 和 kubectl
    使用阿里云镜像仓库
    apt-get update && apt-get install -y apt-transport-https
    curl mirrors.aliyun.com/kubernetes/… | apt-key add -
    cat

  • 相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论