CakePHP2
+
MySQL Replication
株式会社 LocoPartners
大須賀 義浩
Replication
Replication
Replication
メリット
•

更新系と参照系を分けることによって、負荷を
分散できる

•

Masterがダウンした時に、SlaveをMasterに昇格
することができる
注意点

•

完全同期ではない(タイムラグがある)

•

Slaveはバックアップではない
Replicationの作り方

•

Search Google
CakePHP2で
MasterとSlaveを使い分ける
// app/Config/database.php
class DATABASE_CONFIG {
!
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'master.mysql.host',
'login' => 'mysql_username',
'password' => 'mysql_password',
'database' => 'schema_name',
'prefix' => '',
'encoding' => 'utf8',
);
!
public $replica = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'slave.mysql.host',
'login' => 'mysql_username',
'password' => 'mysql_password',
'database' => 'schema_name',
'prefix' => '',
'encoding' => 'utf8',
);
}
// app/Model/AppModel.php
class AppModel extends Model {
!
public $useReplica = false;
!
public function beforeFind($queryData) {
if ($this->useReplica) {
$this->useDbConfig = 'replica';
foreach ($this->belongsTo as $btModelName => $btModelData) {
$this->{$btModelName}->useDbConfig = 'replica';
}
}
return $queryData;
}
!
public function afterFind($results, $primary = false) {
if ($this->useReplica) {
$this->useDbConfig = 'default';
foreach ($this->belongsTo as $btModelName => $btModelData) {
$this->{$btModelName}->useDbConfig = 'default';
}
}
return $results;
}
}
// app/Model/Hoge.php
class Hoge extends AppModel {
public $useReplica = true;
public $belongsTo = array(
'Fuga',
'Foo',
'Bar',
);
}
!
!
!
// app/Controller/HogesController.php
class HogesController extends AppController {
!
public function index() {
$this->set('hoge', $this->Hoge->find('all'));
}
}
もっと良い実装方法をご存知
でしたら教えてください

CakePHP2でMySQL Replication