基盤ソフトウェア 6/19

来週は休講
だから今日入れて後3回くらい
課題はあと1回くらいは出す
残念ですが付き合ってください

  • -
分散ファイルシステム データを共有するためにはどういうことを考えなければいけないか Network Attaced Storage ファイルサーバ専用機 ネットワークに接続して共有ディスクとして利用 ネットワーク越しにデータを放り込んでおける便利なもの 外付けのHDDのようなもの 見たことない人は生協で売ってるので探してください 外付けのUSBディスクだったらUSBケーブルだけどその代わりにLANケーブル ネットワーク越しにデータをやりとりするのに便利 今日はこういうのを作るときにどういう仕組みになっているのか話をする 生協に売ってるのは安価な市販品 せいぜいPCが1台か2台くらい繋げればよい いい加減に作ってそんなに性能がでなくてもそんなに困らない これのもうちょっと大規模なやつは普通ファイルサーバーと呼ばれる ラックに入っていて、でかい、電気を食う、うるさい こういうのだと100人とかファイルをサーヴィスするのにも使えるはずなので かなり真面目に設計をする必要がある 理学部の情報化学科の演習室のMacはマシンについているディスクは使われていなくて ネットワークを通じてファイルサーバーに保存される 演習室の席を決める必要がない 別な大きなコンピュータのディスクに保存しておけばどのマシンからでも見ることができる みんなわりと使っている縁の下の力持ちてきな存在
  • -
問題は、どうやって作るかなんですけど アイディアは簡単 ハードディスクは物理的にマシンと繋がっている ファイルを読みたい場合、 OSがハードディスクにアクセスしてデータをもらってくる ネットワークファイルシステムの場合は、 まずOSに頼む OSからネットワークを通じて相手のOSに要求する 相手のOSがハードディスクを読み込んで送る ファイルを書く場合も同じような感じ 読んで上書きすればいい これで終わり 簡単です ただいろいろなアーキテクチャというかプロトコルがあって UNIXの場合はNFSがよく使われる Windowsの場合は通称SMB 最近だとiSCSIとか色々なものが出ている やりとりするときのデータフォーマットが違うだけ データフォーマットのことをプロトコルという 今日はプロトコルの詳細を話すことではないがともかく色んな物がある HTTPもある意味分散ファイルシステムプロトコルとみなすことができる HTTPはウェブブラウザとウェブサーヴァの間のやりとり やっていることは結局ファイルのやりとり HTTPの場合は読むだけで普通は書くことはできない でもプロトコルの仕様では書くこともできることになっている LinuxファイルシステムでHTTPを使うものもあった気がする なので基本的なところはすごく簡単 簡単で終わってしまうと話すことがないので わざわざ話すと言うことは簡単ではない 安いやつを作るときにはこれくらい知っておけばいい 大規模なものを作るときには工夫しなければいけない 一般に、こういう分散ファイルシステムを作るときには4つの指針がある Performance 読み出しにかかる時間がどれだけ少ないか これはわかりやすい Scalability 近年では結構重要なキーワード どのくらいたくさんのクライアントに対応できるか ウェブサーヴァなんかでも重要 誰も見に来ないマイナーなブログだとどうでもいいけど YouTubeみたいなサイトをつくろうとすると重要 ScalabilityとPerformanceは独立ではない トレードオフになりがち 設計上はどちらが大切か良く見極めてバランスをとることが重要 Consistency ファイルシステムなのだから、 同じファイルであればどのマシンから見ても同じ内容であるべき どのマシンからみても同じファイルは一緒じゃないかと思うかもしれないが パフォーマンスを上げるためにキャッシュを使うとか Dependability サーヴァがクラッシュしたときにどれだけ頑強か クライアントPCも巻き添えを食ってクラッシュすると困る そういう事態にどう対応するか 4つの指針を全て満たすのは難しい あちらを立てればこちらが立たず、というのはコンピュータシステム一般に言える その分野の指針を見極めて、どこを重視するのか考える そういうことを分散ファイルシステムを題材にして考える
  • -
Sun microsystems' NFS  Sunが元気がよかったのは80年代  90年代あたりからおかしくなってきて  2000年代にはいつつぶれてもおかしくないと言われつつまだつぶれていない 1980年代に登場 80年代というところが重要 当時のマシンのスペックによって4つの指針のバランスがとられた  1 MIPS以下 + 10Mbps Ethenet + 10台程度 Scalabilityをあきらめた Dependabilityはあきらめていない  当時のファイルサーヴァは不安定だった  1日1回くらいはダウンする  そういう不安定な場合でも動き続けることが大事 何故成功したのか どのようにファイルシステムが使われるのかを分析して技術的に詰めていった 現在のマシンのスペックを考えて作り直した方がいいけれどそのまんま なぜそのままなのか 世の中は良い技術だけが残るわけではない 互換性とか社会的な原因 Sunがつぶれても残り続ける 携帯電話とか新しいプロトコルでは互換性を気にしなくて良いので 新しいものが使われているのだけど MicrosftのSMBもずーっと引きずっている そんなことをいったらx86アーキテクチャも電卓用にべストな設計 64bitの時代になっても未だに使っている 今でも使われているからといって その技術がベストとはいえない ベストでないことが多い 出来たときはベストだけど今では違う それがわかっていても使われ続ける みんなが使っているからといって技術的にベストだと信じてしまうのは恥ずかしい 設計したときにどうだったのか見直すことは大事
  • -
