mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

SDNインターン

はじめまして。こんにちは!
インターン前日の夜中にGが現れた絶望感から殆ど眠れず、初日から寝不足でインターンを開始した青山(真也)です。
Gは1匹いると、沢山居るって言いますよね……

今回、8/1~9/13まで「システム本部 運用部 アプリ運用G」という部門でインターンに参加していた学部3年生の僕が、ミクシィのエンジニアブログを書かせていただけることになりました。
運用部でのインターン採用開始は今年からだそうなので、魅力もたっぷりと含め全力でご紹介したいと思います。

ミクシィインターンのメリット

日常生活編

やはり渋谷に構える大手Web企業。
働きやすさが尋常じゃないです。
フリードリンクはもちろんのこと、コラボエリアから食べ物を調達することも出来ます。
もちろん服装はどんな私服でも問題ありません。
暑くったってへっちゃらですね。
快適な環境で仕事に打ち込むことが出来ます!

また、周辺には美味しいご飯屋さんが沢山あるため、インターンに期間中はランチ場所を熟知した先輩社員の方々と美味しいご飯を食べることが出来て幸せな毎日です。
毎日13時が待ち遠しいです……!
ランチで悩んだときは餃子と油そばのお店になります。
まず間違いなく、チューターさんが崇拝する餃子のお店のヘビーローテーションに入ります。
先輩曰く、「送別会の予約をしても電話番号聞かれなくなった!勝った!」だそうですw
この餃子屋さん本当に美味しくて、最終日の送別会もこの餃子屋さんでして頂けることになりました!
インターンが終わって食べられなくなるのが残念です……
参考: 立吉 渋谷本店 http://tabelog.com/tokyo/A1303/A130301/13101510/

色んな所に美味しいランチを食べにいった結果、完全にお昼食べる量が増えたというか、体重も増えたというか……
後々思うと、白ご飯がない所に行った気がしないですね……

もちろん、社員の方だけではなく同じ境遇のインターンの方と交流することも出来ます。
インターンの方と一緒にご飯へ行ったり、飲みに行ったりすることもありました。
人事部の方々が主催するインターン生だけの懇親会などでも交流を深めることが出来ました。

業務編

約1か月半という長期のインターンでは、短期間のインターンでは体験できない充実した就業経験をすることが出来ます。
例えば、アプリ開発のインターンだと、開発~リリース・修正などを通した経験をすることが出来ます。
僕が経験した運用部インターンでは様々な運用業務のほか、OpenFlowコントローラの作成を行いました。(詳しくは後程)
また、インターンだから触っては行けないという部分は殆ど無いため、実際に使用されているシステムに触れる仕事にとてもやりがいを感じることが出来ました。
今回のインターンを通して、色々な話を共有することが出来、非常にモチベーションが上がりました。
スキルアップはモチベーションに比例すると思うので、今後一層努力できる人間にも慣れたと思います。

ミクシィインターンのデメリット

