新月のネットワーク
朔0.7で導入された3層のネットワークについて解説します。
隣接ノードのネットワーク
新月の最も基本となるネットワークです。 初期の新月にはこのネットワークしかありませんでした。
青いノードは隣接する赤いノードから次のような情報を受け取ります。
- 他のノードの情報。
- 仮想ファイル(スレッドなど)の更新情報。
- 仮想ファイルのデータ。
ノード間では定期的に連絡をとり、連絡が途絶えたら別のノードと接続します。
検索ノードのネットワーク
Perl版新月0.5で導入されました。
Perl版新月0.4以前では次のようにして仮想ファイルの同期を行っていました。
- 青いノードは赤いノードに仮想ファイルがあるかどうか問い合わせる。
- 赤いノードが仮想ファイルを持っていなければ、 赤いノードから緑のノードの情報を1つずつ得る。
- 緑のノードに問い合わせる。
- 緑のノードも持っていなければ、別の緑のノードの情報を1つ得る。
これでは通信量が大きくなってしまいます。
現在は青いノードが赤いノード以外にも、緑のノードの情報を持っています。 青い矢印のように緑のノードと直接通信し、仮想ファイルの同期を行います。
これはP2Pの世代分けでいうと第2世代にあたります。
- 第1世代
- どのノードがファイルを持っているかをサーバに問い合わせる。
- 旧Napstar, WinMXなど。
- 第2世代
- どのノードがファイルを持っているかをノードに1つ1つ尋ねる。
- Freenet, Winnyなど
- 第3世代
- どのノードがファイルを持っているかをDHTで解決する。
- Skype(探すのはファイルはなく人だけど)など。
しかし新月では仮想ファイルの同期は重要な箇所ではなく、 その部分を外してしまっても機能します。 第2世代に属するのが正しいのかはよくわかりません。
共有ノードのネットワーク
朔0.7で導入されました。 新月は書き込みがあったとき次のようにしてデータを伝播させます。
- 周囲のノードに書き込みがあったこと(更新情報)を伝える。
- その仮想ファイルを持っているノードはデータを取得する。
- 更新情報をリレーして伝える。
それまでは隣接ノードを経由して仮想ファイルの更新情報を流していました。 机上シミュレーションをしてみたところ、 これではノード数が増えたときに負荷が大きくなる恐れがあることがわかりました。 つまり書き込みのデータが広まる前に更新情報が広まってしまうと、 書き込みのあったノードにアクセスが集中してしまうのです。 負荷を減らすには 同じ仮想ファイルを持つノードに優先的に更新情報を流す必要があります。
青いノードはまず黄緑のノードに更新情報を流します。 黄緑のノードは同じ仮想ファイルを持つノードで、 すぐに書き込みのデータを取得しますので、 青い矢印は新しい書き込みそのものだと思って構いません。
黄緑のノードは別の黄緑のノードに書き込みを伝えます。 それと並行して、青いノードは赤いノードに更新情報を伝えます。 赤いノードは桃色のノードに更新情報を伝えます。 桃色のノードは同じ仮想ファイルを持っているのに 黄緑のノードには気付かれていなかったノードです。 このとき青いノードから桃色のノードに書き込みの内容が伝わります(桃色の矢印)。
以前の設計では、 黄緑のノードにも青いノードから直接書き込みの内容を伝える場合が 多くなる可能性がありました。