前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker 最佳实战:Docker 部署单节点向量数据库 Milvus 实战

Docker 最佳实战:Docker 部署单节点向量数据库 Milvus 实战

原创
作者头像
运维有术
修改2024-06-11 18:11:37
3600
修改2024-06-11 18:11:37
举报
文章被收录于专栏:运维有术

Docker 最佳实战:Docker 部署单节点向量数据库 Milvus 实战

2024 年云原生运维实战文档 99 篇原创计划 第 028 篇 |Docker 最佳实战「2024」系列 第 016 篇

你好,欢迎来到运维有术

今天分享的内容是 Docker 最佳实战「2024」 系列文档中的 Docker 部署单节点向量数据库 Milvus 实战

本文将详细介绍如何用 Docker 容器及 Docker Compose 部署单节点 Milvus,并利用 Python 脚本验证 Milvus 服务的可用性。

实战服务器配置 (架构 1:1 复刻小规模生产环境,配置略有不同)

主机名

IP

CPU(核)

内存(GB)

系统盘(GB)

数据盘(GB)

用途

docker-node-1

192.168.9.81

4

16

40

100

Docker 节点 1

docker-node-2

192.168.9.82

4

16

40

100

Docker 节点 2

docker-node-3

192.168.9.83

4

16

40

100

Docker 节点 3

合计

3

12

48

120

300

实战环境涉及软件版本信息

  • 操作系统:openEuler 22.03 LTS SP3
  • Docker:24.0.7
  • Milvus:v2.4.4

1. 前置条件

1.1 部署说明

使用 Docker 快速部署单节点 Milvus 服务有两种方式:

  • 参考官方 Milvus 单节点安装文档,使用官方提供的部署文件 docker-compose.yml ,一键安装 etcdminio 以及 standalone 模式的 milvus
  • 复用现网已有的 minio、etcd 等服务,参考官方提供的部署文件 docker-compose.yml ,部署 standalone 模式的 milvus

本文选择第二种方式,复用现网已有服务,部署方案说明:

  • 编写部署文件 docker-compose.yml,部署 standalone 模式的 milvus 和 milvus 专用的 etcd。
  • Etcd 服务仅限 Milvus 专用,所以没有开放任何端口
  • 复用现网已有 Minio 服务,创建 Milvus 专用的 Access Key 和 Secret Key

1.2 Minio 创建账户

参考Docker 部署单节点 Minio 实战 安装 Minio。

使用 Minio 的管理控制台,创建 Milvus 服务使用的 Access Key 和 Secret Key

docker-minio-ak-new-account
docker-minio-ak-new-account

2. 安装部署 Milvus

2.1 创建数据目录并设置权限

代码语言:bash
复制
cd /data/containers
mkdir -p milvus/{config,volumes}

2.2 创建 docker-compose.yml 文件

创建配置文件,vi milvus/docker-compose.yml

代码语言:yaml
复制
name: 'milvus-standalone'
services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.5
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ./volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - milvus-tier
 
  milvus:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.4.4
    command: ["milvus", "run", "standalone"]
    security_opt:
      - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: 192.168.9.81:9000
      MINIO_ACCESS_KEY_ID: milvusadmin
      MINIO_SECRET_ACCESS_KEY: OpsXlab@2024
      common.security.authorizationEnabled: true
    volumes:
      - ./volumes/milvus:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    networks:
      - milvus-tier
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"

networks:
  milvus-tier:
    name: milvus-tier
    driver: bridge
    #external: true

说明: MINIO_ADDRESS,填写实际的 Minio 服务地址 MINIO_ACCESS_KEY_ID,Milvus 使用的 Minio 用户名 (Access Key) MINIO_SECRET_ACCESS_KEY,Milvus 使用的 Minio 用户密码 (Secret Key) common.security.authorizationEnabled,启用认证(默认用户名 root,密码 Milvus,部署完成后请立即修改)

2.3 创建并启动服务

  • 启动服务
代码语言:bash
复制
cd /data/containers/milvus
docker compose up -d

2.4 验证容器状态

  • 查看 Milvus 容器状态
代码语言:bash
复制
$ docker compose ps
NAME                IMAGE                        COMMAND                  SERVICE   CREATED          STATUS                             PORTS
milvus-etcd         quay.io/coreos/etcd:v3.5.5   "etcd -advertise-cli…"   etcd      14 seconds ago   Up 12 seconds (health: starting)   2379-2380/tcp
milvus-standalone   milvusdb/milvus:v2.4.4       "/tini -- milvus run…"   milvus    14 seconds ago   Up 12 seconds (health: starting)   0.0.0.0:9091->9091/tcp, :::9091->9091/tcp, 0.0.0.0:19530->19530/tcp, :::19530->19530/tcp
  • 查看 Milvus 服务日志
代码语言:bash
复制
# 通过日志查看容器是否有异常,结果略
$ docker compose logs -f

3. 验证测试

3.1 验证测试 Minio

Milvus 部署成功后会在 Minio 中创建一个名称为 a-bucket 的 Bucket。

docker-minio-buckets-milvus
docker-minio-buckets-milvus

3.2 验证 Milvus 服务可用性

使用 Milvus 官方提供的测试工具 Hello Milvus,验证 Milvus 的服务可用性。测试工具中服务器 IP 需要修改为 Milvus 服务器的地址,端口号默认为 19530

