読者です 読者をやめる 読者になる 読者になる

Aurora リーダーエンドポイントによる負荷分散

今日は最近発表された、Amazon Aurora リーダーエンドポイント を利用して 比較的簡易にデータベースの負荷分散を行ってみたいと思います。

概要

  • 書き込みも読み込みにも対応する本体(Writer) 1台、読み込み専用Auroraインスタンス(Reader(リードレプリカ)) 2台の構成を作成します。
  • 任意の読み込みクエリーを、Writerではなく、Readerに投げるようにし、かつ均等に分散させるようにします。 f:id:i-plug-develop:20161109095915p:plain

まず既存のAurora1台の状況からリードレプリカ2台を増やす手順

  • 現在の、Auroraインスタンスを選択します。
  • インスタンスの操作」「Aurora レプリカの作成」と進めて、
  • インスタンスタイプを選び、作成します。
  • パラメーターグループがデフォルトになってしまうので、 もしカスタマイズしたものを使用していた場合は、そちらに変更して再起動が必要となります。この場合、
    • インスタンスの操作」「変更」「データベースの設定」「DBパラメータグループ」と進めて、
      • 「パラメータグループ」でカスタマイズしたパラメーターグループを選択し、 「すぐに適用」にチェックを入れます。
    • そのリードレプリカを再起動します。
  • これを繰り返して本体である Writer 1台、Reader(リードレプリカ) 2台の構成にします。

アプリケーション側(FuelPHPでの一例)で必要な設定

  • アプリケーションの設定ファイルに接続すべきデータベースとして、上で作成したリードリプリカを登録します。
    この時にホスト名として Aurora リーダーエンドポイントを「一つ」指定することで、存在するReaderインスタンスの中から均等にクエリーを投げるようになります。
    • APPPATH/config/production/db.php
     'readreplica' => array(
         'connection'  => array(
             'dsn'        => 'mysql:host=<リーダーエンドポイント>;dbname='.$dbname,
             'username'   => $username,
             'password'   => $password,
         )
     ),
  • APPPATH/config/db.php
     'readreplica' => array(
              'type'        => 'pdo',
              'connection'  => array(
                      'persistent' => false,
              ),
              'identifier'   => '`',
              'table_prefix' => '',
              'charset'      => 'utf8',
              'enable_cache' => true,
              'profiling'    => true,
      ),
  • プログラム中で接続先を上記設定ファイルで指定した「readreplica」とすることで、複数存在するリードレプリカへ分散してクエリーを投げることになります。