2012-01-10 8 views
4

Linux上の分散システムにキーと値のペアを格納するための最速の方法を実装する必要があります。データベースのレコードは、平均で256バイトという非常に小さいものです。高性能分散ファイルシステム/データベースを実装する

私は、open()、write()、read()システムコールを使用して、ファイル内のオフセットでキーと値のペアを直接書き込むことを考えています。私はバッテリーでSSDディスクを使用するので、fdatasync()システムコールを省略することができます。したがって、システムの予期しないシャットダウンが発生した場合、ACID準拠について心配する必要はありません。 Linuxはすでにディスクキャッシュの実装を提供しているため、メモリに既にロードされているセクタでは読み書きは行われません。これは(私が思う)データを保存する最も速い方法です、例えばGT.MやIntersystemのGlobalsのような他のキャッシュ可能なデータベースエンジンよりもはるかに高速です。

しかし、データは複製されず、複製を達成するために、別のLinuxサーバのファイルシステムをNFSでコピーしてそこにコピーすることができます。たとえば、2つのデータサーバ(1つのローカルサーバと1つのリモートサーバ) 2つのopen()、2つのwrite()、2つのclose()呼び出しを発行します。リモートサーバー上でトランザクションが失敗した場合は、「同期がとれていない」とマークし、リモートサーバーが戻ったときに正常なファイルを再度コピーします。

このアプローチについてどう思いますか?それは速くなるでしょうか?私はUDP over NFSを使うことができるので、TCP Stackのオーバーヘッドは避けます。

アドバンテージリストは、これまでのところ、このように書きます:

  • 、Linuxのディスクキャッシュ再利用コードの
  • 数行
  • 高性能

私が見つけるにはC.でこれをコーディングしますファイルのレコード私は物理的な場所へのポインタでメモリにbtreeを保持します。

+0

お待ちください。お待ちください。なぜあなたは*書く必要がありますか?これはクラスか何かのためですか? – chrisaycock

+0

いいえ、Webアプリケーション用です – Nulik

+0

GDBMを基本ライブラリとして使用することを検討しましたか? –

答えて

1

NFSを使用するのではなく、実際の分散ファイルシステムに目を通すことができます。

CMUが独自に開発したAndrew File System(AFS)は、あなたのための解決策かもしれません。これは商用製品ですが、Linux(と他のシステム)で動作するOpenAFSをチェックしてください。

警告:AFSには学習曲線があります。

3

いくつかの提案が思い浮かびます。

  • すべてのトランザクションでopen()/ write()/ close()が必要ですか?特にopen()のシステムコールオーバーヘッドはおそらく単純ではない

  • 明示的なwrite()の代わりにmmap()を使用できますか?

  • 各トランザクションで2つのwrite()コール(ローカル、1 NFS)を実行している場合は、ネットワークに問題があるようです(遅延、パケット破棄など)あなたがNFS write()コールが成功するのを待っているならば、辛うじて停止するでしょう。また、別のスレッドからNFS書き込みを実行するなどして待機していない場合、複雑さは急速に拡大します(「コードの数行は真実」とは考えられません)。)一般的に

、私はあなたが本当に利用可能なツールは、この特定の車輪を再発明することを選択する前に、あなたのパフォーマンス要件を満たしていないことを自分自身に証明することを示唆しています。

+0

ありがとう!はい、私はopen()close()を省略してwrite()read()を発行するだけかもしれませんが、write()をmmap() – Nulik

+0

私は同意します。ここでは、リモートサーバーをタイムアウトさせるために少し複雑になり、再度再同期する必要があります。 – Nulik

+0

私はmmapについて知っていますが、メモリを必要とするので、write()/ read()を使用しなければならないと思います。また、標準の4Kではなく、アプリケーションで2MBのページを使用します。 – Nulik

関連する問題