Hello Milvus 实际是一个 Python 脚本,需要安装对应的 Python 3及 Milvus 依赖库。为了使用方便,我将该脚本以及 iPython 等工具封装成了一个 Docker 镜像。

  • 下载镜像
代码语言:shell
复制
docker pull opsxlab/milvus-hello:2.3.7
  • 运行测试工具
代码语言:bash
复制
docker run -it --rm --security-opt seccomp:unconfined opsxlab/milvus-hello:2.3.7 bash
  • 编辑脚本
代码语言:bash
复制
# vi hello_milvus.py

# 将
connections.connect("default", host="localhost", port="19530")

# 修改为
connections.connect("default", host="192.168.9.81", port="19530", user="root", password='Milvus')
  • 执行测试命令
代码语言:bash
复制
python hello_milvus.py

正确执行后,输出结果如下 :

代码语言:bash
复制
root@83ff72835765:/app# python hello_milvus.py 

=== start connecting to Milvus     ===

Does collection hello_milvus exist in Milvus: False

=== Create collection `hello_milvus` ===


=== Start inserting entities       ===

Number of entities in Milvus: 3000

=== Start Creating index IVF_FLAT  ===


=== Start loading                  ===


=== Start searching based on vector similarity ===

hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 1262, distance: 0.08883658051490784, entity: {'random': 0.2978858685751561}, random field: 0.2978858685751561
hit: id: 1265, distance: 0.09590047597885132, entity: {'random': 0.3042039939240304}, random field: 0.3042039939240304
hit: id: 2999, distance: 0.0, entity: {'random': 0.02316334456872482}, random field: 0.02316334456872482
hit: id: 1580, distance: 0.05628090724349022, entity: {'random': 0.3855988746044062}, random field: 0.3855988746044062
hit: id: 2377, distance: 0.08096684515476227, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
search latency = 0.2876s

=== Start querying with `random > 0.5` ===

query result:
-{'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309], 'pk': '0', 'random': 0.6378742006852851}
search latency = 0.4379s
query pagination(limit=4):
        [{'random': 0.6378742006852851, 'pk': '0'}, {'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]
query pagination(offset=1, limit=3):
        [{'random': 0.5763523024650556, 'pk': '100'}, {'random': 0.9425935891639464, 'pk': '1000'}, {'random': 0.7893211256191387, 'pk': '1001'}]

=== Start hybrid searching with `random > 0.5` ===

hit: id: 2998, distance: 0.0, entity: {'random': 0.9728033590489911}, random field: 0.9728033590489911
hit: id: 747, distance: 0.14606499671936035, entity: {'random': 0.5648774800635661}, random field: 0.5648774800635661
hit: id: 2527, distance: 0.1530652642250061, entity: {'random': 0.8928974315571507}, random field: 0.8928974315571507
hit: id: 2377, distance: 0.08096684515476227, entity: {'random': 0.8745922204004368}, random field: 0.8745922204004368
hit: id: 2034, distance: 0.20354534685611725, entity: {'random': 0.5526117606328499}, random field: 0.5526117606328499
hit: id: 958, distance: 0.21908017992973328, entity: {'random': 0.6647383716417955}, random field: 0.6647383716417955
search latency = 0.4006s

=== Start deleting with expr `pk in ["0" , "1"]` ===

query before delete by expr=`pk in ["0" , "1"]` -> result: 
-{'pk': '0', 'random': 0.6378742006852851, 'embeddings': [0.20963514, 0.39746657, 0.12019053, 0.6947492, 0.9535575, 0.5454552, 0.82360446, 0.21096309]}
-{'pk': '1', 'random': 0.43925103574669633, 'embeddings': [0.52323616, 0.8035404, 0.77824664, 0.80369574, 0.4914803, 0.8265614, 0.6145269, 0.80234545]}

query after delete by expr=`pk in ["0" , "1"]` -> result: []


=== Drop collection `hello_milvus` ===

4. 自动化 Shell 脚本

文章中所有操作步骤,已全部编排为自动化脚本,包含以下内容(因篇幅限制,不在此文档中展示):

  • Shell 脚本部署单节点容器化 Milvus
  • Ansible 部署单节点容器化 Milvus

运维有术星球会员请到专属代码仓库下载(价值内容,仅星球会员专享)。

以上,就是我今天分享的全部内容。下一期分享的内容还没想好,敬请期待开盲盒

如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!

欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾

免责声明:

  • 笔者水平有限,尽管经过多次验证和检查,尽力确保内容的准确性,但仍可能存在疏漏之处。敬请业界专家大佬不吝指教。
  • 本文所述内容仅通过实战环境验证测试,读者可学习、借鉴,但严禁直接用于生产环境由此引发的任何问题,作者概不负责

Get 本文实战视频(请注意,文档视频异步发行,请先关注)

版权声明

  • 所有内容均属于原创,感谢阅读、收藏,转载请联系授权,未经授权不得转载

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Docker 最佳实战:Docker 部署单节点向量数据库 Milvus 实战
    • 1. 前置条件
      • 1.1 部署说明
      • 1.2 Minio 创建账户
    • 2. 安装部署 Milvus
      • 2.1 创建数据目录并设置权限
      • 2.2 创建 docker-compose.yml 文件
      • 2.3 创建并启动服务
      • 2.4 验证容器状态
    • 3. 验证测试
      • 3.1 验证测试 Minio
      • 3.2 验证 Milvus 服务可用性
    • 4. 自动化 Shell 脚本
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档