Memorystore for Redisでベーシックティアからリードレプリカを使用するスタンダードティアへダウンタイムなしで変更
こんにちは。マキシムのサービス開発部でエンジニアをやっている松下です。
マキシムが運用してる、ECサイトの改善に取り組みましたので、その対応内容を紹介します。
背景
私たちのECサイトは、Google Cloudを基盤としたインフラを利用しており、キャッシュ機能としてMemorystore for Redisを導入しています。リリース当初から、Redisのベーシックティアを使用していましたが、高負荷時にはRedisが処理をさばききれず、Cloud SQL(以下、DB)に直接アクセスしてデータを取得するケースが増えました。これによりDBのCPU使用率が上がり、全体のパフォーマンスが低下する問題が発生していました。
本記事では、Redisをベーシックティアからリードレプリカを使用するスタンダードティアに変更し、これらの問題をどのように解決したのかを説明します。
今回取り上げるツールは以下の通りです:
- Cloud Run
(Cloud Run上でLaravelをAPIサーバとして運用しています)
- Memorystore for Redis(以下、Redis)
対応内容
Google Cloudで新たにRedisインスタンスを作成
Redisでは、既存のインスタンスに対してリードレプリカの設定が不可のため、新たにスタンダードティアのインスタンスを作成しました。この新しいインスタンスでは、1~5のリードレプリカを作成可能で、必要に応じて後から変更することもできます。インスタンス作成後、プライマリエンドポイントと読み取りエンドポイントが自動で生成されます。
エンドポイントは以下のような形式で表示されますが、注意点として前半がHOST、後半がPORTとなっていることを覚えておいてください:
123.4.5.6:7890
Laravelの設定ファイルでの接続情報の定義
Laravelでは、config/database.phpにてMySQLやRedisの接続情報を定義できます。この変更に伴い、以下のようにプライマリエンドポイントとリードレプリカのエンドポイントに接続する設定を追加しました。
// database.php
'read_replica' => [
'host' => env('リードレプリカのHOST'),
'port' => env('リードレプリカのPORT'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'database' => env('REDIS_DB'),
],
'primary' => [
'host' => env('プライマリのHOST'),
'port' => env('プライマリのPORT'),
'username' => env('REDIS_USERNAME'),
'password' => env('REDIS_PASSWORD'),
'database' => env('REDIS_DB'),
]
LaravelからRedisへの接続方法
それぞれのRedisに接続する方法は以下の通りです:
copy$redis_read_replica = Redis::connection('read_replica');
$redis_primary = Redis::connection('primary');
$redis_primary->set('key1', 'hoge');
$redis_data = $redis_read_replica->get('key1');
このように、$redis_read_replicaで読み取り用のRedisに接続し、$redis_primaryでプライマリのRedisに接続するようにしています。
まとめ
Laravelでは接続先の設定を追加し、コネクションを指定するだけで接続先を変更できるため、Redisのダウンタイムなしでの移行が実現しました。また、この対応により、高負荷時でもRedisがある程度処理をさばけるようになり、全体のパフォーマンス向上に繋がりました。
マキシムではワクワクドキドキできるものづくりを一緒に行う仲間を募集中です。
ご興味がございましたら、以下のURLからカジュアル面談のお申込みやご応募等お気軽にご連絡ください。