利用ユーザの増加などに伴い、DBのパフォーマンスがボトルネックになることがあります。
ここでは Amazon Aurora(RDS)を例に、インフラの観点からパフォーマンスを改善する方法をご紹介します。今回はAuroraを例に考えましたが、考え方自体は他のデータベースでも同じです。
パフォーマンスの改善方法
パフォーマンスを改善するためのアプローチはたくさんありますが、どれが正解というものはありません。原因によって効果的なアプローチは変わるため、まずは原因を分析することが重要です。
インスタンスのスケールアップ
最もシンプルな対応で、Auroraインスタンスの性能を上げることでパフォーマンスを改善します。インスタンスのサイズを上げることで、vCPU、メモリ、ネットワークパフォーマンス、ストレージ帯域幅などが向上するため、多くのケースで性能向上が期待できます。
この方法は、アプリケーションへの影響がほとんどなく、システムのアーキテクチャ変更も不要なため、シンプルで実施しやすいです。しかし、一つのインスタンスで対応できる物量には限界があり、上限に達しやすいというデメリットがあります。
リードレプリカの作成
データベースへの参照がボトルネックとなる場合には、リードレプリカの導入が効果的です。多くの場合、データベースの読み取り処理は書き込み処理と比較して多いため、この方法は多くのケースで使えると思います。
Amazon Auroraではリードレプリカを最大で15個まで追加することができ、Aurora Auto Scalingを利用することで動的なスケーリングも可能です。アプリケーションの大きな変更は不要ですが、クラスターエンドポイント (ライターエンドポイント)とリーダーエンドポイントの切替に対応するか、プロキシの導入を行う必要があります。
キャッシュ追加
データベースの参照がボトルネックとなる場合、リードレプリカとは別のアプローチとしてキャッシュ追加があります。AWSではAmazon ElastiCacheサービスを利用できます。
ElastiCacheは非常に高速で、ミリ秒未満の応答時間でインメモリキャッシュとして利用できるため、頻繁に参照されるクエリの結果セットをキャッシュすることで、データベースへのI/O負荷を減少させるといった方法があります。
インデックス、パーティションの見直し
インデックスやパーティションの作成や見直しはAuroraに限ったお話ではなく、一般的なリレーショナルデータベース全般でよく利用される手法です。ここでは詳細は割愛します。
Amazon RDS Proxyの導入
データベースへの同時接続数が多い場合や、AWS Lambada利用時にデータベース接続に時間がかかる場合などはAmazon RDS Proxyを利用することで改善できる場合があります。
Amazon RDS Proxyはフルマネージドのプロキシサービスで、データベース接続をプールしてくれるのでデータベースに接続するための接続確立と破棄のオーバーヘッドを減らすことが可能です。
Amazon Aurora Global Databaseの利用
グローバルなサービス展開を行う場合、Amazon Aurora Global Databaseを利用することで、各リージョンからのデータ読み取りを高速化することができます。Amazon Aurora Global Databaseは、簡単に1秒未満の非常に高速なクロスリージョンレプリケーションを実現してくれます。
各リージョンにデータが配置されるため、ユーザーは地理的に近いリージョンからデータを取得できるようになるため、低レイテンシーでアクセスすることが可能になります。
以上