分散ファイルシステム

**分散ファイルシステム** (distributed file system) または**ネットワークファイルシステム** (network file system) とは、複数のホストがコンピュータネットワークを経由して共有しつつファイルにアクセスすることを可能にするファイルシステムである。複数のマシン上で複数のユーザーがファイルやストレージ資源を共有できるようにする。

クライアントノードはファイルシステムを構成している二次記憶装置に直接アクセスすることはできないが、通信プロトコルを使ってネットワーク経由でやり取りする。その通信プロトコルがどう設計されているかにもよるが、アクセスリストまたはケーパビリティに基づいてクライアントとサーバの双方でファイルシステムへのアクセスを制限することも可能である。

これに対してでは、全ノードがファイルシステムを構成しているストレージ全体に一様に直接アクセスできる。その場合、アクセス制御はクライアント側の責任となる。

分散ファイルシステムには一般に、透過的レプリケーションとフォールトトレラント性に関する機能がある。すなわち、ファイルシステムを構成するノード群の一部がオフラインになっても、データを失うことなくシステムとして機能し続ける。

。

## 歴史と具体例
このようなファイルサーバは1970年代に開発された。1976年、DECが DECnet Phase II の一部である Data Access Protocol 実装として File Access Listener (FAL) を開発したのが、世界初の広く使われたネットワークファイルシステムとなった。1985年、サン・マイクロシステムズが世界初の広く使われる Internet Protocol ベースのネットワークファイルシステムとなる Network File System (NFS) を開発した。他のネットワークファイルシステムとしては、Andrew File System (AFS) や Apple Filing Protocol (AFP)、NetWare Core Protocol (NCP)、Server Message Block (SMB)がある。

## 透過性
分散ファイルシステムは透過性を備えていることが多く、プログラムやユーザーから見ればネットワーク経由のファイルがローカルディスク上のファイルと全く同じに扱える。サーバや記憶装置の多様性と分散は隠蔽される。ファイルの配置やデータ転送はファイルシステムに任されている。

## 性能
ネットワークファイルシステムでは、処理にかかる時間も重要な課題である。通常のファイルアクセスならば、これはディスクアクセス時間と少しのCPU処理時間に相当する。ネットワークファイルシステムでは、分散構造であるが故の余分なオーバヘッドが必要となる。このオーバヘッドには、サーバに要求を届けるまでの時間、応答をクライアントまで戻すのにかかる時間などが含まれる。どちらの方向も情報転送時間だけでなく、通信プロトコルソフトウェアの実行にかかるCPU時間が含まれる。ネットワークファイルシステムの性能もある意味でネットワークファイルシステムの透過性の一部と言える。すなわち、理想的なネットワークファイルシステムの性能はローカルなディスクアクセスと同程度になる。

## 同時ファイル更新
ネットワークファイルシステムは複数のクライアントプロセスが同じファイルを同時に更新できるようにしなければならない。あるクライアントのファイル更新によって別のクライアントの参照や更新が妨害されてはならない。そのため並行性制御やロックをファイルシステムに組み込むか、追加プロトコルに組み込む必要がある。

## 分散データストア
**分散データストア**（**Distributed Data Store**）とは、ユーザーが自身の情報を複数のノードに格納しておくことを指す概念で、分散データベースとして実装される場合と複数のユーザーがP2Pネットワーク上で情報を格納する場合がある。

### 分散データベース
分散データベースとしての分散データストアは関係データベースではなく、多数のノードがあるデータに素早くアクセスできる。例えば、GoogleのBigTableがあるが、これは分散ファイルシステムあるいはP2Pネットワークに近い。他にも、Amazon.com の Dynamo、Windows Azure Storage などがある。

任意のクエリを可能にすることは可用性ほど重要視されないので、分散データストアは一貫性を犠牲にして可用性を向上させる設計を採用することが多い。しかし、高速な読み書きを可能にすると一貫性が低下するので、CAP定理で証明されている通り、一貫性、可用性、分断耐性を同時に保証することはできない。

### P2Pネットワークによるデータストア
P2Pネットワークのデータストアでは、ユーザーは互いに自らのコンピュータをストレージノードとして提供し、同時に他者のコンピュータをストレージノードとして利用する。ある情報に他のユーザーがアクセスできるかどうかはネットワークの設計に依存する。

多くのP2Pネットワークは、各ユーザーのノードが常にネットワーク上にあるわけではないため、分散データストアを持たない。しかし、BitTorrentなどのシステムではこの区別があいまいとなる。というのも、あるノードがオフラインになってもその内容が相変わらず提供され続けるようになっているためである。なお、これは個々のファイルが再配布者に要求された場合であり、全てのコンピュータが全てのファイルを提供するようになっているFreenetなどのネットワークとは対照的である。

分散データストアでは、誤り検出訂正技法がよく使われる。場合によっては、ファイルの一部が壊れていた場合に前方誤り訂正技法で修復する。そうでない場合は、異なるミラーサイトから同じファイルを再度ダウンロードする。

