水深1024m

技術的なメモとか日記的なもの

MSPJ マイグレーションコンペティション2018winter で優勝してきた

ちょっと時間が経ってしまいましたが、2018/01/27 (土) に開催された MSPJ マイグレーションコンペティション2018winter に参加してきました。

日本MSP協会さんが主催しているイベントで、「古いシステムをいい感じに新しいものにマイグレーションする」コンペティションです。 2年ちょっと前に参加して負けて以来、また出たいなーと思っていたのですが、運良く日程が合い参加することができました。 今回は無事優勝することができました。引き続き開催していただきたいなあと思っておりますので、どういう感じだったかまとめたいと思います。

ルールとチーム

お題は変わらず「いま動いているシステムを新しい環境に移行して欲しい」です。 その他の条件を connpass から引用してみましょう。

- 要望的な何か
    - 今の環境を新しい環境に完全移行して欲しいです。
    - 実施した内容と結果については報告が欲しいです。
    - システムを止めるときは利用者に告知が必要なので連絡が欲しいです。
    - 昔から使っている古い環境なので、バージョンアップして欲しいです。
    - できれば利用者に影響を出さないように切り替えたいです。
    - できればサーバに関する資料があるとありがたいです。
    - できれば今はまったくバックアップを取っていないのでバックアップを取れるようにしたいです
    - できれば今後は利用者が増えるのでシステムを冗長化したいです。
    - できれば新しいインフラエンジニアに引継ぎするために必要な情報がまとまっていると嬉しいです。
- 担当者のコメント
    - 体制変更とかいろいろありまして、システムが分かる人がいなくなってしまいました。
    - 結構前から使っているので、いいタイミングなのでリフレッシュしたいなと思っています。
    - サイト上での商売は続いているので、できるだけ利用者さんに影響が少ないと嬉しいです。
    - そうそう、近々新しいインフラエンジニアが入社予定だから、その方に引き継げるようになっていると嬉しいですね。
    - 本当はいろいろとナウっぽいこともしていい感じにしていきたいんですよ。

これに沿うような問題が出題されます。

チームは当日ランダムなので、同僚と組んで出場!といったことはできないようになっています。 業界経験年数などをもとにチーム分けをしていくのですが、出場条件が30歳以下というところからもわかるようにかなり若く、28歳業界5年目の自分がチームでは最年長という形になりちょっと焦っていました。

Slack に運営との連絡用 channel ができており、そこを主に使うことになります。 短い時間で行うため、課題としていたことなどを忘れやすいため GitHub に private repo を作ってそこに課題を蓄積していくことなどもやっておきました。 基本的に ISUCON などと同様のコミュニケーションスタイルをやっておけばうまくいくと思います。 時間も前回と同じ 10:30 - 17:00 の6時間半。

お題

今回は EC-CUBE を中心とした EC サイトでした。 CentOS6 な Linux マシンの上に DB (MySQL 5.1) が同居しており、 Postfix, Dovecot といったメール環境が乗っていた点が厄介でした。

今回はこの環境がなんと AWS に乗っており、これを Azure に移行するという内容でした。Azure はほぼ使ったこともなかったので、適宜ドキュメントを参照しながらの戦いになりました。

開始して1時間くらいで内容を把握した上で設計を始めました。ここに時間をかけすぎた。。

設計

移行元も移行先もクラウドだし使えるサービスに特に制限はなさそう、かつ要求事項に色々夢のある話が書いてあれば、おれのかんがえたさいきょうのこうせい を作りたくなるものですが、 時間が限られておりあまり盛りすぎると時間が足りなくなることは目に見えていたのでぐっとこらえて最低限の要件を決め、その中で自然にできることを改善の対象として選びました。

  • CentOS6 を CentOS 7 に
    • epel, remi などの外部レポジトリには極力頼らない構成にする
  • ミドルウェア類のバージョンアップ
    • Apache 2.2 -> 2.4
    • MySQL 5.1 -> 5.7
      • MariaDB と悩んだけどソフトウェアのサポート状況を踏まえて MySQL にした
    • PHP 5.3 -> 5.4
      • できれば最新まで上げたかったけどちょっと厳しかった
    • Postfix, Dovecot など
  • 自動バックアップ

このあたりは達成したい事項として含めていました。

