中規模のWEBアプリケーションを開発では、処理速度向上や可用性の担保のためMaster/Slaveに分けて複数台運用することがよくあります。 AWSではAmazon Aurora / MySQLなどを使うと簡単に増やすことができますよね。
WEBアプリケーションからの更新系クエリはMasterサーバーに対して実行、読み取りクエリはSlaveサーバーから行うことで全体の負荷分散により、処理速度の向上が期待できます。ただし、複数台データベースを運用するということは同期するまでに数ミリ秒単位でラグがあり、これをレプリケーション遅延といいます。
LaravelではDBの接続情報を設定するconfig/database.php
を編集することでMaster/Slave構成のコネクションを作成することができます。
'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
writeには書き込み可能なMasterの接続情報 readには書き込み可能なSlaveの接続情報 を記述するのみです。
stickyオプションはデータベースに書き込まれたレコードをすぐに読み取るために使用できるオプションの値です。stickyオプションが有効になっっていると要求サイクル中にデータベースに対して「書き込み」操作が実行された場合、それ以降の「読み取り」操作では「書き込み」接続が使用されます。これにより書き込まれたレコードをレプリケーション遅延を気にすることなく同じ要求中にデータベースからすぐに読み戻すことができます。