LinuCレベル4 システムアーキテクト 性能・拡張性の設計 問15
性能・拡張性の設計/性能の拡張会員制の投稿サイトで、データベースへの要求の約9割が参照であり、1台のプライマリのCPUが参照処理で限界に近づいている。書き込みの量には余裕があり、アプリケーションの改修はできるだけ小さくしたい。ただし、利用者が自分の投稿を保存した直後に表示する画面では、保存した内容が必ず表示されなければならない。構成として最も適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル4 システムアーキテクトの出題範囲「性能・拡張性の設計」に対応。実際の試験問題ではありません)
- A顧客IDで行を複数のデータベースに振り分ける水平シャーディングを行い、参照と書き込みの両方を各データベースに分散する
- B非同期のリードレプリカを追加し、すべての参照をレプリカへ振り分けて、プライマリでは書き込みだけを処理させる
- C非同期のリードレプリカを追加して参照を振り分け、保存直後に本人が見る画面の読み取りだけはプライマリから行う
- D参照結果を有効期間の長いキャッシュに置き、保存の直後もキャッシュの内容を返して、データベースへの参照を減らす
正解:C
解説
参照が大半を占め、書き込みに余裕がある場合は、リードレプリカを追加して参照を分散するのが改修も小さく効果的です。ただし非同期のレプリケーションではレプリカへの反映に遅れがあるため、保存した直後にレプリカから読むと、保存前の内容が表示されることがあります。自分の書き込みを直後に読む必要がある画面だけはプライマリから読むようにすれば、その要件を満たしつつ参照の大半をレプリカに逃がせます。水平シャーディングは書き込みの性能を伸ばす手段ですが、データの振り分けやシャードをまたぐ処理のためにアプリケーションの大きな改修を伴います。
選択肢ごとの解説
- A誤り。水平シャーディングは書き込みも分散できますが、振り分けの仕組みやシャードをまたぐ検索への対応など改修が大きく、書き込みに余裕がある今回の状況では過剰です。
- B誤り。非同期のレプリカには反映の遅れがあるため、保存直後の画面までレプリカから読むと、保存した内容が表示されないことがあり、要件を満たせません。
- C正しい。参照の大半をレプリカで処理してプライマリの負荷を下げつつ、保存直後に本人が読む画面だけをプライマリから読むことで、反映の遅れの影響を受けないようにできます。
- D誤り。有効期間の長いキャッシュを保存の直後にも返すと、保存前の内容が表示され、保存した内容を必ず表示するという要件に反します。