## 主なプロトコル
分散ファイルシステムは、レプリケーションによるフォールトトレラント性強化を目指したもの、並列化による性能強化を目指したもの、両方を同時に実現しようと設計されたものがある。

### 分散ファイルシステム
* 9P - Plan 9 の通信プロトコル
* Amazon Simple Storage Service (Amazon S3)
* Andrew File System (AFS) - カーネギーメロン大学(CMU)の開発した分散ファイルシステム。NFS version 4 に影響を与えた。実装の1つに OpenAFS がある。
* Apple Filing Protocol (AFP) - Apple
* DCE/DFS - DCEの一部として開発された。AFSの影響を受けている。
* MapR FS - ファイル、テーブル、メッセージングAPIが利用可能な高性能分散ファイルシステム。
* NetWare Core Protocol (NCP) - ノベル
* Network File System (NFS) - サン・マイクロシステムズ
* Self-certifying File System (SFS)
* Server Message Block (SMB) - 元々はIBMだが、多くのバージョンはマイクロソフトによる。*Common Internet File System (CIFS)* とも。
* WebDAV : Hypertext Transfer Protocolを拡張し、Webサーバを分散ファイルシステムとして利用するためのプロトコル。

#### 分散フォールトトレラントファイルシステム
* Coda - カーネギーメロン大学 (CMU) の開発したAFSの後継となる分散ファイルシステム。
* Distributed File System (Dfs) - マイクロソフト。透過性と高可用性を重視。
* InterMezzo - HTTP を使った同期。なお、開発者らは Lustre に移行したので、既に開発終了している。
* Moose File System (MooseFS)

#### 分散並列ファイルシステム
* FhGFS (Fraunhofer Parallel File System) - フラウンホーファー協会
* Parallel Virtual File System

#### 分散並列フォールトトレラントファイルシステム
* Chiron FS  - fuse ベース。既存のファイルシステムを使い、ファイルシステムレベルでの RAID1（ミラーリング）を実現。ただしプロジェクトは2008年以降低調。
* Coherent Remote File System (CRFS) - Btrfsを使用。開発中。
* Gfarmファイルシステム - 産業技術総合研究所の開発したグリッド向け分散ファイルシステム。メタデータには OpenLDAP または PostgreSQL を使用し、マウントには FUSE または LUFS を使用。
* Ceph - カリフォルニア大学サンタクルーズ校。Linuxカーネル 2.6.34 にて取り込まれるようになった。
* GlusterFS
* Google File System - Googleの開発した分散ファイルシステム。
* Hadoop - Apache によるGoogleFSクローン
* HAMMER/ANVIL - DragonFly BSD
* Lustre - ストレージのフェイルオーバーによる高可用性を実現。
* PlasmaFS  - SunRPC風のプロトコルを採用し、トランザクションAPIを実装。NFSのボリュームとしてもマウント可能で、POSIX互換。データもメタデータもレプリケーション対象。
* PNFS (Parallel NFS) - NFSの最新版
* POHMELFS (Parallel Optimized Host Message Exchange Layered File System) - POSIX準拠。Linuxカーネル2.6.30から含まれるようになった。
* XtreemFS - SSL と X.509 の認証をサポートしており、公衆ネットワークをまたいだ運用が可能。
* zFS - IBMのz/OSのファイルシステム（ZFSとは異なる）。分散トランザクション指向。

### SAN/クラスタファイルシステム
* CXFS (Clustered XFS) - シリコングラフィックス (SGI)
* EMC Celerra HighRoad - EMC
* General Parallel File System (GPFS) - IBM
* GFS2 (*Global File System*) - レッドハット
* Oracle ACFS - オラクル
* OCFS2 (*Oracle Cluster File System*) - オラクル
* StorNext File System - クアンタム。Xsanと相互運用可能。従来はCVFSと称していた。
* Xsan - アップル
* VMFS - VMware/EMCコーポレーション

### 分散データストア
#### 分散データベース
* Apache Cassandra - Facebook がかつて採用していた。
* BigTable - Google
* Dynamo - Amazon.com
* HBase - Facebook がメッセージングプラットフォームとして採用
* Riak
* Voldemort

#### P2Pネットワークによるデータストア
* BitTorrent
* Chord project
* ColonyFS - 匿名性を重視したP2Pファイルシステム（Java、C#）
* Freenet
* GNUnet：P2Pネットワークソフト
* Infinit
* Ivy - MITのP2Pファイルシステム
* NNTP (ネットニュース用プロトコル)
* Pastis - フランスで開発中のP2Pファイルシステム（Java）
* Storage@home
* Tahoe-LAFS 
* Sia
* IPFS
* Storj

## 脚注

## 関連項目
* 分散システム
* ファイル共有
* Global File System
* Gopher
* Peer to Peer
* 分散ハッシュテーブル

## 外部リンク
* Linux モダン分散ファイルシステム インターネットコム
* ''A distributed file system for distributed conferencing system'' ("A *DFS* for the *DCS*") by Philip S Yeager, Thesis, University of Florida, 2003. (pdf)
* File Systems