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 |
实战环境涉及软件版本信息
使用 Docker 快速部署单节点 Milvus 服务有两种方式:
本文选择第二种方式,复用现网已有服务,部署方案说明:
参考Docker 部署单节点 Minio 实战 安装 Minio。
使用 Minio 的管理控制台,创建 Milvus 服务使用的 Access Key 和 Secret Key。
cd /data/containers
mkdir -p milvus/{config,volumes}
创建配置文件,vi milvus/docker-compose.yml
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,部署完成后请立即修改)
cd /data/containers/milvus
docker compose up -d
$ 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
# 通过日志查看容器是否有异常,结果略
$ docker compose logs -f
Milvus 部署成功后会在 Minio 中创建一个名称为 a-bucket 的 Bucket。
使用 Milvus 官方提供的测试工具 Hello Milvus,验证 Milvus 的服务可用性。测试工具中服务器 IP 需要修改为 Milvus 服务器的地址,端口号默认为 19530
Hello Milvus 实际是一个 Python 脚本,需要安装对应的 Python 3及 Milvus 依赖库。为了使用方便,我将该脚本以及 iPython 等工具封装成了一个 Docker 镜像。
docker pull opsxlab/milvus-hello:2.3.7
docker run -it --rm --security-opt seccomp:unconfined opsxlab/milvus-hello:2.3.7 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')
python hello_milvus.py
正确执行后,输出结果如下 :
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` ===
文章中所有操作步骤,已全部编排为自动化脚本,包含以下内容(因篇幅限制,不在此文档中展示):
运维有术星球会员请到专属代码仓库下载(价值内容,仅星球会员专享)。
以上,就是我今天分享的全部内容。下一期分享的内容还没想好,敬请期待开盲盒。
如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @运维有术,及时收看更多好文!
欢迎加入 「知识星球|运维有术」 ,获取更多的 KubeSphere、Kubernetes、云原生运维、自动化运维、AI 大模型等实战技能。未来运维生涯始终有我坐在你的副驾。
免责声明:
Get 本文实战视频(请注意,文档视频异步发行,请先关注)
版权声明
我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。