6

以下是我使用单个从站的配置的一部分。

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

但是,我想使用多个 slave。Magento 可以做到这一点吗?

澄清一下,我已经有了一个使用 Magento 的主/从设置。我想添加另一个奴隶,这样我就有两个奴隶。我想知道配置将如何更改以使用第二个从站。

4

5 回答 5

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>”结束标记)添加新连接

<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 ==>“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 代码中为 core_read 连接指定的数据库以及为 magento 中的所有其他连接指定的 default_setup 连接( core_write,core_setup )

希望这能解决您的问题。

于 2013-09-11T12:50:18.547 回答
1

据我所知,Magento 无法使用多个从站。

如果您使用的是 AWS,您可能会为您的主/从设置使用更大的实例?

于 2013-09-13T11:28:53.100 回答
0

也许有人正在再次阅读此线程:

Meabed 编写的代码片段仍然有效,如果您想在 magento 中使用具有多个从属的单个主控。magento 的默认设置,不支持多个从站。

先看看 app\code\core\Mage\Core\Model\Resource.php -> 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>     

因此,只需在默认连接的结束标记之后再添加两个节点。

正如前几天所描述的“Meabed”,您只需要修改变量“$name”以获取正确的连接节点。例如把它放在方法“getConnection”的顶部

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

干杯

于 2015-03-03T15:57:40.310 回答
0

根据我的经验,最好的设置是使用负载均衡器将读取分布在多个从属服务器上。

这背后的原因是,使用负载均衡器,如果任何 Slave 死了,Magento 本身(客户)将几乎看不到任何东西。如果您使用 Mageneto 的多个从属节点的方法,那么如果一个从属节点宕机,查询将需要超时才能发送到另一个节点(客户会在前端看到延迟)。

我使用过 Stingray/Zeus(商业产品),但我也看到了 HAProxy 用于此目的。

于 2013-09-13T00:04:09.227 回答
0

你可以在这里得到你的解决方案。需要帮助通过单个 Magento 安装写入多个数据库

我认为这是需要的

于 2013-09-05T12:24:51.127 回答