インターンに参加することのデメリットは殆どありません。
強いて言うのであれば、当然夏休みに出社することになります。
しかし、ミクシィのインターンでは、1か月半全日参加が絶対という訳ではないので、用事がある場合にはお休みを頂くことが出来ます。
その辺りは融通が利くため、諦める前に一度人事部の方に相談してみると幸せになれるかと思います。
僕も割とお休みを頂きました。
むしろ僕の場合、学部3年後期の学校は大体週5お休みなので、これから夏休みに突入する気分ですね(`・ω・´)

【閲覧注意】ミクシィインターンで行ったこと

下記に当てはまる方 は、「ミクシィインターンで行ったこと」はスキップ推奨です。

  • 真面目な内容には興味がない
  • ネットワークって聞くと蕁麻疹が出る
  • ここまで読んできて疲れた
  • はてブに登録してくれない ←重要

今回のインターンで僕が行ったことは主に2つあります。
1つ目は、 OpenFlow と呼ばれるSDNを実現するものを使って、安定したサービスを提供できるようにすること。
もう1つはmixiサービスで使われるITインフラの運用業務です。
運用業務については細かい内容となってしまうため、今回は省略させていただきます。
では、インターン期間中に行ったことを簡単にしたものをまとめます。

SDNとOpenFlowとは

SDN(Software-Defined Network)とは、従来L2/L3スイッチなどとして機能が固定的だったスイッチで構成されていたネットワークを、より柔軟なネットワーク構成にするための技術や考え方のことです。
SDNでは、その名の通り管理者が自由に作成したソフトウェアでネットワークの制御を行います。
SDNの考えを反映した仕様の中でも、最近話題となっているのがOpenFlowと呼ばれるものです。
OpenFlowはOpenFlowコントローラとOpenFlowスイッチの2つから構成されています。
今回は、OpenFlowコントローラに Trema と呼ばれるフレームワークを、OpenFlowスイッチに Open vSwitch と呼ばれるOSSを使用しました。

Tremaについて

Tremaは、Tremaコマンド・ネットワークエミュレータ・C言語/Ruby用ライブラリで構成されています。
コントローラの具体的な作成方法は

辺りをご確認ください。
Post Rails と言われるだけあり、コントローラを作成してすぐ検証することが可能です。
コントローラプログラム(例:controller.rb)作成後は、ネットワークエミュレータ用の設定ファイル(例:network.conf)を作成して

trema run ./controller.rb -c ./network.conf

を実行するだけで検証することが可能です。 また、エミュレータ用の設定ファイルは

vswitch { dpid "0x1" }
vswitch { dpid "0x2" }
vhost "host1”
vhost "host2”
vhost "host3”
link "0x1", "0x2"
link "0x1", "host1”
link "0x1", "host2”
link "0x2", "host4”

のように書くだけで

Tremaネットワークエミュレータで生成されたネットワーク

のような構成をTremaが自動的にエミュレートしてくれます。
パケットを送るときには、

trema send_packets --source host1 --dest host2

などを実行することで簡単にパケットを送出することが可能です。

Open vSwitchについて

Open vSwitchはソフトウェア実装されたOpenFlowスイッチで、Linux上から見るとブリッジインターフェースのように見えます。
今回は、Tremaのエミュレータ機能ではなく、 KVMlibvirtQuagga (ルーティングソフトウェア)を用いてホストマシン上に下記のような仮想ネットワークを作成して検証を行いました。

作成した検証環境

この形に行きつくまでに、ブリッジインターフェースの挙動不安定だった・virtinstall時にOpen vSwitchをうまく接続できなかった・Linux Network NamespaceでQuaggaを動作させられなかったなどの越えられない壁に遭遇した歴史があります…

今回コントローラを作るにあたっての背景・問題点

自律システム(AS)間をBGPで繋ぐネットワークでは、間にIX(インターネットエクスチェンジ)スイッチを経由していることがあります。
また、そのIXスイッチ間では複数のリンクを束ねて冗長化と帯域確保を行っていると思われます。
そして、束ねられたリンクから使用するリンクを選択する際には、ハッシュ関数を用いてランダムに選択されています。

そういったIXスイッチ間でリンクが故障した際には、 リンク切断が検知出来ない故障(サイレント故障)リンク切断が検知できる故障 の2種類が存在します。
リンク切断が検知出来ない故障(サイレント故障) が発生してしまうと、BGPでneighborと通信するコントロールパケットが使用するリンクは疎通するのにデータパケットの使用するリンクが疎通せず、データパケットがロスしてしまうというが発生してしまうことがあります。

コントロールパケットとデータパケット経路の例

また、 リンク切断が検知できる故障 で故障リンクを避けた場合でも、切断されてしまったリンクに流れるはずだったパケットが他のリンクに流れてしまい、他のリンクの負荷が増加してしまいます。
そうすると、場合によっては各リンクで帯域のキャパシティオーバーによるパケットロスが発生してしまい、全てのサービスに影響してしまう結果となります。

例えば、下記の図のようにスイッチ間を10Gbpsのリンクが3本で構成されていた場合に合計21Gbpsのトラフィックが流れていたとします。

IX間スイッチのトラフィック超過の例

3本の状態では7Gbpsずつ割り振られて捌き切れていたものが、1本のリンクが切断されてしまうと2本のリンクにそれぞれ10.5Gbpsのトラフィックが流れることになります。
この状態では帯域を確保することが出来ない為、合わせて1Gbps分のパケットがスイッチによってドロップされてしまいます。

作成したコントローラの概要

背景を踏まえて作成したコントローラでは、通信するBGPルータのペアごとに使用するリンクを固定することで特定リンク切断時には特定のBGPルータ間の通信は制限するというコントローラを作成しました。
具体的な実装方法としましては、送信元MACアドレスと宛先MACアドレスを用いて

s_mac = Digest::SHA1.hexdigest(sourceMAC.to_s).hex
d_mac = Digest::SHA1.hexdigest(destMAC.to_s).hex
hashValue = Digest::SHA1.hexdigest((s_mac + d_mac).to_s).hex

のようにハッシュ値を求めることで、行き返り両方とも同じ特定のリンクを使用する実装を行いました。
現在の実装では、リンクの選定がハッシュで行われているため、場合によっては偏ってしまってパケットロスしまいます。
そのため、今後の課題としては割り当て情報をDB等に保存しておき、リンクの選定を動的に最適化していく必要があると考えています。

このような実装を行ったスイッチを使用することで、BGP neighborと通信するコントロールパケットとデータパケットの使用するリンクは必ず同一リンクとなるため、サイレント障害が起きる可能性がなくなります。
コントロールパケットが疎通せず、通信路が完全に遮断されたBGPルータは、BGPマルチホーミングによって迂回路を選ぶことができます。
また、この実装を行うことで他のリンクへの負荷が高くなることもなく、他のサービスへの影響を局所化できるというメリットも付随します。

作成したコントローラで制御した場合のIX間リンク切断時の様子

スイッチ間のリンク監視

今回、作成したOpenFlowコントローラにOpenFlowスイッチ間のリンク生存確認を行う機能を追加しました。
OpenFlowの

  • マッチするフローエントリがない場合はコントローラに問い合わせを行う
  • OpenFlowのPacket-Outメッセージ

という仕様を生かすことで20行足らずで簡単に実現することが可能です。
例として、1本のリンクを監視する具体的な手順は下記の通りになります。

  1. コントローラに一定間隔ごとにデータを付加してスイッチへPacket-Outメッセージを送らせます。
    • Packet-Outメッセージは指定したスイッチに対して、n番ポートから自由なデータを送ることが出来ます。
  2. すると、Packet-Outメッセージを受け取ったスイッチは指定されたポートからパケットを送信します。
  3. 対向のスイッチはマッチするフローがない為、コントローラへとそのデータを送ります。
    • Packet-Outメッセージを送る際に、送信元MACアドレスは使用されていないものを指定する必要があります。
  4. コントローラがデータを受信するとPacket-Inメソッドが呼ばれるので、最初に付加したデータと受け取ったデータからリンクが生存していることを確認します。
    • Packet-Inメソッドはコントローラがデータを受信した時に呼び出されるevent drivenなメソッドです。

スイッチ間のリンク監視の説明

ミクシィインターンに興味がある方へ

ミクシィのインターンに参加したこの夏は、とても有意義でした。
夏はクーラー付けた部屋でゴロゴロしがちですが、インターンに参加するとレベルアップ・スキルアップすることが出来ます。
夏だけでも自分の武器を一つ増やすことが出来ます。
いつミクシィのインターンに参加するか?今でしょ!

ミクシィインターンの概要

今年のミクシィのインターンは約15部署に約1名ずつのインターン生が配属される形で行われました。
僕は、結構人見知りをしてしまうタイプ……
入社前は溶け込めるのかドキドキでしたが、インターン生1人に対し1人のチューターさんが付くため、慣れるのに時間はかかりませんでした。
皆さんいい人ばっかり!
また、周りは凄腕エンジニアの方々ばかりなので、当然色々な知識を得ることが出来ます。
系統の違う様々な15部署から自分に合った部署を選べることも魅力の1つです。

インターンまでの道のり

来年度インターンに興味がある方が気にするであろう採用の話です。
15部署の中から第3希望までを記入したエントリーシートをWebから提出後、大体2回程度面接を行ってから採用の可否が決まるそうです。
また、1回目の面接のときに、やりたいことを聞いた上で各部署の詳しい説明などをしてくれます。
そのため、提出した配属部署の希望調査は絶対ではないので、興味を持った部署で登録した後に詳細を聞いて変更するといった形でも問題ありません。
また、いつの時も優しい人事部の方がそばでサポートしてくださるので、面接もさほど緊張しませんでした。

最後に

この記事はチューターさん最後の指令

  • ハテブ100目指してねw
  • 煽ってねw
  • 面白くねw

というインターン期間中最も難解なタスクを振り分けられ、
最大限の努力で実行した結果です(゚∀゚)アヒャ

最後にこの場を借りて。
インターン期間中にお世話になった皆様、とても楽しい日々でした!
本当にありがとうございました!