31

在阅读了我的另一个问题后,使用关系数据库处理无模式数据,我开始怀疑文件系统是否比关系数据库更适合存储和查询无模式数据。

与其仅仅在 MySQL 之上构建文件系统,为什么不直接将数据保存到文件系统中呢?需要弄清楚索引,但现代文件系统非常稳定,具有复制、快照和备份设施等强大功能,并且可以灵活地存储无模式数据。

但是,我找不到任何人使用文件系统而不是数据库的示例。

我在哪里可以找到更多关于如何将无模式(或“面向文档”)数据库实现为文件系统之上的层的资源?有人使用现代文件系统作为无模式数据库吗?

4

5 回答 5

22

是的,文件系统可以被视为类似 NOSQL 的数据库系统的特例。它可能有一些限制,在任何设计决策中都应该考虑:

优点: - - 简单、直观。

  • 利用多年的调优和缓存算法
  • 易于备份,可能易于集群

需要考虑的事情:

  • 元数据的丰富性 - 它存储什么类型的数据,它如何让您查询它们,您是否可以具有分层或多值属性

  • 查询元数据的速度 - 并非所有 fs 都特别优化了大小、日期以外的任何内容。

  • 无法加入查询(尽管这对 NoSQL 来说很常见)

  • 存储使用效率低下(除非文件系统执行块子分配,否则无论大小如何,每个存储的项目通常都会消耗 4-16K)

  • 它的目录结构可能没有您想要的那种缓存算法
  • 往往不太可调等。
  • 备份解决方案可能会遇到麻烦,具体取决于您存储内容的方式 - 太深,每个节点的项目太多等 - 这可能会消除这种结构的明显优势。如果您调用正确的例程,锁定本地文件系统当然可以很好地工作,但不一定适用于网络基础文件系统(这些问题已经通过各种方式解决,但这肯定是一个设计问题)
于 2011-04-24T17:16:03.660 回答
1

我在 15 多年前就有了同样的想法,当时托管成本和硬件限制与今天大不相同。

我的主要动机是设计一种能够承受流量高峰的廉价且简单的解决方案。另一个目标是通过消除 SQL 攻击向量来提高应用程序的安全性。

我最终得到了一个简单的面向文档的数据库,更像是 FS 函数的包装器。

从长远来看,出于好奇而开始的个人项目被证明是非常有益的。我将尝试列出优点和缺点。

优点:

  • 快速地
  • 维修便宜。我使用文件系统“数据库”构建的大多数应用程序直到今天仍在工作,对数据库实现部分进行零维护。这是一个出乎意料的结果,这是因为文件系统功能在我使用此解决方案的所有编程语言(PHP、C、C++、Erlang)中很少更改。对于使用主流数据库的应用程序,我不能说同样的话。他们经常需要修复已弃用的代码,而我的许多旧项目现在都已经死了,因为我或客户决定不再为昂贵的升级提供资金。或者运行具有高安全风险的旧的不受支持的数据库版本。
  • 对攻击具有弹性,完全不受 SQL 注入的影响。许多攻击者瞄准主流产品,面对定制存储设施时毫无头绪。
  • 与许多需要套接字连接的数据库系统相比,它在承受流量峰值方面非常出色。用尽数据库的最大连接限制非常容易,而且众所周知的 NoSQL 数据库的许多驱动程序都有一个有限的连接池,它们可以跨多个线程重用,这迫使行业设计昂贵的分布式系统。
  • 出乎意料的容易规模化。在一个应用程序需要存储更多数据的情况下,我最初预计我使用了分布式文件系统 (Ceph),我在没有任何代码修改的情况下解决了这个问题。
  • 将文件保存在 RAM FS 中打开了许多优化事物的机会
  • 我说安全了吗?您所需要关心的通常是确保任何上传过程都不能向您写入 FS 数据库文件,也不能对文件名进行欺骗。当然还有您常用的操作系统安全措施来保护您的文件。
  • 使用文件系统工具易于备份和维护。

缺点:

  • 由于缺乏在更复杂的数据库系统中发现的主管进程,原子操作很难实现。
  • 实现计数器很困难,您必须非常有创意地设计一个基于 FS 的数据库锁定机制,特别是如果您想与分布式 FS(例如 Ceph)保持兼容,因为已知操作系统级文件锁存在漏洞。
  • 处理并发写入很棘手。我想出了一个类似于 Cassandra 写入的简单解决方案,将更新添加为新文件,并让 cron 作业清理数据的旧“版本”。

我的结论是,将文件系统用作数据库最适合由有限数量的管理员维护内容并且很少关注并发写入的应用程序。但是您希望获得尽可能便宜的读数。对于这些情况,这个想法可以节省很多钱。

免责声明:请不要太严厉地评判我 :) 我是一个程序员,我的思维定式是创造者,而不是开箱即用解决方案的用户。我生活在程序员从头开始做很多事情以满足他们的需求的时代,包括......操作系统。我相信个人实验(包括重新发明轮子)对任何人来说都是很好的学习机会。

于 2022-02-23T23:54:40.953 回答
0

欢迎您查看我们的Solid File System,它是一个虚拟文件系统产品,内置支持文件元数据和搜索此数据的类似 SQL 的搜索机制。另请阅读描述在不同类型的存储中存储不同类型的数据的好处的文章。

于 2010-11-25T08:27:02.677 回答
0

您可能需要考虑的一件事是 Oracle 的 BFILE 数据类型,它是指向磁盘上文件的指针。也许这可能是两全其美?Microsoft SQL Server 似乎不提供此功能。

于 2010-11-15T23:39:06.000 回答
0

在 Amazon 的 S3 上有一个很大的实施示例。

http://aws.amazon.com/s3/

这种实现是许多公司正在朝着的方向发展,因为它从根本上比关系数据库更好地扩展。该方法很简单,而且很有效,对于某些问题,它是一个很好的解决方案。以亚马逊的 S3 为例,如果您不想担心自己存储数据的麻烦,它特别适合云存储。

于 2010-11-15T23:39:10.723 回答