共享块设备
由于 JuiceFS 的分离架构,读写一般包含着元数据访问和对象存储访问,而后者的延迟往往更大。这也是为什么在 JuiceFS 中,小文件或者大量随机读写的性能会明显低于顺序读写。如果对读写性能有极致要求(达到接近本地盘水平),可以升级至 5.2 或更新版本的 JuiceFS 客户端,在节点挂载块设备并将他用于 JuiceFS 客户端的存储。
配合下方架构图来了解共享块设备的架构特点:
- 可以设定“Slice”大小阈值(一个 Slice 可以理解为「一次连续写入」,其长度在 0~64MB,详见存储架构),低于该大小时,直接写入块设备,享受本地盘级别的写入延迟。而如果大于设定的阈值,则直接上传对象存储;
- 对于存在块设备上的数据,支持设定不同的留存策略,可以设置保存时长,超过该时长后自动上传对象存储,也可以进一步设置留存 Slice 大小阈值,让小于临界值的写入片段长期存储在快设备上,更大的 Slice 则直接上传对象存储。这些存储策略允许用户更灵活地分配高性能的本地存储,以及成本更低的对象存储空间;
- 虽然功能命名为「共享块设备」,但是事实上 JuiceFS 支持使用任意未经格式化的块设备,并不强求是多点挂载的共享块设备。因此,你同样可以用普通的、单挂载的云盘来配合该功能使用,详见「单挂载块设备」。
在 JuiceFS 中使用共享块设备的典型场景:
- 读写都要求低时延,使用块设备做数据存储,甚至可以将块设备配置成永久存储(继续阅读下方小节了解);
- 共享块设备写入性能好,并且多节点挂载,可以用该功能解决写缓存(
--writeback
)待上传数据对其他客户端不可见的痛点。具体用法就是给多个客户端节点挂载同一共享块设备,然后不开启写缓存、正常写入即可。这是因为块设备本身的写入性能就足够好,在共享块设备场景下,不再需要写缓存功能,直接同步写盘,数据就对其他客户端可见。
一些其他注意事项:
- 块设备必须挂载到相同路径,否则将会造成无法识别。不过对于未挂载块设备的客户端,从 5.2 以后支持通过其他客户端代理访问,详见「单挂载块设备」;
- 无需格式化文件系统,由 JuiceFS 的元数据引擎直接管理裸盘;
- 可以在线扩容(加盘或者已有盘加容量);
- 目前不支持镜像文件系统;
- 目前不支持多分区,单分区存储上限 5 亿文件。
目前共享块设备的支持处于公测阶段,如有使用需要,请联系 Juicedata 工程师。
多挂载块设备
部分公有云供应商支持多挂载块设备存储,比如 AWS Multi-Attach 或者阿里云,也就是说一个块设备可以同时挂载到多台节点(一般最多 16 个)。这种情况下,常见单机文件系统是无法用于共享块设备上的,需要配合相应的文件系统。JuiceFS 就是其中一种支持共享块设备的方案,支持使用多挂载块设备(没有经过格式化的裸盘)来作为文件系统存储。
这种模式下,可以将存并发高频随机写、大量小文件写入的客户端挂载好块设备,提升这部分写入的性能,比如 EDA,CV 训练前的数据处理,Elasticsearch,ClickHouse 等。
考虑到多挂载块设备的挂载个数限制一般是 16 个,如果需要访问块设备的客户端超过了供应商的多挂载限制,请升级 JuiceFS 5.2,新版的客户端支持代理访问,未挂载块设备的客户端,可以通过其他能够访问块设备的客户端,来进行代理访问,详见下一小节。
单挂载块设备
在 5.2 之前,共享块设备只能被本节点的挂载点访问,其他客户端节点如果并未挂载共享块设备,则无法访问块设备上的文件。这样的共享块设备方案其实仅适用于只有少量节点挂载点需要访问 JuiceFS 的场景。从 JuiceFS 5.2 起,单挂载的云盘作为共享块设备时也能被其他客户端看到,无法直接访问云盘的挂载点可以通过 其他 JuiceFS 挂载点来“代理”访问共享块设备。
将块设备作为对象存储(Beta)
在了解上方介绍的使用场景的前提下,如果你的文件系统规模可控,可以仅使用块设备作为存储后端、不再需要对象存储。如有需要请在 Juicedata 工程师的指导下进行配置和使用。
使用流程
联系 Juicedata 工程师,告知需要开启该功能的文件系统以及块设备的挂载路径,等待工程师后台配置。配置完毕以后,进入文件系统页面,点击「块设备」标签页,就能看到功能已经启用,可以根据应用场景,自行设归档相关阈值。
挂载文件系统。注意启用块设备以后,首次运行 juicefs mount
命令的时候,需要关注 /var/log/juicefs.log
中的相关日志输出,如果出现类似这样的日志,代表块设备正确识别、符合预期:
Added device 0 (7d456ed7-1853-493e-ac12-52305368a819) at /dev/disk/by-id/virtio-bp18k7whb2xr01kgjkp0 with capacity 100 GiB
如果设备挂载路径正确(与控制台所的「块设备」页面显示路径一致),但是却并未出现以上日志,请联系 Juicedata 工程师协查。
挂载成功以后,以上方截图中的设置为例,向文件系统发起 4MiB 以下的写入请求,数据就会直接写入块设备中,可以用 juicefs info
命令进行核实。
$ date >> /jfs/test.txt
$ juicefs info /jfs/test.txt
test.txt :
inode: 3
files: 1
dirs: 0
length: 2 Bytes
size: 4.00 KiB (4096 Bytes)
path: /a
objects:
+------------+---------------------------------------------+--------------+-----------+--------+
| chunkIndex | objectName | size | offset | length |
+------------+---------------------------------------------+--------------+-----------+--------+
| 0 | /dev/disk/by-id/virtio-bp18k7whb2xr01kgjkp0 | 107374182400 | 536870912 | 2 |
+------------+---------------------------------------------+--------------+-----------+--------+
注意上方的 juicefs info
命令输出,如果 objectName
包含块设备挂载点作为前缀,就说明数据已经写入块设备。作为对比,如果并未启用块设备,或者容量不足、直接写入对象存储,对应的信息就会是对象存储的键值,例如:
$ juicefs info /jfs/a
/jfs/a :
inode: 51
files: 1
dirs: 0
length: 2 Bytes
size: 4.00 KiB (4096 Bytes)
path: /a
objects:
+------------+-------------------------------+------+--------+--------+
| chunkIndex | objectName | size | offset | length |
+------------+-------------------------------+------+--------+--------+
| 0 | poc/chunks/B5/54/54450357_0_2 | 2 | 0 | 2 |
+------------+-------------------------------+------+--------+--------+