移行

メンバー間で担当を割り振り移行を進めました。それぞれ練度が高かったこともありお互い特定の作業を任せあえる状態になっていたのは良かったと思います。 自分は DB の移行などをやっていました。調べていくと root パスワードが運用の中で消失していたため (他のスクリプトに書いてあったらしいが。。) 、最初のメンテナンスは MySQL を skip-grants で再起動して root パスワードを回復するところから始まりました。

切り替えも当初はオンライン切り替えでいけるかな、と思っていましたが、作業時間や構成などを考えるとコストが高く、オンラインに拘って事故るよりはきっちりメンテウインドウを決めてその間で確実に移行しよう、ということで作業を進めました。 幸いにしてデータ量は多くなかったので mysqldump にかかる時間の見積もりをした上でまるごと移行することに。 このへんはざくざくやっていく。

システムの持ち主はあくまでお客さんですのでそれに留意して作業を進める必要があります。例えば以下のようなこと。

  • 予算
    • AWS で1サーバで動いてたシステムが Azure になった瞬間料金倍額になったらびっくりするよね
    • 実際聞いてみると予算状況は割と厳しく、サーバ自体を冗長化したり分割することはこの時点でいったん見送った
  • 使うサービス
    • RDS for MySQL 的なサービスは Azure だとまだ Preview だった
    • Preview でも使えるから選びたくなるけど、お客さんの環境に Preview 版のサービス突っ込むの厳しすぎる
      • 結構使ったチームは多かったらしい
  • お客さんの作業
    • 商品画像アップロードなどもあるサーバであることを考えると、移行漏れが発生するような要素は極力避けるべき
    • なので、変更が発生する業務 (商品作成, 設定やデザインの変更) を時間を決めて止めてもらった
  • 切り替え作業
    • なんのために、どのくらいの時間システムを止めるのか
    • どこにどんな影響があるのか
    • を明確に伝え、その中でやりきる

こんなことを考えつつ作業を進め、最終的に移行可能となったのは終了1時間前くらい。結構ギリギリでした。再起動耐性のチェックもここでやっておきました。 メンテ時間も無事狙い通りにおさまり、こちらでの確認とお客さんへの確認をしつつ問題なかったので旧環境を撤収 (料金がかかり続けるので地味に大事だと思った)。 あくまで環境は "後任に引き継がなければならない" のでドキュメントを早めに書き始めました。文書は Google Docs でそれぞれがーっと書き、最後に1人が体裁を整えるスタイル。

自動バックアップは間に合わないかな…と思っていたものの、Azure Backup が予想以上に素早く環境を作れるようになっていたため、こちらを使いました。

17時に Slack で最終的な資料を提出して終了。 懇親会で寿司などをいただきつつ結果発表があり、なんとか優勝をいただきました。

感想

第一回から運営の方も狙っているところではあると思いますが、「普段の業務でやっていること」を忠実に考えてやっていけば良い結果になるコンペティションなのだと思います。 ぱっと考えれば自明なことなんだけど、限られた時間やメンバー、予算でそれをちゃんとやっていくのは結構難しい。 さいきょうのアーキテクチャを競う会ではないというところは前回の敗戦から学んだ部分で、それを踏まえた方針がちゃんと機能して優勝まで持ってこれたという点はよかったなと思いました。

マネージャになって1年半が経ち、なかなか全力で手を動かし続けるというのも難しかったりするお年頃ということもあり、全力で1つのことに集中し続けられたのもこういう大会の良いところだと思います。良いトレーニングになりました。

環境の準備から参加チームからの問い合わせ対応まで、この大会の運営はたぶんめちゃくちゃ大変なんだろうなあと毎回思っているのですが、今回も非常にスムーズな運営で、余計なことに気を使わず楽しめました。運営いただいた日本 MSP 協会のみなさま、ありがとうございました。そろそろ出場条件的にも厳しくなるので、次回またぜひ出場して勝ち逃げとしたいなあと思う所存です。

いただいた賞金でとりあえず Anova を買いました。何も考えず温玉のせローストビーフ丼が作れておいしいです。

運営、参加者のみなさま、チームメイトの id:renjikari さんと okazaki さん、ありがとうございました。次回以降もぜひよろしくおねがいします。