🧑‍💻

PIXIV SUMMER BOOT CAMP 2022 インフラコースに参加してきました

2022/09/09に公開

PIXIV SUMMER BOOT CAMP 2022 インフラコースに参加してきました

8/17~8/26 の 8 日間、PIXIV SUMMER BOOT CAMP 2022 のインフラコースに参加してきました。

技術職向け夏インターンシップ「PIXIV SUMMER BOOT CAMP 2022」参加者募集のお知らせ

応募

エントリーには、通常エントリーと GitHub エントリーがあり、僕は GitHub エントリーで応募しました。普段から GitHub を使っていて、開発の様子を見せられるようになっていたので、せっかくならこれでエントリーしてみようと思いました。

GitHub 選考のレベル感は、GitHub 選考で通過していた方や、通過していたよと言われた方の記事を参考にしていました。

自分が話せるリポジトリをピン留めし、その内容が分かるように整備をしていたつもりです。選考を通過できた GitHub アカウント (@Hiroya-W) の 1 つとして参考にしてください。

また、GitHub 選考であったとしても、ES 内で自分が何をやってきたのかを埋める項目はありました。今まで参加したコンテストやハッカソン、バイト経験など書ける項目は URL と合わせてたくさん書きました。

pixiv での選考に限らず、自分が開発経験あることのアピールとして、面接時の話のネタとして質問されやすいし、自分も答えやすくなるので Win-Win だと思います。

面接

Google Meet を使ってオンラインで面接しました。ES でも書いていますが改めて、どういったことやってきたのか、から話を深堀りしていったような話をしたと思います。

また、面接の時間に、コーディングテストも含まれています。過去の参加記事を読んでいるとオフラインで面接された方はホワイトボードで書いている様子を見かけますが、それのオンライン版って感じです。

好きな言語を使っても良いということだったので、普段良く使っている Python で書きました。書けるか、も大事ですが、思考の部分も話せると良いです。分からないところがあっても、「こういったことをやりたくて、こういった方法で出来たと思います」と話ながら書き進めれば OK でした。

pixiv では PHP をよく使っている印象で、自分は PHP を書いた経験が少ないので大丈夫かなと思っていましたが、特に聞かれませんでした。インターンの課題の内容からも PHP 以外で少なくともプログラミング言語が使えれば問題ない、という感じだったのかな、と思います。

課題内容

インフラコースでインターンに参加していて、取り組んだ課題の内容はこのような感じです。

  • 各テーブルのカラム上限値監視スクリプトの作成と可視化
  • MySQL の master 昇格自動化検討と実現

課題に対するモチベーションとして、期間中に聞いた話は概ね公開されているようなので、スライドも参考になると思います。

各テーブルのカラム上限値監視スクリプトの作成と可視化

MySQL にある AUTO INCREMENT のカラムは、そのカラムタイプ(INT, BIGINT)で上限値があり、上限値に達したテーブルには新たにデータを INSERT できなくなってしまいます。ALTER TABLE でカラムタイプを変更する、というのは単純な話ではなく、大きなテーブルに対しては変更に時間がかかってしまいます。

そのため、余裕を持って対応出来るように、日々監視しておきたいというモチベーションです。スライド P.49 を見てみると、並列に処理して対応する方法が確立されているようです。監視は、Datadog を使って可視化することで行います。

MySQLのmaster昇格自動化検討と実現

MySQL データベースサーバのデータを複数の MySQL データベースサーバに複製する、レプリケーションが設定されています。レプリケーションにおいて、master に障害が発生した時などに slave を master に昇格させる作業を自動化したい、という課題です。

迅速な障害復旧のため、属人化しないためにも自動化出来ると嬉しいというモチベーションですが、よく考えると気にしなければいけないことが山ほどある課題です。スライドでは P.22 あたりからある master 昇格の手順ですね。自動化を実現するために、使えそうな構成方法、自動化しやすいようにするにはどうするべきか、といったことを考えていきます。

インターン開始!

オフラインで参加していましたが、絵馬が飾ってあったり、吹き抜けのオフィスで端から端まで 1 つに繋がっているテーブルなど、どこ見ても楽しい感じでした。

ノベルティ

インターン生用パーカーを含むノベルティもいくつか頂いていて、インターン期間後半はずっとパーカーを着て作業していました[1]

