Quizlet、Memorystore で Memcached ワークロードの費用を半減
Google Cloud Japan Team
※この投稿は米国時間 2021 年 3 月 2 日に、Google Cloud blog に投稿されたものの抄訳です。
編集者注: 今回は、教師や生徒向けに学習リソースを提供しているオンライン学習コミュニティ、Quizlet にお話を伺います。Quizlet は、Memcached ノードをより安全かつ便利にスケールできるソリューションを求めて Memorystore に移行しました。
毎月 5 千万人以上のユーザーが利用する Quizlet は、世界最大級のオンライン学習プラットフォームです。デジタル フラッシュカードと練習問題、インタラクティブな図やグラフ、ゲームといったインテリジェントな学習ツールを幅広くそろえて、生徒にも先生にも役立つサービスを展開しています。Quizlet は 2015 年に Google Cloud への移行を開始し、BigQuery や Cloud Storage などのデータクラウドのテクノロジー ソリューションを追加しました。
サイト信頼性エンジニア(SRE)の間で「Memcached(オープンソースの分散型メモリ キャッシュ システム)がダウンしたら Quizlet も共倒れになる」と言われるほど、Quizlet では Memcached の存在が不可欠なものになっています。しかし Memcached は揮発性キャッシュ システムであり、そのノードを管理するためのスケーラブルなソリューションが必要でした。そこで利用したのが Google Memorystore for Memcached です。結果、サービスを中断させることなく管理作業を行えるようになり、しかも費用は半分になりました。また、Memorystore に移行することで SRE チームの負担が大幅に削減され、パフォーマンスも全体的に向上しました。
Quizlet での Memcached ユースケース
Quizlet では、比較的シンプルな形で Memcached を使用しています。たとえば、Quizlet ではユーザーが「学習セット」を作ることができます。これは学習する単元の内容を用語や定義とともにまとめたもので、通常は図や録音データなどから構成されており、これらはそれぞれ個別のデータベースに格納されます。セットが初めて読み込まれる際は、さまざまなデータベースからデータが取得されます。それらのデータをユーザーが見やすい形に整え、その状態で Memcached に格納して、ユーザーにすばやく提示できるようにしています。
Memorystore に移行する前の Quizlet のデータ インフラストラクチャでは、Google Compute Engine 仮想マシン上で Memcached を稼働していました。Memcached プール内の各ノードの管理は Puppet で行い、キャッシュ方法は Ketama によるコンシステント ハッシュ法を採用していました。追加の容量が必要になった場合は新しい Memcached ノードを立ち上げるのですが、この作業が非常に複雑でした。新しい VM をスピンアップしてから構成を追加し、OS を読み込んで Memcached のバイナリを実行する必要があり、毎回 20~30 分かかっていました。
レガシー インフラストラクチャの問題点: 当て推量の多さ
スケーリングは難しい作業でした。たとえば、トラフィック量がピークになる新学期シーズンを迎える前に、毎年のように予測トラフィック量を計算し、Memcached リソースが十分なのかそれとも追加する必要があるのかを判断する必要がありました。この作業には常に当て推量が必要になります。また、実際にメンテナンスが必要となれば、手作業で対応する必要がありました。たとえば、VM を複数リージョンで維持するために Memcached VM を pull して他のリージョンに移動させるなどといった作業が必要になります。このように以前の環境では、スケーリング、アップデート、パッチの適用のいずれも極めて難しく、時間のかかる作業になってしまっていました。
SRE チームはそのせいで疲弊しており、Memcached レイヤ構造の信頼性も低く、積極的に触りたいと思う人は誰もいませんでした。Memcached は本来一時的なキャッシュであり、機能している間は特に問題ありません。しかし Memcached が終了すると quizlet.com も終了してしまうため、どうしても必要なとき以外は誰も触らないようにしていました。そのような信頼性の低いインフラストラクチャは、大きな問題につながりかねません。
Memorystore を試す
Quizlet ではウェブ インフラストラクチャのスケーリングでも同様の課題を抱えていたため、全社的にマネージド サービスの導入を増やす方向で戦略が固められていきました。たとえば、以前は自社で VM を実行していましたが、今ではコンテナ システムに切り替えています。その際に、ウェブサービスを Google Kubernetes Engine(GKE)に移行しました。
移行の一環として、可用性やスケーラビリティの確保、パッチ適用、モニタリングなどといった複雑な Memcached タスクを自動化できる Memorystore for Memcached の評価も行いました。Memorystore のテストは 3 段階に分けて実施しました。第 1 段階は、開発環境での読み込みテストと、Memcached VM のと比較です。結果、パフォーマンスは多少落ちるものの問題になるほどではないことを確認できました。第 2 段階ではステージング環境の Memcached プールに Memorystore ノードを 1 つ追加してみました。特に問題は発生せず、ノードに互換性があることを確認できました。最終段階では Memorystore クラスタを作成し、ノードを 1 つ本番環境に置いて、同プール内の 24 の VM とパフォーマンスを比較しました。結果、あらゆる処理がスムーズに実行されたのです。
Memorystore で費用の低減とフットプリントの拡大が実現
Memorystore は、細かな調整をしなくてもそのままで Quizlet のニーズを満たしてくれました。当時の私たちは、Memcached インフラストラクチャの入れ替えには困難な移行作業が伴うことを覚悟していました。ところが Memorystore for Memcached には互換性に関する問題がまったくなかったため、そのような作業は必要ありませんでした。GCE で Memorystore ノードを立ち上げ、Memcached VM をシャットダウンするだけで完了したのです。これで、全体の移行も問題なく完了できるという確信が得られました。
ありがたいことに、Memorystore は Google Cloud のオペレーション スイート(旧称 Stackdriver)のモニタリング機能と統合されています。そして、その指標を見ると、使用するノードは想定よりも少なくてよいことがわかりました。もともと Quizlet では、40~50 GB の Memcached VM を 24 インスタンス稼働させ、合計で 1 TB のキャッシュを確保していました。現在もキャッシュのサイズは 1 TB ですが、デプロイしている Memorystore ノードは 6 個だけで、使用率もわずか 15~20% 程度で推移しているため、運用の負荷は大幅に軽減されました。そのため、トラフィックの急増や想定外のトラブルに対する復元力が高まったと感じています。
カットオーバーは、Memorystore ノードを 1 つずつ本番プールに追加して実行し、数日間様子を見るという手順で進めました。Quizlet のサービス提供に問題がなければ、VM ノードを 1 つ取り外します。数週間で VM ノードは最後の 1 つになりましたが、問題はまったく生じませんでした。最後の VM ノードも、今から数か月前にシャットダウンしました。
この移行でメモリの使用量が大幅に減り、費用も半分に削減できました。現在では所有している容量の 4 分の 1 しか使用していないため、費用をさらに減らそうと思えばそれも可能です。とはいえ特に問題は発生しておらず、他のプロジェクトもあるため、そのままにしてモニタリングを続けるつもりです。Memorystore for Memcached レイヤのおかげで、少なくとも次の新学期シーズンまでは安心できます。
移行の結果
Memorystore に移行したことでスケーリングがはるかに容易になり、SRE チームのストレスも大きく減りました。また、費用削減、フットプリントの拡大、Memcached の運用にかかる時間の低減に加えて、Memorystore は Google Cloud オペレーション スイートと統合されているのでモニタリングも簡単にできるようになりました。まず、しきい値を設定してアラームを発信することができます。さらに、すぐにダッシュボードを作成し、信頼性の高い数値を簡単に得ることができます。社内で管理していた以前の環境では、Memcached の使用レポートで正確な値が得られない場合があり、64 GB を積んでいるマシンのメモリが 58 GB 使用済みと報告されることもありました。本当にそれだけのメモリが使用されているかどうかを知ることは難しく、しかも、もしそのとおりであればビジネスに壊滅的な影響が及ぶ可能性があります。ですから、信頼性の高いモニタリングができることも、Memorystore への移行を後押しする要因の一つとなりました。
Memorystore が有効であることがわかった今では、既存の一元的なキャッシュ デプロイメントを、将来的にサービスごとあるいはグループごとの構造に移行させていくことができないかと考えています。
Quizlet は社員の心身の健康を大切にしています。その意味で、Memorystore への移行は SRE チームにとって大きな意味を持つイベントでした。Memcached を社内で管理していたときは、災害は「起こるかどうか」ではなく、起こることが前提にあり、それが「いつ起こるか」の問題だと感じられていました。しかし今では Memorystore の信頼性とマネージド サービスのおかげで、ユーザーとビジネスに向けた新しいソリューションのために思考とエネルギーを使うことができます。
Quizlet で提供している生徒および先生向けの学習リソースをぜひご参照ください。また、Memorystore の機能についてもあわせてご確認ください。
-Quizlet サイト信頼性エンジニア Mason Leung