Laravelでマスタースレーブ構成(複数DB)を実装する

シェアする

Laravelを使用していて、master/slave構成を実装したいことがあると思います。

今回は、Laravelを使用して、master/slave構成の実装の方法について紹介します。

master/slave構成の実装方法

Laravel 5系の場合

Laravel 5系の場合、config/database.phpを修正します。
下記のように記載することで、master/slave構成を実装することが出来ます。

'mysql' => [
    'read' => [
        'host' => '192.168.1.1',
    ],
    'write' => [
        'host' => '196.168.1.2'
    ],
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
],

この設定により、read/writeを明示的に指定する事無く、自動的に接続先を解決することが出来ます。
writeにマスターを指定し、readにはスレーブを指定します。

master・slave内で複数の接続先がある場合は、Laravel 4系の方に例を示したので参照してみてください。

データベースの接続先を明示的に指定するシンプルなマスタースレーブ構成以外にも、複数のデータベースを利用する事が多々あります。

例えば
・データ分散化の為に物理的にデータベースサーバが異なる場合。
・マスター、スレーブそれぞれのユーザー、パスワードが異なっている場合。
・MySQL, PostgreSQL, SQL Serverなど複数のデータベースを利用する場合。

のような例があります。そのような場合は、下記の記事を参考にしてみてください。

Laravelで複数のデータベースに接続する方法について紹介しています。Laravel4とLaravel5それぞれの方法について紹介しています。
Laravel 4系の場合

Laravel 4系の場合、app/config/database.phpを修正します。修正内容は、同じですが、今回は、スレーブのDBが複数あった場合の例を示してみます。

//接続先に複数のIPがあった場合複数登録する
$readHosts = ['193.168.1.1', '194.168.1.1'];    

'mysql' => array(
    'read' => array(
        // Return a random host
        'host' => $readHosts[array_rand($readHosts)],
    ),
    'write' => array(
        'host' => '196.168.1.2'
    ),
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

Laravel 5系の際にも利用できるのですが、これによりslave(read)のデータベースをランダムに指定することが出来ます。

Laravelでmaster/slave構成を実装しようとしている際には、参考にしてみてください。