カミナシ エンジニアブログ

株式会社カミナシのエンジニアが色々書くブログです

【登壇資料】Startup Issue Gym #3【AWS活用におけるIssue】に登壇してきました

f:id:kaminashi-developer:20211227190138j:plain

カミナシ・エンジニアリングマネージャーの @dmi8a です。

先日行われた Startup Issue Gym #3【AWS活用におけるIssue】 にて「カミナシレポートが辿り着いたメンテナンスモードのあり方」というタイトルで発表してきました。

概要

カミナシは、フロントエンド: SPA(S3 + Cloudfront + etc.)、
バックエンド: API(ECS (Fargate)+ ELB + etc.)といった技術で構成されています。

SPA以外にmobileアプリも別途存在し、mobileアプリについては24h/365日利用される前提のため、 メンテナンスモードのあり方について従来より悩んでいました。

本登壇では、その悩みの末に辿り着いた、カミナシレポートのメンテナンスモードのあり方について共有させていただきました。

speakerdeck.com

結論

メンテナンスモード中、Web(管理者向け)は 全操作不可とし、アプリ(現場向け)は オフラインモードにて利用可能 としました。

gyazo.com

メンテナンスモードの設定

カミナシのインフラ構成概要は以下の通りです。

gyazo.com

ELBのfixedレスポンス活用 + Lambda、および、MySQLinnodbオンラインDDLを併用する事でメンテナンスモードを実現しています。

gyazo.com

ELBのfixedレスポンス活用 + Lambda

カミナシでは、ELBのリスナールールを変更する事でメンテナンスモードを開始します。

具体的には、優先順位の最後にある行の「転送先」を事前にLambdaで作成したターゲットグループに変更します。

gyazo.com

Lambdaに記載された固定のHTTPレスポンス内容 + statusコードを返す事でclient側にメンテナンス中と認識させます。

gyazo.com

MySQLinnodbオンラインDDL

最も苦慮したのが、mobileアプリの「24h/365日利用可能」という要件の達成です。

こちら達成のためには、メンテナンスモード時に行う事が多い Alter table系処理 と mobileアプリのHTTPリクエストから発行されるSQLの同時実行を達成する必要があります。

transactionを貼ったSQL処理が実行された状態で Alter table系処理を流すと、容易にDBがデッドロックされてしまいサービスが止まってしまうリスクがあるため、そのリスクをどう回避するかに頭を悩ませました。

この用件をクリアするため、innodbというストレージエンジンを利用したMySQL 5.6以上にある「オンラインDDL」という機能に着目しました。

この「オンラインDDL」がある事で、Alter table系処理でテーブル定義の変更中に、SELECT/INSERT/UPDATE/DELETEに関する処理が継続できるとされていました。

gyazo.com

調べたところ、カラムデータ型変更、プライマリーキー削除、パーティション作成/追加/削除を除けば、Alter table系処理中でもmobileアプリからHTTPリクエストが来てSQLが発行された場合でも耐えられうる可能性がある事に気づきました。

gyazo.com

さらに調査を進めたところ、「Waiting for table metadata lock」が発生しないか、「innodb_online_alter_log_max_size」を超えるほど処理時間の長いものが流れないか、この2点をクリアできる場合はAlter table系処理とサービスからのリクエストの同タイミングでの実行を許容できるという結論に至りました。

結果、mobileアプリのオフラインモード + メンテナンスモード時はELBに流れてくるHTTPリクエストの総量削減 + MySQLinnodbオンラインDDLを併用、の3点を持って、mobileアプリの24h/365日利用の要件を達成しました。

gyazo.com

注意点: データが多くなって上記手法で対処できなくなった場合

データ数が多くなってくると、検証時点でAlter table系処理時間が長すぎて失敗するようになります。 その場合は、以下の通りレプリケーションを利用するしかなくなってきます。

gyazo.com

まとめ

現在はまだデータ数が少ないため、今回発表させていただいた手法を持ってメンテナンスモードが実現できました。 我々のように、まだスタートアップの初期フェーズ〜ミドルフェーズくらいまでであれば、リリースや検証コストが節約できると思いますので、そういった企業様に少しでも参考になれば幸いです。

最後に宣伝になりますが、カミナシでは、アプリエンジニア/SREと幅広く募集しております!

少しでも興味を持っていただいた方からのご応募お待ちしております!

careers.kaminashi.jp