JuiceFS 元数据引擎选型指南( 二 )


从可用性来说,部署 Redis 哨兵监控节点和备用节点,可以在主 Redis 节点挂掉后选择一个备份节点来重新提供服务,一定程度上提高可用性 。然而,Redis 本身并不支持分布式的一致性协议,其备用节点采用的是异步备份,所以虽然新的节点起来了,但是中间可能会有数据差,导致新起来的数据并不是那么的完整 。
MySQL 和 PostgreSQL 的整体表现比较类似 。它们都是经过大量用户多年时间验证过的数据库产品,可靠性和可用性都不错,流行度也很高 。只是相较于其余元数据引擎,它们的性能一般 。
TiKV 原本是 PingCAP TiDB 的底层存储,现在已经分离出来,成为一个独立的 KV 数据库组件 。从我们的测试结果来看,它用来作为 JuiceFS 的元数据引擎是一个非常出色的选择 。其本身就有不弱于 MySQL 的数据可靠性和服务可用性,而且在性能与扩展性上表现更好 。只是在流行度上,它和 MySQL 还有差距 。从我们与用户交流来看,如果他们已经是 TiKV 或 TiDB 的用户,那最后通常都会偏向使用 TiKV 来做 JuiceFS 的元数据引擎 。但如果他们之前对 TiKV 并不熟悉,那要再接受这样一个新的组件就会慎重许多 。
etcd 是另一个 TKV 类的数据库 。支持 etcd 的原因是因为它在容器化场景中流行度非常高,基本上 k8s 都是用 etcd 来管理它的配置 。使用 etcd 作为 JuiceFS 的元数据引擎,并不是一个特别适配的场景 。一方面是它的性能一般,另一方面是它有容量限制(默认 2G,最大 8G),之后就难以扩容 。但是它的可靠性和可用性都非常高,而且容器化场景中也很容易部署,因此如果用户只需要一个规模在百万文件级别的文件系统,etcd 依然是一个不错的选择 。
最后是 SQLite 和 BadgerDB,它们分别属于 SQL 类和 TKV 类,但使用起来体验却非常类似,因为它们都是单机版的嵌入式数据库 。这类数据库的特点是性能中等,但扩展性和可用性都比较差,因为其数据其实就存放在本地系统中 。它们的优势在于非常易用,只需要 JuiceFS 自己的二进制文件,不需要任何额外组件 。用户在某些特定场景或者进行一些简单功能测试时,可以使用这两个数据库 。
02- 典型引擎的性能测试结果我们做过一些典型引擎的性能测试,并将其结果记录在这个文档中 。其中一份从源码接口处测试的最直接结果大致为:Redis > TiKV(3 副本)> MySQL(本地)~= etcd(3 副本),具体如下:
Redis-AlwaysRedis-EverysecTiKVMySQLetcdmkdir600471 (0.8)1614 (2.7)2121 (3.5)2203 (3.7)mvdir878756 (0.9)1854 (2.1)3372 (3.8)3000 (3.4)rmdir785673 (0.9)2097 (2.7)3065 (3.9)3634 (4.6)readdir_10302303 (1.0)1232 (4.1)1011 (3.3)2171 (7.2)readdir_1k16681838 (1.1)6682 (4.0)16824 (10.1)17470 (10.5)mknod584498 (0.9)1561 (2.7)2117 (3.6)2232 (3.8)create591468 (0.8)1565 (2.6)2120 (3.6)2206 (3.7)rename860736 (0.9)1799 (2.1)3391 (3.9)2941 (3.4)unlink709580 (0.8)1881 (2.7)3052 (4.3)3080 (4.3)lookup9997 (1.0)731 (7.4)423 (4.3)1286 (13.0)getattr9189 (1.0)371 (4.1)343 (3.8)661 (7.3)setattr501357 (0.7)1358 (2.7)1258 (2.5)1480 (3.0)access9089 (1.0)370 (4.1)348 (3.9)646 (7.2)setxattr404270 (0.7)1116 (2.8)1152 (2.9)757 (1.9)getxattr9189 (1.0)365 (4.0)298 (3.3)655 (7.2)removexattr21995 (0.4)1554 (7.1)882 (4.0)1461 (6.7)listxattr_18888 (1.0)374 (4.2)312 (3.5)658 (7.5)listxattr_109491 (1.0)390 (4.1)397 (4.2)694 (7.4)link605461 (0.8)1627 (2.7)2436 (4.0)2237 (3.7)symlink602465 (0.8)1633 (2.7)2394 (4.0)2244 (3.7)write613371 (0.6)1905 (3.1)2565 (4.2)2350 (3.8)read_100 (0.0)0 (0.0)0 (0.0)0 (0.0)read_1000 (0.0)0 (0.0)0 (0.0)0 (0.0)