magento可以使用多个MySQL奴隶吗?

时间:2013-09-05 12:20:36

标签: mysql magento replication

以下是我使用单个奴隶的配置的一部分。

<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一起工作了。我想添加另一个奴隶,以便我有两个奴隶。我想知道配置如何改变以使用第二个奴隶。

5 个答案:

答案 0 :(得分:2)

鉴于您的上述评论并假设您拥有正确的数据库复制设置。

解决方案: -

- 第1步:

在档案中

应用程序的/ etc / config.xml中

查找“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>

- 第2步:

然后在apt / etc / local.xml中添加新连接(“/ default_setup&gt;”结束标记)

<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>

- 第3步:

从“app / code / core / Mage / Core / Model / Resource.php”复制文件== TO ==&gt; “app / code / local / Mage / Core / Model / Resource.php”

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检查从站的状态,如果从站当前处于脱机状态,则获取另一个连接或返回主连接以读取查询。

欢呼声