社区案例 | 传统应用挂载对象存储,满足集群高并发的大数据分析场景

QingStor 资深攻城狮 xuanwo 2021.04.19

这是一篇来自青云 QingCloud 工程师的案例分享,介绍了如何利用 JuiceFS 对接青云对象存储服务 QingStor 实现一个高性能分布式文件系统。

对象存储为用户提供了可无限扩展的通用数据存储服务,具有安全可靠、简单易用、高性能、低成本等特点。这使得对象存储成为海量数据场景的最佳选择。

为了使用对象存储,应用需要基于 API 或 SDK 开发,但是很多使用本地目录访问数据的传统应用并不具备修改的条件。

因此可以通过挂载工具,比如 S3fs 等,将对象存储挂载为本地文件系统,使得传统应用对接上对象存储。但是 S3fs 等方案不支持多个客户端同时写入,这无法满足大部分大数据应用多节点部署的要求。

本文将介绍基于对象存储服务的分布式 POSIX 文件系统 —— JuiceFS,能够很好的解决上文的问题。

它将 Metadata 存储在外部的 Key-Value 服务中(比如 Redis),实际数据存储在对象存储服务上,集群内的应用可以挂载同一个目录并获得统一的视图, 支持上千个客户端同时并发读写同一个目录 。

目前 JuiceFS 已经完成了与 QingStor 对象存储服务的对接。本文将会以 Ubuntu 平台为例讲解如何基于 QingStor 对象存储来搭建 JuiceFS 集群,并展示相应的测试结果。

部署

下载 JuiceFS

# curl -ssL 
https://github.com/juicedata/juicefs/releases/download/v0.11.0/juicefs-0.11.0-linux-amd64.tar.gz > juicefs.tar.gz
# tar -xvf juicefs.tar.gz && cd juicefs

启动 Redis

# apt install redis

可以通过 systemd 来查看 redis 运行的状态

# systemctl status redis.service

创建 Volume,使用 JuiceFS 进行格式化

# ./juicefs format \
--storage qingstor \
    --bucket https://<bucket_name>.pek3b.qingstor.com \
    --access-key <access_key> \
    --secret-key <secret_key> \
    <redis-url> test

挂载 Volume,使用 JuiceFS 将对象存储挂载到 ~/jfs

# ./juicefs mount -d <redis-url> ~/jfs

该步骤在多个节点上重复执行,就可以建立起集群,只要求这些节点都访问同一个 Redis 节点。

现在我们已经创建好了一个 JuiceFS 集群,这个集群的架构如上图所示。

Node 1~3 是部署了 JuiceFS 的应用节点。此外我们部署了一个独立的 Redis 服务作为 JuicsFS 的 metadata 服务,所有的实际数据会写入 QingStor 对象存储中。

接下来我们就在这个目录里创建一些文件以进行测试,对比测试下 JuiceFS 的效果。

测试

测试一:在单个节点上创建文件

Node 1

root@i-8cvklc58:~/jfs# dd if=/dev/urandom of=example bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.1686 s, 25.5 MB/s

测试二:在不同的节点上并发创建文件

Node 1

root@i-ywbaq5jc:~/jfs# dd if=/dev/urandom of=example1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.1694 s, 25.5 MB/s

Node 2

root@i-8cvklc58:~/jfs# dd if=/dev/urandom of=example2 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.1925 s, 25.4 MB/s

Node 3

root@i-7gksnd1q:~/jfs# dd if=/dev/urandom of=example3 bs=1M count=10241024+0 records in1024+0 records out1073741824 bytes (1.1 GB, 1.0 GiB) copied, 42.1689 s, 25.5 MB/s

从测试结果中可以发现,JuiceFS 的性能没有受到多个节点并发的影响。我们可以在多个节点上并发写入文件,充分发挥对象存储并发吞吐高的特点,这对大数据应用来说是非常友好的。

查看 JuiceFS 写入的数据

需要注意的是,与 S3FS 不同,由于 JuiceFS 选择了在 Redis 服务中维护文件系统的 metadata,因此我们在 QingStor 对象存储中看到的是经过 JuiceFS 切分后的 chunk 文件而不是写入的原始文件。

More

现在,青云QingCloud 公有云与 JuiceFS 联合推出了完全托管的分布式 POSIX 文件系统,非常适合数据备份、共享空间、容器持久存储和大数据分析等业务。