本文介绍了 JuiceFS 是什么,如何基于 JuiceFS 共享文件存储构建 Milvus 集群,以及用户使用该解决方案可以期待的性能。花椒壳-愿您平安健康
开源社区之间的合作是一件神奇的事情。热情、聪明和富有创造力的志愿者不仅使开源解决方案保持创新,而且还致力于以有趣和有用的方式将不同的工具结合在一起。Milvus是全球最受欢迎的矢量数据库,而JuiceFS是专为云原生环境设计的共享文件系统,它们各自的开源社区本着这种精神联合起来。本文介绍了 JuiceFS 是什么,如何基于 JuiceFS 共享文件存储构建 Milvus 集群,以及用户使用该解决方案可以期待的性能。
什么我是 JuiceFS?
JuiceFS 是一个高性能、开源的分布式 POSIX 文件系统,它可以构建在 Redis 和 S3 之上。它专为云原生环境而设计,支持管理、分析、归档和备份任何类型的数据。JuiceFS 通常用于解决大数据挑战、构建人工智能 (AI) 应用程序和日志收集。系统还支持跨多个客户端的数据共享,可以直接作为 Milvus 中的共享存储使用。
在数据及其相应的元数据分别持久化到对象存储和Redis 后,JuiceFS 充当无状态中间件。数据共享是通过标准的文件系统接口使不同的应用程序无缝对接来实现的。JuiceFS 依靠 Redis(一种开源内存数据存储)来存储元数据。使用Redis是因为它保证了原子性并提供了高性能的元数据操作。所有数据都通过 JuiceFS 客户端存储在对象存储中。架构图如下:
JuiceFS 的整体架构。
基于 JuiceFS 搭建 Milvus 集群
使用 JuiceFS 构建的 Milvus 集群(参见下面的架构图)通过使用 Mishards(一种集群分片中间件)拆分上游请求,将请求级联到其子模块。在插入数据时,Mishards 将上游请求分配给 Milvus 写入节点,该节点将新插入的数据存储在 JuiceFS 中。在读取数据时,Mishards 通过 Milvus 读取节点将 JuiceFS 中的数据加载到内存中进行处理,然后从上游的子服务中收集并返回结果。
使用 JuiceFS 构建的 Milvus 集群架构。
第 1 步:启动 MySQL 服务
在集群中的任何节点上启动 MySQL 服务。有关详细信息,请参阅使用 MySQL 管理元数据。
步骤 2:创建 JuiceFS 文件系统
出于演示目的,使用了预编译的二进制 JuiceFS 程序。为您的系统下载正确的安装包,并按照 JuiceFS快速入门指南获取详细的安装说明。要创建 JuiceFS 文件系统,首先要设置一个用于元数据存储的 Redis 数据库。对于公共云部署,建议您将 Redis 服务托管在与应用程序相同的云上。此外,为 JuiceFS 设置对象存储。在此示例中,使用了 Azure Blob 存储;但是,JuiceFS 支持几乎所有的对象服务。选择最适合您场景需求的对象存储服务。
配置好Redis服务和对象存储后,格式化一个新的文件系统并将JuiceFS挂载到本地目录:
1 $ export AZURE_STORAGE_CONNECTION_STRING="DefaultEndpointsProtocol=https;AccountName=XXX;AccountKey=XXX;EndpointSuffix=core.windows.net"
2 $ ./juicefs format \
3 --storage wasb \
4 --bucket https://<container> \
5 ... \
6 localhost test #format
7 $ ./juicefs mount -d localhost ~/jfs #mount
8
如果 Redis 服务器不在本地运行,请将 localhost 替换为以下地址:
redis://<user:password>@host:6379/1
.
安装成功后,JuiceFS 返回共享存储页面/root/jfs。
第 3 步:启动 Milvus
集群中的所有节点都需要安装 Milvus,并且每个 Milvus 节点都需要配置读写权限。只能配置一个 Milvus 节点为写节点,其余必须为读节点。首先,在 Milvus 系统配置文件server_config.yaml 中设置部分cluster
和参数:general
部分 cluster
范围 | 描述 | 配置 |
---|---|---|
enable | 是否开启集群模式 | true |
role | Milvus 部署角色 | rw /ro |
部分 general
范围 | 描述 | 配置 |
---|---|---|
meta_uri | 元数据存储的 URI,使用 MySQL(用于 Milvus 集群)。格式:mysql://<username:password>@host:port/database . | mysql://root:milvusroot@host:3306/milvus |
安装时,配置的 JuiceFS 共享存储路径设置为/root/jfs/milvus/db。
1 sudo docker run -d --name milvus_gpu_1.0.0 --gpus all \
2 -p 19530:19530 \
3 -p 19121:19121 \
4 -v /root/jfs/milvus/db:/var/lib/milvus/db \ #/root/jfs/milvus/db is the shared storage path
5 -v /home/$USER/milvus/conf:/var/lib/milvus/conf \
6 -v /home/$USER/milvus/logs:/var/lib/milvus/logs \
7 -v /home/$USER/milvus/wal:/var/lib/milvus/wal \
8 milvusdb/milvus:1.0.0-gpu-d030521-1ea92e
9
安装完成后,启动 Milvus 并确认启动正常。最后,在集群中的任何节点上启动 Mishards 服务。下图显示了 Mishards 的成功启动。有关更多信息,请参阅 GitHub 教程。
性能基准
共享存储解决方案通常由网络附加存储 (NAS) 系统实现。常用的 NAS 系统类型包括网络文件系统 (NFS) 和服务器消息块 (SMB)。公共云平台通常提供与这些协议兼容的托管存储服务,例如 Amazon Elastic File System (EFS)。
不同于传统的NAS系统,JuiceFS是基于用户空间文件系统(FUSE)实现的,所有的数据读写直接在应用端进行,进一步降低了访问延迟。还有其他 NAS 系统所没有的 JuiceFS 独有的功能,例如数据压缩和缓存。
基准测试表明,与 EFS 相比,JuiceFS 具有主要优势。在元数据基准测试(图 1)中,JuiceFS 的每秒 I/O 操作数 (IOPS) 比 EFS 高十倍。此外,I/O 吞吐量基准测试(图 2)显示 JuiceFS 在单任务和多任务场景中都优于 EFS。
图 1. 元数据基准
图 2. 顺序读/写基准
此外,基准测试显示首次查询检索时间,或将新插入的数据从磁盘加载到内存的时间。基于 JuiceFS 的 Milvus 集群平均只有 0.032 秒,表明数据几乎是瞬间从磁盘加载到内存。对于该测试,首次查询检索时间是使用以 1 到 8 秒的间隔以 100k 为批次插入的 100 万行 128 维矢量数据进行测量的。
JuiceFS 是一个稳定可靠的共享文件存储系统,基于 JuiceFS 构建的 Milvus 集群提供高性能和灵活的存储容量。花椒壳-愿您平安健康