ミクシィでインターンしてきました

今年の夏はミクシィの SRE としてインターンしてました. 主にモンスト周りの運用の改善を行いました. 楽しかったので,思い出を振り返りたいと思います.

mixi-recruit.snar.jp

選考

きっかけは皆様おなじみのサポーターズ 1on1 面談イベントです. 良さげなインターンのオファーを求めてそこで様々な企業の方とお話しする機会があったのですが, そのつながりでミクシィの人事の方と面談する機会がありました.

インターンのお話を伺う中で,参加者一人一人のやりたいことに向き合ってくれそうな雰囲気を感じて, 選考を受けてみることにしました.

SRE のインターンに参加したいことを伝えて,2回の技術面接を受け, その結果 CTO室 SRE グループに配属してもらえることになりました.

個人的に驚いたのは,面接の結果が出るのが幾ら何でも早すぎることです.笑 書類選考もどの面接でも,30分〜1時間で結果を伝えてくれました. インターン先は色々悩んでたのですが,最終的な決め手となったのはこの点です.

各社員の信頼関係と意思決定の速さが感じられて好印象でした.

インターン

配属先のメンターとの顔合わせがあり, 大規模なサービスに関わってみたいという私の希望を叶える形で, モンスト関連の仕事をするということを聞きました.

モンストは今までやっていなかったのですが, これを期に始めることにしました.

また,その顔合わせで,SRE として働く上での参考図書として, 以下の本を勧められました.

  1. SRE サイトリライアビリティエンジニアリング
  2. Clean Architecture 達人に学ぶソフトウェアの構造と設計
  3. リーダブルコード
  4. マスタリング TCP/IP 入門編
  5. Infrastructure as Code
  6. 入門 監視
  7. UNIXという考え方

3,4,6は読んだことがあったので, インターンまでに1,5,7を読んでみることにしました (2は時間がなくて読めませんでした >< そのうち読みます).

勧めていただいたどの本も本当に面白かったです. 特に感銘を受けたのは 5の IaC 本です. IaC といえば,まあ Terraform や CloudFormation みたいにインフラをコードとして管理するみたいな感じでしょ, 本に書くことなんてあるの??とか思ってたのですが,大間違いでした.

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス

  • 作者:Kief Morris
  • 発売日: 2017/03/18
  • メディア: 単行本(ソフトカバー)

インフラをコードとして管理することで, ソフトウェア開発の知見をインフラ開発に応用できることを説明した本で, インフラを VCS で管理したり,CI/CD したり,TDD したりするための ノウハウが満載でした.

Google の SRE 本もとっても面白くて, やっぱりこれから SRE がアツいなと再認識しました (逆に選考の時にこの本すら読めてなかったのに採用してくれたの感謝しかないです笑)

そんな感じで,インターンに参加するまでは大学の研究と インターン前のインプットに努めました.

インターン

オフィス

個人的な要望として,インターンはリモートじゃなくて オフラインでやりたいなーと思っていました. しかし昨今の情勢により,出社してのインターンは厳しいかも... と諦めかけていたところ,色々調整してくださって, オフラインでインターンに参加できることになりました.

関西の実家暮らしの民としては, インターンくらいしか東京で一人暮らしをする機会がないので, とっても嬉しかったです. また,渋谷スクランブルスクエアの新しいオフィスを満喫できてよかったです.

私が普段働いていたオフィスは SSS の34階にあって,見晴らしが最高でした. また,スープやコーヒーが飲み放題なのも嬉しかったです. 作業が行き詰まった時に,スープを片手にオープンスペースのソファで寛ぎながら 景色を眺める時間が好きでした笑

ただ,主にお世話になっていたモンストのサーバーチームの方々がフルリモート勤務だったので, オフィスでリモートワーク(?)をしてる感じでした.

業務内容

リアルタイムメッセージングサーバーの改善

モンストと一口に言っても,それを支える色々なサービスがあります. その中で私がメインに扱ったのは,モンストのサーバーからユーザーへの リアルタイム通信や,ユーザー同士のリアルタイムメッセージングを提供する WebSocket サーバーです.

これを改善しようというのが私のメインのタスクでした.

ログレベルを設定ファイルから柔軟に設定できるように機能追加

初めは簡単なタスクをこなして慣れていこう,ということで簡単なタスクから. 現状の実装ではロガーの設定がデフォルトでしか使えなかったので, これを柔軟に設定するための機能を追加しよう,という内容でしたが, これがなかなか苦労しました.

リモートワークで質問しづらい状況だったため, 既存のコードの構造を読み解くのにも一苦労です. はっきり言ってあまりにわからなさすぎて絶望していました. それでも,メンターの方々が要領を得ない私の質問にも粘り強く答えてくださったおかげで, なんとか実装できました.

