LaravelのRead/Write構成について
はじめに
システムでDBを使うときに、1つDBを用意して、そこにデータを保存したり、読み取ったりします。ただSQLの発行回数が増えるにつれて1つのDBの負荷が強くなり、応答時間が遅くなる原因にもなります。
Read/Write構成(Master/Slave構成)とは
Laravelでは、DBの負荷分散を目的としたRead/Write構成を設定することができます。
Read/Write構成(Master/Slave構成)では、読み取り専用のDB(複数可)と読み書きするDBの2つ以上のDBを使用します。
読み書きするDBが更新されると、自動的に読み取り専用のDBに値が書き込まれます。
SELECTなどの参照系のSQLは読み取り専用のDBに、UPDATEなどの更新系のSQLは読み書きするDBにクエリを送ります。
そうすることによって、SQLの負荷を分散することができ、応答時間低下などの問題を回避することができます。
ただ一つ問題があって、UPDATEなどの更新系のSQLが発行されたあとにSELECTなどの参照系SQLを使用すると値が取得できない場合があります。
これは、UPDATEで書き込むDBと、SELECTで読み込むDBが違うことでデータの反映にラグが発生することが原因になります。
問題の解消には、ネットワーク速度を高速にしたり、UPDATEのあとはなるべくSELECTを使用しないように実装するなどがあります。
LaravelでRead/Write構成を作るには
LaravelでRead/Write構成を構築するにはdatabase.phpを変更する必要があります。
read、 writeに対象となるDBのIPや名前を設定することで、参照系はreadを、更新系はwriteのDBを使用するようになります。
また、stickyをtrueにしておくと同一リクエストの場合、更新系のSQL発行後は、参照系でもwriteのDBを見に行くようになります。(データ反映の遅延対策のため)
database.php
'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' => '',
],
おわりに
Laravelでは簡単にRead/Write構成をすることができます。
Laravelは設定するだけで色々やってくれるので、便利だなと感じました。
今後もLaravelを勉強していきたいと思います。