開発環境

期間中は M1 Macbook Air をお借りして作業していました。M1 Macbook、初めて触ったんですが、あまりにもサクサク動いて快適で欲しくなりました。開発環境としてはディスプレイも用意されていて、後は自分で持ち込んだ HHKB という感じです。

メンターの dekovoko さんも HHKB を使われていて、他にも(自作っぽい?)分割キーボードを使っている社員の方も見かけました。Slack でもキーボードの話で沼みたいな話が飛び交っていたので、話してみたかったです[2]

Slack にも招待されますが、Notion にも招待されます。インターン期間中の作業ログなどは Notion のカンバンを使ってチケットを切る、そこにまとめていく、というやり方を取っていました。

1日目

出社後、まずはインターン期間中のスケージュールの説明を受け、秘密保持契約の手続きをします。この時、各コースにインターン生は 1 人しかいないことを知って驚いたのと同時に、8 日間頑張ろうって気合を入れ直しました。

それが終わればメンターさんと顔合わせをして、作業を進めていきます。

  • 開発環境のセットアップする。
  • 同じタイミングでインターンに参加していた他のインターン生とそのメンターの方とランチに行く[3]
  • オフィス見学をする。
  • pixiv のベニヤ機サーバを見に行く[4]

最近はクラウドを活用することが多く、あまり物理サーバを意識していなかったんですが、やっぱり物理サーバがあるんだな、って気持ちになりました。当たり前ですが。

この後は、課題の説明、課題を進めるためのキャッチアップなどをしていただいた後に、実際に課題に取り組んでいきました。

  • 現状の pixiv の MySQL データベースサーバの運用方法について勉強する。
  • 3 台の MySQL サーバを使って実際にレプリケーションの設定をやってみる。

2日目~6日目

2 日目からはゴリゴリと課題を進めていきます。

  • AUTO INCREMENT の値を取得するクエリを作る。
    • このようなクエリになりました。
SELECT
   col.TABLE_SCHEMA,
   col.TABLE_NAME,
   col.COLUMN_NAME,
   col.COLUMN_TYPE,
   tab.AUTO_INCREMENT 
FROM
   information_schema.columns AS col 
   JOIN
      information_schema.tables AS tab 
      ON col.TABLE_NAME = tab.TABLE_NAME 
WHERE
   col.extra = "auto_increment" 
   AND col.TABLE_SCHEMA NOT IN
   (
      "information_schema",
      "performance_schema",
      "sys",
      "mysql"
   )
;
  • Python から pixiv の全 MySQL master サーバに接続して、クエリを投げられるようにする。
  • Datadog カスタムチェックを利用して、Datadog にメトリクスを送信出来るようにスクリプトを調整する。
  • 作成した監視スクリプトをデプロイするように Ansible Playbook に追記する。
  • Datadog ダッシュボードでの可視化方法の調整する。
    • ダッシュボードでは、3 つのウィジェットを用意して、それぞれに BIGINTUNSIGNED INT(SIGNED) INT のカラムタイプの値を可視化する。
      • カラムタイプごとに上限値が異なるので、UNSIGNED INT だと思っていたら、SIGNED INT でした、という誤解を招かないようにする。
  • INFORMATION_SCHEME にアクセスする際の懸念点を調査する。
    • 調べてみると、MySQL 5.5 から 5.6 でデフォルト値が変更されている innodb_stats_on_metadata があったり[5]、MySQL 8.0 では INFORMATION_SCHEME のデータがキャッシュされる[6]ようになったりしています。
    • こういったものが影響していないか、ドキュメントや MySQL のソースコードから挙動をまとめて、要件に合うように対処しました。

インターン期間中に一部の本番環境で適用まで行い、しばらく監視と検証している段階です。問題が無ければインターン後には本格的に動かすことになるようで、残すものが出来て嬉しいです。

7日目午前

  • 2 つ目の課題の調査と、調査出来たことをまとめる。

2 つ目の課題に対しては、4 日目や 5 日目の合間から少し調べ始めていて、気になっていたところをもう少し調べなおし、まとめる時間にしていました。

