Symfony 1.4 / Propel 1.4には既存のプロジェクト(SNSウェブサイト+ android / iPhoneゲーム)があります
DBサーバー(DB1など)に余分な負荷がかかっています。私たちはDB最適化を行っていますが、当面の解決策として、DB2が常にDB1の正確なレプリカである方法でもう1つのDBサーバーを作成することにしました。現在、読み取り操作と書き込み操作の両方に使用されるDB1のみがあります。
次に、すべての読み取り操作をDB2に移動し、書き込み操作(通常はトランザクション内)をDB1でそのまま維持する必要があります。
これらの変更を行うための可能な方法は何ですか(多くのダウンタイムなしで本番サーバー上で)、可能であれば、最小限のコード変更で。
最初のコメントの後に編集
J0kによって提供されたリンクと他のいくつかのリンクに基づいて、ローカル開発環境でフォローしました。
- テストsymfony1.4プロジェクトを作成しました
database.ymlを次のように更新しました
all: propel: class: sfPropelDatabase param: classname: PropelPDO dsn: 'mysql:host=localhost;dbname=wzo;' username: root password: mysql encoding: utf8 persistent: true pooling: true slaves: slave1: dsn: 'mysql:host=localhost;dbname=wzoslv;' username: root password: mysql encoding: utf8
ここで、データベースは、1つのテストエントリの変更を除いて
wzoslv
、データベースの正確なレプリカです。wzo
テーブルのodd_play
行26(PK)の列result
エントリはそれぞれWON1
とWON
です。symfonyタスクを実行する
php symfony propel:build-schema php symfony propel:build-model php symfony cc
モジュールを作成し、次のコードを追加しました。
class wzoActions extends sfActions { public function executeIndex(sfWebRequest $request) { $con_write = Propel::getConnection(OddPlayPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); $con_read = Propel::getConnection(OddPlayPeer::DATABASE_NAME, Propel::CONNECTION_READ); $oddPlay = OddPlayPeer::retrieveByPK(26,0,$con_write); echo "on write connection, result=".$oddPlay->getResult(); $oddPlayRead = OddPlayPeer::retrieveByPK(26,0,$con_read); echo "<br/>on Read connection, result=".$oddPlayRead->getResult(); exit; $this->setLayout('layout'); } }
ブラウザで実行
http://local.sftest.com/index.php/wzo/index
すると、出力は、書き込み接続時に、result =WON//期待される出力を修正します
読み取り接続で、result =WON//正しくありません。それはWON1でなければなりません
OddPlayPeer::DATABASE_NAME
読み取り/書き込み接続の両方を作成しながら通過することが問題だと思いますが、それがオンラインの例でどのように提案されたかです。誰かが私が間違いを犯している場所を提案できますか?
編集:もう少し入力
デバッグエコーを更新しlib\vendor\symfony\lib\plugins\sfPropelPlugin\lib\vendor\propel\Propel.php
て、接続がどのように返されるかを確認しました。次のように入力していることがわかりましたif(行544-549)
$slaveconfigs = isset(self::$configuration['datasources'][$name]['slaves']) ? self::$configuration['datasources'][$name]['slaves'] : null;
if (empty($slaveconfigs)) {
echo "inelseifif<br/>";// no slaves configured for this datasource
self::$connectionMap[$name]['slave'] = false;
return self::getConnection($name, Propel::CONNECTION_WRITE); // Recurse to get the WRITE connection
}
ここ$slaveconfigs
は空なので、書き込み接続を返します。ここで問題は、slaveconfigsが空である理由です。
また、古いフォーラムで定義されているようにsfDatabaseConfigHandler.class.phpを編集してみますが、そうすると、どこかでsymfonyを壊してしまい、Webやログにも何も表示されません。