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を勉強していきたいと思います。

いいなと思ったら応援しよう!