master 昇格の自動化のためにまとめた内容としては、このような感じです。

  • MySQL MHA を使った master 昇格について調べる[7]
  • ツールを使わず、自分たちでスクリプトを用意する場合に自動化しやすい方法として使えるもの
    • 非同期レプリケーション / 準同期レプリケーションのメリット / デメリット
    • ポジションベース / GTID ベースのメリット / デメリット

1 つ目の課題が思った以上に良い内容でほとんどの作業時間を使ったため、2 つ目の課題に取り組んで検証するところまで余裕はありませんでした。機会があれば、検証の部分を続けてやってみたいです。

7日目午後

最終日の成果発表のため、スライド作成を進めます。

8日目(最終日)

引き続きスライドの作成を進めていました。発表は 17 時からなので、それまでにメンターさんにレビューしていただいて修正したり、通して発表時間の調整をしていました。

発表時間は 10 分間なのですが、その中でやったこと、なんでそうしたのか、どうやってやったのかなど、話すことの取捨選択はアドバイスを頂いて無事収まりました。ありがとうございました...!

成果発表では、同じ 8/17~8/26 の期間で参加していたデータ分析コース、VRoid コースのインターン生の発表が同時に行われました。良い発表だったし、モリモリの成果があった様子を感じて、インターン生のレベル感を感じていました。

業務以外で

課題に取り組むだけでなく、いろんな場面で話をさせていただく機会がありました。技術や仕事の話をはじめ、趣味の話まで出来る環境はとても良かったです。

  • ランチ
  • お茶会
  • 面談
  • エンジニア勉強会
  • 金曜日仕事終わりのオフィス[8]

さいごに

インターンの案内に、以下のように書かれていますが、

「PIXIV SUMMER BOOT CAMP 2022」では、大きく分けて4つのコース(全17コース)を用意し、本番環境のAPIを叩き、レビューをうけながら、実際に普段から社員が行っている業務にチャレンジすることができます。

インフラコースでも本番環境を見に行ったり触ったりさせていただき、インターンでそこまでやらせてもらえるんだと驚きました。

本番環境で動かしても問題無いように、生半可なスクリプトや設定は入れられません。また、本番環境で動かしても大丈夫なように、これをするとどうなるのか、サービスへの影響はあるのかをイメージする必要があります。そのために、事前にしっかり検証していく大切さを強く感じる機会になりました。普段は、動かしてから様子見ようかな、動かなかったら直していこうって感じでやっていました。これがインフラであれば、サービス障害を簡単に起こせてしまう可能性があって、慎重にならないと、と考え直しました。

また、MySQL データベースサーバの運用を中心に、pixiv のインフラがどうなっているのかを沢山見せていただきました。今、自分が使える技術が業務でどう使われているのかを見ることが出来ただけでなく、知らなかった技術はもちろん、知っていたけど使ったことが無かった技術や、今までよく分からずに使っていた設定にも触れることができました。インターン期間中に多くの技術を身につけて帰ってきたと感じています。

メンターの dekovoko さん、インフラ部の皆さん、ありがとうございました。
充実した 8 日間のインターンでした。

https://twitter.com/Hyuyu_kun/status/1563127383678656512?s=20&t=X-vusaAqwpJtgXXfReizUA

脚注
  1. ダンボール箱に入った状態で頂いたのですが、東京から持ち帰る時に中身だけにして持って帰ってきて写真撮りました。 ↩︎

  2. 僕はキー配列を変えているので、この HHKB を持ち込むか、何らかの方法で配列を変えられないと、就職した時に QWERTY 配列にまた戻さないといけなくて辛いなって思ってたのでいい話です。 ↩︎

  3. pixiv リクエスト、データ分析コースの子とご一緒しました! ↩︎

  4. ベニヤ機サーバはココらへんの写真のやつですね。楽しかったです。 ↩︎

  5. https://dev.mysql.com/doc/refman/5.6/ja/innodb-parameters.html#sysvar_innodb_stats_on_metadata ↩︎

  6. https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry ↩︎

  7. mha4mysql-managermha4mysql-nodeによって、master に障害が発生した時に自動的にフェイルオーバーする仕組みを実現できるようです。 ↩︎

  8. 26 日の夜は集まったメンツで、にじさんじ甲子園 2022 エキシビションを見ていたようです。帰りの新幹線の時間が無ければ、僕も一緒に見たかったです...。 ↩︎

GitHubで編集を提案

Discussion