🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI

什么是 JuiceFS?

  • Engineering
June 15, 2021
Changjian Gao and Jingjing Jia

开源社区之间的合作是一件神奇的事情。充满热情、智慧和创造力的志愿者们不仅让开源解决方案不断创新,他们还努力将不同的工具以有趣而有用的方式结合在一起。Milvus 是世界上最流行的向量数据库,而JuiceFS 则是专为云原生环境设计的共享文件系统,它们在各自的开源社区中本着这种精神联合在一起。本文将解释什么是 JuiceFS、如何基于 JuiceFS 共享文件存储构建 Milvus 集群,以及用户使用该解决方案可以期待的性能。

什么是 JuiceFS?

JuiceFS 是一个高性能、开源的分布式 POSIX 文件系统,可以构建在 Redis 和 S3 的基础上。它专为云原生环境设计,支持管理、分析、归档和备份任何类型的数据。JuiceFS 常用于解决大数据难题、构建人工智能(AI)应用以及收集日志。该系统还支持多个客户端之间的数据共享,并可直接用作 Milvus 中的共享存储。

数据及其相应的元数据分别持久化到对象存储和Redis后,JuiceFS 就成了一个无状态中间件。通过标准的文件系统接口,不同的应用程序可以无缝对接,从而实现数据共享。JuiceFS 依靠开源内存数据存储 Redis 来存储元数据。之所以使用 Redis,是因为它能保证原子性并提供高性能的元数据操作。所有数据都通过 JuiceFS 客户端存储在对象存储中。架构图如下:

juicefs-architecture.png juicefs-architecture.png

基于 JuiceFS 构建 Milvus 集群

使用 JuiceFS 构建的 Milvus 集群(见下面的架构图)通过使用集群分片中间件 Mishards 对上游请求进行拆分,从而将请求级联到其子模块。插入数据时,Mishards 将上游请求分配给 Milvus 写节点,后者将新插入的数据存储在 JuiceFS 中。读取数据时,Mishards 通过 Milvus 读节点将数据从 JuiceFS 加载到内存中进行处理,然后从上游的子服务收集并返回结果。

milvus-cluster-built-with-juicefs.png Milvus-cluster-built-with-juicefs.png

步骤 1:启动 MySQL 服务

在群集中的任意节点上启动 MySQL 服务。有关详细信息,请参阅使用 MySQL 管理元数据

第 2 步:创建 JuiceFS 文件系统

为演示目的,使用预编译的二进制 JuiceFS 程序。为你的系统下载正确的安装包,并按照《JuiceFS快速入门指南》了解详细的安装说明。要创建 JuiceFS 文件系统,首先要为元数据存储设置一个 Redis 数据库。对于公共云部署,建议将 Redis 服务托管在与应用程序相同的云上。此外,为 JuiceFS 设置对象存储。本例中使用的是 Azure Blob Storage,但 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

installation-success.png 安装成功.png

第 3 步:启动 Milvus

集群中的所有节点都应安装 Milvus,每个 Milvus 节点都应配置读或写权限。只有一个 Milvus 节点可以配置为写节点,其余的必须是读节点。首先,在 Milvus 系统配置文件server_config.yaml 中设置clustergeneral 部分的参数:

部分 cluster

参数说明配置
enable是否启用群集模式true
roleMilvus 部署角色rw/ro

部分 general

# meta_uri is the URI for metadata storage, using MySQL (for Milvus Cluster). Format: mysql://<username:password>@host:port/database
general:
  timezone: UTC+8
  meta_uri: 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教程

mishards-launch-success.png mishards-launch-success.png

性能基准

共享存储解决方案通常由网络附加存储(NAS)系统实现。常用的 NAS 系统类型包括网络文件系统(NFS)和服务器消息块(SMB)。公共云平台通常提供与这些协议兼容的托管存储服务,如亚马逊弹性文件系统(EFS)。

与传统的 NAS 系统不同,JuiceFS 是基于用户空间文件系统(FUSE)实现的,所有数据读写都直接在应用程序端进行,从而进一步减少了访问延迟。JuiceFS 还有其他 NAS 系统所不具备的独特功能,如数据压缩和缓存。

基准测试表明,JuiceFS 比 EFS 具有更大的优势。在元数据基准测试中(图 1),JuiceFS 的每秒 I/O 操作符(IOPS)比 EFS 高出 10 倍。此外,I/O 吞吐量基准测试(图 2)显示,JuiceFS 在单任务和多任务情况下的性能均优于 EFS。

performance-benchmark-1.png 性能基准-1.png

performance-benchmark-2.png 性能基准-2.png

此外,基准测试表明,基于 JuiceFS 的 Milvus 集群的首次查询检索时间(或将新插入的数据从磁盘加载到内存的时间)平均仅为 0.032 秒,这表明数据几乎是瞬间从磁盘加载到内存的。在这项测试中,首次查询检索时间是使用 100 万行 128 维向量数据,以 100k 为一批,每隔 1 到 8 秒插入一次来测量的。

JuiceFS 是一个稳定可靠的共享文件存储系统,基于 JuiceFS 构建的 Milvus 集群既能提供高性能,又能提供灵活的存储容量。

了解有关 Milvus 的更多信息

Milvus 是一款强大的工具,能够为大量人工智能和向量相似性搜索应用提供动力。要了解有关该项目的更多信息,请查看以下资源:

  • 阅读我们的博客
  • Slack 上与我们的开源社区互动。
  • GitHub 上使用或贡献世界上最流行的向量数据库。
  • 使用我们新的Bootcamp 快速测试和部署人工智能应用。

writer bio-changjian gao.png writer bio-changjian gao.png writer bio-jingjing jia.pngwriter bio-jingjing jia.png

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

扩展阅读