カナリアリリースの導入

現状のリリースフローでは,Kubernetes で書かれたリソースを kubectl apply -f みたいな感じで単純にアップグレードしていました. しかしこれだと,もしアップグレードしたバージョンにバグがあった時に, 全ユーザーに影響が出てしまいます. ステージング環境でしっかりテストするとはいえ, プロダクション環境でしか起こらないバグもあり得ます.

そこで,カナリアリリースを導入することにしました. これにより,プロダクション環境で動いている 古いバージョンのアプリケーションとは別の環境(カナリア環境)に 新しいバージョンをデプロイし, ごく少数のリクエストをカナリアに振り分けて動作を確認することで, より安全にリリースできるようになります.

今回のインターンでは, カナリアリリースの手順をサポートするコマンドを実装したり, リクエストの振り分けロジックを書いたりしました.

このカナリアリリースは, 初めから仕様が決まっていたわけではなく, できるといいよね,みたいな感じの issue があっただけでした. そのため,カナリアリリースを実現するための方法や 導入するソフトウェア(Istio や Spinnakerなど)の調査を行い, いろんな方々にアドバイスをいただきながらやり方を決めていきました.

そのような作業を通して, 仕様を決めながら機能を追加したり, 技術選定を行う体験ができました.

メモリ消費量の削減

この WebSocket サーバーは Golang で書かれていたのですが, ある処理を行うたびに goroutine が一つずつ増えていく という実装になっていました. goroutine は一個増えるたびに少なくとも数KBのメモリを消費します. goroutine が数個増えても問題になりませんが, モンストの場合,数百万ユーザーが同時に使用することを想定しなければならないので, 現状の実装では非常に多くのメモリを必要とする可能性がありました.

そこで,チャンネルや goroutine をうまく使いまわすことで 新しく goroutine が生成されることを防ぐようにしました. これによって,メモリ消費量が急増する要因が一つ減り, より平和になりました.

データセンター作業

モンストの一部はオンプレで動いています. せっかくなので,データセンターの運用作業を 体験させていただけることになりました.

データセンターは思ったよりもずっと強固なセキュリティで守られており, テロ対策がしっかりと取られていて驚きました.

作業としては,サーバーの部品の交換・増設を行いました. 今まさに本番環境で動いているDBのラックを触る必要があり, 一つでも間違えたらモンストが即緊急メンテに入るよ って(軽く)脅されていたこともあって,緊張感のある作業でした笑

しかしその分貴重な体験ができてとても有意義でした.

感想

今まで参加したインターンでは, 修羅場を経験することが多かったのですが, 今回は大きな修羅場もなく, 楽しく平和にインターンすることができました笑

夜に集まって飲み会や懇親会は残念ながらできなかったのですが, お昼に美味しいランチに連れて行ってもらえたりして, 温かい職場でした.

また,かねてより興味のあった SRE のような作業もすることができ, あまり使ったことのなかった KubernetesGolang などのツールを勉強できたり, 丁寧なコードレビューを受けることができたりして学びも大きかったです.

苦労したのは,全社的にリモートワークを行っており, 自分の今取り組んでいるタスクに詳しい人に気軽に質問などができなかったことです.

もちろん Slack や GitHub で質問を投げると丁寧に教えてもらえるのですが, 新しい issue に取り組むときは,そもそも何を質問すればよいのかわからず困っていました.

僕の場合は,ちゃんとした質問の形ではなくても, とにかく何かメッセージを送らないとどうにもならないことに気づいたので, Slack や GitHub に現状の理解度を書いて反応をもらえるようにしたりしていました.

ただ,メンターの方が出勤していて, 気軽に質問できる時の方がすぐに問題を解決できたので, 文脈を知らない状態でリモートワークってやっぱり難しいなあ と感じました. これに関しては仕方ないですね. それでも,何人かの社員の方は毎日出勤してくださって, たまに雑談に付き合ってもらえたりして, 僕が寂しくならないように配慮してくれていて嬉しかったです笑

今回の経験を生かして,今後も頑張っていきます! それでは!

追記(2020年10月26日): インターンの成果をミクシィのテックブログでまとめていただきました (nobutadaさん本当にありがとうございます😭).

medium.com

本記事では,私の文章力不足により,技術的な詳細が伝わらなかったと思いますが, テックブログの記事では,コードも交えて非常にわかりやすく解説されていますので, ぜひご一読ください!

実際に、最後のパフォーマンスチューニングは2つ目のカナリアリリースを利用してリリースしました。 すごく便利です。ありがとうございました!

嬉しい...こちらこそ本当にありがとうございました...!