概要
はじめに
東京大学情報理工学系研究科修士1年の山根那夢達です。普段はネットワークパケットの冗長化に関する研究を行っています。2024年8月19日から9月27日までの6週間、ネットワーク領域にて就業型インターンとして参加させていただきました。
今回参加させていただいたチームでは、LINEヤフーを支えるネットワークの運用やそれに関わる開発を行っています。私が今回のインターンシップに興味を持ったきっかけは、研究室でネットワークについての研究やサーバの管理をしていく中で、ネットワークに関連する開発に関心を抱いたからです。
業務内容
今回のインターンシップでは、LINEヤフーのネットワークトポロジーを描画するシステムの設計・開発を行う業務に取り組みました。
ネットワークトポロジーとは、図1 のように、多数のルータ・スイッチなどのネットワーク機器の間の繋がりのことをいいます。トポロジー図においては、ノード(ネットワーク機器)とエッジ(物理的なケーブル・物理リンク)からなるグラフとして表され、多数の機器からなるネットワークの機器間の繋がりを視覚的に示すことができます。一般的なトポロジー図は、機器名とリンクからなる一枚の絵に過ぎないのですが、もし各リンクを流れる通信量が一目で分かるようになれば、これはネットワーク機器の状態を即時に把握することに繋がり、とても有意義なことです。例えばネットワーク機器のマクロな状態、つまり外部との境界のルータからの通信しかできないような状態だとします。この場合、ある機器との通信ができなくなった時、それがどのリンク間での接続が落ちているからなのかがわかりません。また、各機器のメトリクスを取得していたら十分であるかといえば、そうではありません。可視化ができていなければ人間が一つ一つの機器に入って取得する必要があり、時間もかかる上全体像も把握しづらくなってしまいます。
こうした問題を解決 するのが今回開発するネットワークトポロジーシステムというわけです。このシステムがあれば落ちていたり、逼迫(ひっぱく)していたりするインターフェースが一目でわかるなどの利点があります。また機器の情報を自社データベースに集約することで、他の用途への使用も期待できることから、ネットワーク管理には欠かせないシステムの1つとなっています。
本来こうしたシステムを外注した場合、複数人のチームで半年以上の長期的なスパンで開発を進めていくことが多いそうなのですが、今回は6週間という短い期間の中で、設計・技術選定からコア機能および一部重要な機能を作成して動かせる状態に持っていくところまでを目標に開発を行いました。
注力した部分
開発を始めるに先立ち、今回のシステム開発にふくむべき機能をどのようにするかを把握したいと考えました。そこで、具体的な業務に即した形で使うのに欲しい機能をもれなくリストアップすることとしました。具体的には、以前社内で使用されていた類似のツールを参考にしたり、インターネット上で既存のネットワークトポロジーシステムなどを調べたり、社員の方にヒアリングを行ったりしました。こうして今回のシステムに持たせるべき機能を明らかにしました。以下ではコア機能および、それに加え自分が注力した部分を説明していきます。
コア機能
今回作成するネットワークトポロジーシステムは、手動でネットワークトポロジー図を描画するマップ・ノード(機器)・エッジ(物理リンク(の集まり))を追加・削除する仕組みとしました。手動作成機能は一 切持たせず、システム側で自動で表示対象を選ぶようにするという案も検討しましたが、見やすい配置の決定や、人間側が監視したい対象を過不足なく盛り込むなどの管理者側の細かいニーズに応えにくいという点が懸念されたため、手動の編集機能を追加する方針となりました。また自動作成機能自体はマップデータをクライアント側に渡すだけで後々実現ができるため、その点でもこの方針で問題ないと考えました。その上で、このようなコア機能を盛り込みたいと考えました。
- ネットワークトポロジー図の表示: JSON 形式のデータをもとに、クライアント側でマップを表示する機能
- ネットワークトポロジー図の編集: 機器を配置するマップを表示・選択・作成・削除できる機能
- 配置するノードの検索・追加・削除: 追加する機器を決定するための機能
- ノードの移動・サイズ変更: ドラッグによりノードを移動でき、またサイズの変更ができるようにする
ノードの追加について、以前使われていたシステムでは数百ノードの表示が限界でしたが、より多くのノードを表示したいという要望もあり、およそ3,000ノード程度は大きな遅延なく表示できるようにシステムを構築したいと考えました。またクライアント側の描画用フレームワーク自体は、今後の改良を挟めばすべてのネットワーク機器・エッジを表示しても耐えうるようなものにしたいと考えました。
グループノード
概要
「+」ボタンで展開、「-」ボタンで縮小することのできるノードです。中にノードを内包できます。縮小されている間はグループの持っている全 部の子ノードが非表示になり、その中のノードがまとめて1つのグループノードとして表現されることになります。展開されると、内部のノードが表示される仕組みになっています。これを追加することにより、大規模なネットワークトポロジーでもグループをまとめてわかりやすく図示することが可能となります。
入れ子構造
グループの中にグループを含めることができるようにします。この機能により3,000ノードのような、1層のグループ化ではノード数が多くなり過ぎてしまう規模のネットワークトポロジーを描画する場合における、ユーザ体験の向上が期待できます。多層構造により人間にわかりやすいような見た目にすることができ、かつ深掘りも可能となり、見やすさと情報の網羅の両方を達成できます。
グループ間移動
移動した時にそのノードが展開中のグループノードに含まれていれば、そのノードの属するグループを変更する機能です。ノードの属するグループが移動した時に、グループとノードを繋ぐエッジがどのように変化するかという部分をきちんと実装するのが難しい部分となります。
物理リンクごとの流量の値・画像の表示
リアルタイム流量確認機能
リアルタイムに各エッジの持つ物理リンク(ケーブル)の流量を見られるようにすることで、問題の箇所を迅速に発見できるようにする仕組みです。エッジをクリックしたときに関連する流量を表示する機能や、一定間隔で流量を自動的に更新する機能が含まれます。