以下是我使用单个奴隶的配置的一部分。
<default_read>
<connection>
<use/>
<host><![CDATA[slavedb1.amazonaws.com]]></host>
<username><![CDATA[username]]></username>
<password><![CDATA[Password]]></password>
<dbname><![CDATA[shop]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</default_read>
但是,我想使用多个奴隶。这可能与Magento有关吗?
为了澄清,我已经有一个单独的主/从设置与Magento一起工作了。我想添加另一个奴隶,以便我有两个奴隶。我想知道配置如何改变以使用第二个奴隶。
答案 0 :(得分:2)
鉴于您的上述评论并假设您拥有正确的数据库复制设置。
在档案中
查找“core_read”结束标记
<resources>
....
<core_read>
<connection>
<use>default_read</use>
</connection>
</core_read>
....
</resources>
<resources>
....
<core_read>
<connection>
<use>default_read</use>
</connection>
</core_read>
<slave_db_1>
<connection>
<use>slave_one_db</use>
</connection>
</slave_db_1>
<slave_db_2>
<connection>
<use>slave_two_db</use>
</connection>
</slave_db_2>
....
</resources>
<resources>
....
<slave_one_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[slave_one_db_user]]></username>
<password><![CDATA[slave_one_db_password]]></password>
<dbname><![CDATA[slave_db_one_name]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</slave_one_db>
<slave_two_db>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[slave_tow_db_user]]></username>
<password><![CDATA[slave_tow_db_password]]></password>
<dbname><![CDATA[slave_db_one_tow]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</slave_two_db>
....
</resources>
1-查找受保护的$ _mappedTableNames;
2-添加以下方法:
public function getSlaveDb()
{
$prefix = 'slave_db_'; // prefix for the slaves databased in the xml file
$cookieExpireTime = 1209600; // 2 weeks Cookie ( database selection ) expire time
$dbArray = array(1,2); // All slaves Db in-case the cookie has invalid value
$slaveDb = array_rand( array_flip($dbArray),1 ); // How to alternate between databases ( in this demo i just use 2 database ) adjust the selection of the database to fit hoe many database you want to use !
if(!isset($_COOKIE['read_db']) || !in_array($_COOKIE['read_db'],$dbArray)) // Check for the cookie values
{
setcookie("read_db", $slaveDb, time()+$cookieExpireTime); // set the current database to the user in cookie so next time user use same connection to database ! to avoid jumping or hopping on different databases in short time
}else{
$slaveDb = $_COOKIE['read_db']; // return the database selected if the user has it in the cookies
}
return $prefix.$slaveDb;
}
3-将方法“public function getConnection($ name)”修改为如下所示:
public function getConnection($name)
{
if($name =='core_read') // Only applied for READ Connections !!!
{
$name = $this->getSlaveDb(); // change the name of the connection to the one we get from our main method
}
//....... Leave the rest of the function as it is !!
}
这将允许您使用您在XML和PHP CODE中为core_read连接指定的数据库,以及magento中所有其他连接的default_setup连接(core_write,core_setup)
希望这可以解决您的问题。
答案 1 :(得分:1)
据我所知,不可能在Magento上使用多个奴隶。
如果您使用的是AWS,您可以使用更大的实例进行主/从设置?
答案 2 :(得分:0)
您可以在这里获得解决方案。 Need help writing to multiple database through single Magento installation
我认为这是必需的
答案 3 :(得分:0)
根据我的经验,最好的设置是使用Load Balancer在多个从属上传播读取。
这背后的原因是,使用Load Balancer,如果有任何Slave死亡,Magento本身(客户)将会看到很少。如果您使用Mageneto的多个从属方法,那么如果一个从属服务器关闭,查询将需要超时才能发送到另一个节点(客户将看到前端滞后)。
我使用过Stingray / Zeus(商品),但我也看过HAProxy用于此。
答案 4 :(得分:0)
也许某人正在再次阅读这个帖子:
Meabed编写的Codesnippets仍然有效,如果你想在magento中使用单个master和多个slave。 magento的默认设置,不支持多个从属。
首先来看看 app \ code \ core \ Mage \ Core \ Model \ Resource.php - &gt; function getConnection($ name)
此函数返回当前查询的正确连接。例如。用于写入查询和从属连接的主连接 阅读查询。
传递的变量$ name,定义应该使用哪个Connection。 本规范(约95行)
$connConfig = Mage::getConfig()->getResourceConnectionConfig($name);
返回读或写连接。
因此,只需要进行一些修改即可使用多个从站。 首先修改local.xml
<default_setup>
<connection>
<host><![CDATA[127.0.0.1]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[]]></password>
<dbname><![CDATA[yourdatabase]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</default_setup>
<slave_db_one>
<connection>
<use />
<host><![CDATA[127.0.0.3]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[]]></password>
<dbname><![CDATA[yourdatabase]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</slave_db_one>
<slave_db_two>
<connection>
<use />
<host><![CDATA[127.0.02]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[]]></password>
<dbname><![CDATA[yourdatabase]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</slave_db_two>
因此,只需在默认连接的结束标记后再添加两个节点。
As&#34; Meabed&#34;几天前描述的,你只需要修改变量&#34; $ name&#34;以某种方式获得正确的连接节点。 例如把它放在方法的顶部&#34; getConnection&#34;
if ( $name == 'core_read' ) {
$name = 'slave_db_two';
}
您还可以编写一个函数并随机返回另一个连接名称。
public function getRunningSlave() {
$input = array("slave_db_one", "slave_db_two");
$rand_keys = array_rand($input, 2);
return $input[$rand_keys[0]];
}
另一种方法是,使用SHOW SLAVE STATUS检查从站的状态,如果从站当前处于脱机状态,则获取另一个连接或返回主连接以读取查询。
欢呼声