Google Cloud Memorystoreで60倍のパフォーマンス向上を体験
IT技術
GCは紫の箱、こやまんのキャッシュ戦略体験記録へようこそ
皆さんこんにちは。
最近、Google Cloud Platform (GCP) が「GC」と呼ばれるようになっていることを知って、衝撃を受けてしまった小山こと"こやまん"です。
GCといえば、「ゲーム○ューブ」が真っ先に浮かんできますよね。よく兄弟喧嘩で鈍器と化してました。
さて、今回のブログでは、Google Cloudの「Memorystore」と呼ばれるサービスについて、速度向上体験をご紹介したいと思います。
キャッシュ戦略の基礎知識: サービスを高速化する方法
まず、Memorystoreについて触れる前に、キャッシュ戦略について確認しましょう。多くのウェブサービスは、レスポンスが早いとユーザーに喜ばれます。キャッシュ戦略は、ウェブサービスのパフォーマンスを上げる重要な方法です。データやリソースを一時的に保存し再利用することで、サーバーの負荷を減らし、応答時間を短くします。
キャッシュ戦略のメリット
- 応答時間の向上
キャッシュを使うと、データの取得が速くなり、待ち時間が短くなります。 - 負荷の軽減
サーバーへのリクエストが減るので、サーバーの負荷が軽くなります。 - コストの削減
サーバーリソースの効率的な利用で、運用コストが減ります。
しかし、キャッシュ戦略を誤って実装するとデメリットもあります。
キャッシュ戦略のデメリット
- データの整合性の問題
キャッシュが更新されないと、古いデータが表示されることがあります。 - キャッシュの管理コスト
キャッシュの設定やメモリの管理にはコストと手間がかかります。 - コストの増加
キャッシュを使うとコストが増えることがあります。
キャッシュ戦略を成功させるには、何をキャッシュし、何をキャッシュしないかを慎重に見極めることが重要です。正しい設計と管理で、キャッシュ戦略のメリットを最大限に引き出せます。
Memorystoreを使ってキャッシュ戦略を実現しよう
Memorystoreは、Google Cloudが提供するフルマネージドのインメモリデータストアサービスです。RedisおよびMemcachedをサポートしています。
どちらもキャッシュに使えますが、どちらを使うべきか迷うかもしれません。一般的に、リストやハッシュなど多様なデータ構造をサポートし、永続化機能もあるRedisが柔軟に対応できます。一方、より高いパフォーマンスとシンプルなキャッシュ用途にはMemcachedが適しています。
Memorystoreのコスト比較: 実際のコストから高額まで
東京リージョンでMemorystoreを使用する場合の費用を見てみましょう。料金計算ツールを使って、最も安い設定、実際に使用する設定、最も高い設定の費用を算出しました。(注:1ドル157円で計算)
Redisの費用見積もり
まず、最も安い設定の費用です。
- ティア: 基本
- 容量: 1GB
- 確約利用: 3年
1ヶ月の費用: 4,569円
次に、実際にお試しで使用する場合の費用です。
- ティア: 基本
- 容量: 1GB
- 確約利用: なし
1ヶ月の費用: 7,449円
最後に、最も高い設定の費用です。
- ティア: スタンダード
- リードレプリカ: 5
- 容量: 300GB
- 確約利用: なし
1ヶ月の費用: 約400万円
Memcachedの費用見積もり
次に、Memcachedの場合です。
- ノード: 1
- メモリ: 1GB
- コア数: 1 vCPU
- 確約利用: 3年
1ヶ月の費用: 4,785円
さらに、実際にお試しで使用する場合の費用です。
- ノード: 1
- メモリ: 1GB
- コア数: 1 vCPU
- 確約利用: なし
1ヶ月の費用: 7,977円
最後に、最も高い設定の費用です。
- ノード: 20
- メモリ: 256GB
- コア数: 32 vCPU
- 確約利用: なし
1ヶ月の費用: 約1100万円
Redisに比べ、Memcachedはやや高めの価格設定ですが、1ヶ月お試しで利用する場合、為替レートによりますが、約8,000円程度です。ただし、高性能なリソースを無邪気に作成して放置してしまうと、高額な請求が発生し破産まっしぐらなので注意が必要です。
Memorystoreの実力検証: パフォーマンスをチェック
Memorystoreを実際に利用してみます。今回はRedisを利用します。
Memorystoreの構築
まずは、GCPのコンソールからMemorystoreを構築します。
MemorystoreはVPC内に作成する必要があります。今回はデフォルトのVPC内にダイレクトピアリングを行う形で作成しました。
GCEの構築
MemorystoreのRedisアクセスするために、GCEにVMインスタンスを作成します。redis-cliが使えれば良いので、以下のような設定となります。
- リージョン・ゾーン: Memorystoreと同じ場所
- マシン: e2-medium
- ブートディスク: Debian GNU/Linux 12 (bookworm)
- ネットワークインターフェース: default
VMインスタンスを作成したら、SSH接続して作業を進めます。
パッケージ管理のリポジトリ情報を最新に更新します。
1sudo apt-get update
次に、redis-toolsをインストールします。
1sudo apt-get install redis-tools
MemorystoreのRedisに接続します。xx.xx.xxx.xxxはMemorystoreのプライマリエンドポイントのIPに置き換えてください。
1redis-cli -h xx.xx.xxx.xxx
キャッシュされているキーの一覧を確認します。
1keys *
特定のキーを削除します。
1DEL hoge
全てのキーを削除します。
1FLUSHALL
CloudRunの設定
今回は、RailsのアプリケーションをデプロイしたCloudRunを事前に用意しています。CloudRunはサーバレスであり、VPCにアクセスするための設定が必要です。
サーバレスVPCアクセス vs ダイレクトVPC: パフォーマンス対決
CloudRunのVPCへの接続には2種類の方法があります。
サーバレスVPCアクセスコネクタ
ダイレクトVPC
サーバレスVPCアクセスコネクタより、ダイレクトVPCの方がパフォーマンスが高いとのことです。実際に比較してみます。
今回は検証用にRailsのアプリケーションのコントローラーでモデルの全レコードを取得する二つの処理にキャッシュを適用し、処理時間の差を確認します。
1 def hoge
2 @user_count = log_execution_time('処理A') { fetch_from_cache('user_count') { User.count } }
3 @score_count = log_execution_time('処理B') { fetch_from_cache('score_count') { Score.count } }
4 end
5
6 private
7
8 # キャッシュから値を取得し、存在しない場合はブロックを実行してキャッシュに保存
9 #
10 # @param [String] key キャッシュキー
11 # @param [Integer] expires_in キャッシュの有効期限(秒)
12 # @yieldreturn [Object] ブロックの実行結果
13 # @return [Object] キャッシュから取得した値、またはブロックの実行結果
14 def fetch_from_cache(key, expires_in: 30.minutes)
15 cached_value = $redis.get(key)
16 return cached_value.to_i if cached_value
17
18 value = yield
19 $redis.set(key, value)
20 $redis.expire(key, expires_in.to_i)
21 value
22 end
23
24 # 指定されたブロックの処理時間を計測し、ログに出力
25 #
26 # @param [String] label ログに出力するラベル
27 # @yieldreturn [Object] ブロックの実行結果
28 # @return [Object] ブロックの実行結果
29 def log_execution_time(label)
30 start_time = Time.now
31 result = yield
32 end_time = Time.now
33 execution_time = end_time - start_time
34
35 Rails.logger.info("#{label} 処理時間 #{execution_time} seconds")
36
37 result
38 end
CloudRunにデプロイしたサービスにアクセスしてログを確認します。赤枠がキャッシュがない時の処理時間、青枠がキャッシュされた時の処理時間です。
サーバレスVPCアクセスコネクタ
ダイレクトVPC
MemorystoreのRedisを使うと、キャッシュがない場合に比べ、処理時間が大幅に短縮されます。また、サーバレスVPCアクセスコネクタよりもダイレクトVPCの方がパフォーマンスが優れていることを確認できました。。今回の検証では、最大で約60倍の処理速度の改善が見られましたが、さらに重い処理や頻繁にアクセスされるデータをキャッシュすることで、より大きな効果が期待できます。
キャッシュ戦略をうまく活用して、より良いサービスを構築しましょう。暑い日が続きますが、熱中症に気をつけて、良い日々をお過ごしください。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