实现高性能的分布式文件系统/数据库

时间:2012-01-10 17:50:06

标签: c database linux

我需要以最快的方式在Linux上的分布式系统中存储密钥/值对。数据库的记录很小,平均256字节。

我正在考虑使用open(),write()和read()系统调用,并直接在文件中的某个偏移处写入键值对。我可以省略fdatasync()系统调用,因为我将使用带有电池的SSD磁盘,所以如果发生意外关闭系统,我不必担心ACID合规性。 Linux已经提供了磁盘缓存实现,因此在已经加载到内存中的扇区上不会发生读/写操作。这(我认为)将是存储数据的最快方式,比任何其他具有缓存功能的数据库引擎(例如GT.M或Intersystem的Globals)快得多。

然而,数据没有被复制,为了实现复制,我可以使用NFS挂载另一个Linux服务器的文件系统并将数据复制到那里,例如,如果我有2个数据服务器(1个本地和1个远程),我会发出2个open(),2个write()和2个close()调用。如果远程服务器上的事务失败,我会将其标记为"不同步"并在远程服务器返回时再次复制好文件。

您如何看待这种方法?它会快吗?我可以使用NFS over UDP,因此我将避免TCP堆栈开销。

到目前为止,优势列表是这样的:

  • 重用Linux磁盘缓存
  • 几行代码
  • 高性能

我将在C中对此进行编码。要在文件中找到记录,我将使用指向物理位置的指针在内存中保留btree。

2 个答案:

答案 0 :(得分:3)

我想到了一些建议。

  • 是否需要为每笔交易打开()/ write()/ close()?特别是open()的系统调用开销可能是非常重要的

  • 你能使用mmap()而不是显式的write()吗?

  • 如果你为每个事务做2次write()调用(1个本地,1个NFS),似乎任何类型的网络问题(延迟,丢包等)都有可能带来你的如果您正在等待NFS write()调用成功,则应用于screeching halt。如果您没有等待,例如通过从单独的线程执行NFS写入,您的复杂性将迅速增加(我不认为“几行代码”将保持正确。)

一般来说,我建议您在选择重新发明这种特殊的车轮之前,先向自己证明可用的工具不符合您的性能要求。

答案 1 :(得分:1)

你可能会研究一个真正的分布式文件系统,而不是使用NFS,正如你所指出的那样,它仍然提供单点故障而且没有复制。

最初由CMU开发的安德鲁文件系统(AFS)可能是您的解决方案。这是一个商业产品,但您可以查看适用于Linux(和其他系统)的OpenAFS

警告:AFS有学习曲线。