Performance bottleneck ネットワーク速度ではない どちらかというとサーヴァ側のマシンのCPU速度 これは今でもそう TCP/IPは重い 100Mbpsは今でもそんなに早くはないが、 1GHzのCPUとの組み合わせで パケットサイズが小さいと実際の速度は20Mbpsくらいになってしまうのがざら システムの設計としてはできるだけネットワーク通信をしないことが 1Gbpsでも大切 どんなに早いネットワークを入れてもPCの方の性能を上げないと せっかく早い光ファイバーを入れても意味がない
  • -
そこで登場する技術 File cache 手許のマシンがネットワーク越しにファイルを読むと それが手許のマシンに読み込まれる 次に同じファイルにアクセスするときにはすでにローカルメモリにあるので ネットワーク通信をしなくて良い 問題はreadonlyのファイルをキャッシュしておくぶんには何の問題もない ファイルが書き換わると古いデータのキャッシュは全部無効にして それ以上使われないようにする その管理は非常に難しい Write-invalidate  書き込まれたら他のマシン上のキャッシュは破棄  破棄しろと命令を送りつける Write-update  書き込まれたら他のマシン上のキャッシュも更新  新しい内容を送りつける Migration  一時的に特定のマシンだけに書き込み許す  同時に書き込みが起こった時の混乱を避ける いろんなのがある 一般的にはWrite-invalidateが良いと言われている Write-updateだとネットワークの流量が増えてしまう サーヴァのクラッシュを考えなければWrite-invalidateがよい Write-invalidateだと どのクライアントにキャッシュがあるかサーヴァか管理しなければならない ブロードキャストでは、届いたかどうかわからない キャッシュを持ったクライアントマシンがダウンしている可能性もある そのときにファイルがが書き換わる その通知は届かない 僕が来週休講だと言って、全員来ていればよい たまたま休んでいる人がいた 文字通りダウンしていた その人には伝わらない 掲示を出すとかしても見ない 完璧を期すには 一人一人の名簿をもって個別に電話をするくらいはしないといけない 今はサーヴァがクラッシュすることはまれ NFSでは弱い一貫性制御の採用  片方のマシンでソースを書いて別のマシンでコンパイルするときに困るくらいで  実用上そんなに困らない しばらく待てば良い  古くなったかどうかはクライアントが自分で判断 完璧な一貫性は保たない クライアントは一定時間ごとに機械的にキャッシュを破棄 もうちょっとマシな実装だとディレクトリキャッシュを取って確認 Writeの場合も30秒に一回サーヴァに送るとかする 後は細かい話だけれど 毎回のアクセスにどのファイルのどの何バイト目から何バイトを読むとか送る  毎回ファイル名を送るのは、サーヴァにデータを残したくないから 一定時間内に応答がなければクライアントはリクエストを再送 ファイルロックはなし  ファイルシステムとは別にロックをするメカニズムをつける NFSはすぱっと割り切っている 同じファイルが複数のユーザに同時に使われることはそんなにない
  • -
Performance プロトコルに由来する問題 サーヴァの負荷が高い サーヴァは誰がキャッシュを持っているかわからない 各クライアントは一定時間経ったらキャッシュを捨てて毎回サーヴァにアクセスする 賞味期限が切れていなくても万が一腐ってたら捨てて毎回新しいものを買ってくる つまりScalabilityがない 4台程度のサーヴァで100台のクライアントをホストすると不安定(90年代末) 80年代のデザインで10台のマシンが不安定な環境でも動くように、 というデザインだからうまくいかない 対応策 Andrew File System (AFS) キャンパスにある全部のマシンがアクセスしても耐えられる という壮大な企画 この頃になるとサーヴァはそんなに落ちない 信頼性がある サーヴァは誰がキャッシュをもっているか覚えている キャッシュをメモリではなくローカルディスクに置く こういうことをしてサーヴァへの負荷を下げる 細かい話をしていないのであんまりよくないかもしれないが Scalabilityを上げるためにConsistencyは悪くなった サーヴァがクラッシュしたときの復旧も大変 Scalabilityは上がったが失っているものも多い 普及していない 今はScalabilityはすごく重要な問題 Webシステムもファイルサーヴァと同じ問題を抱えている AFSでも1000台程度のクライアント しかし人気のあるサイトだとすぐにユーザ数が10000とかになる 動画を1000とか10000のユーザがアクセスするとScalabilityの性能がよくないと耐え切れない HTTPにはそもそもまともなキャッシュ機能がない P2PはScalabilityを上げたので注目されている しかしConsistencyとDepandabilityは犠牲になった