Magento使用EAV模型,所以对数据库来说,读操作往往比较大,可以使用读写分离技术有效解决这个问题。所谓读写分离,简单来说就是所有写操作,在A服务器上完成,所有写操作到B服务器上完成,A和B服务器实现主从复制。

Mysql主从复制

主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器。

在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时间。

用从服务器做数据备份而不会占用主服务器的系统资源。网上关于myaql主从复制的文章很多,这里就不详细介绍了。

Magento数据库读写分离

Magento程序本身对读写分离提供了内置支持,可以为每个模块都指定读写适配器,如果没有指定就使用默认的读写适配器,而默认的读写适配器又是使用安装时的适配器。

比如模块名叫eav,那么可以在配置文件中指定eav_write和eav_read适配器,如果没有指定就使用系统默认的default_write和default_read,而default_write和default_read通过use节点指定它实际使用default_setup配置的适配器。

# app/etc/local.xml
<global>
    <resources>
        <db>
            <table_prefix><![CDATA[]]></table_prefix>
        </db>
        <default_setup>
            <connection>
                <host><![CDATA[192.168.1.10]]></host>
                <username><![CDATA[magento]]></username>
                <password><![CDATA[root]]></password>
                <dbname><![CDATA[magento]]></dbname>
                <active>1</active>
            </connection>
        </default_setup>
    </resources>
</global>

默认的读写适配器是放置在app/etc/config.xml中的:

<default_write>
    <connection>
        <use>default_setup</use>
    </connection>
</default_write>
<default_read>
    <connection>
        <use>default_setup</use>
    </connection>
</default_read>

默认它使用use节点指定使用default_setup适配器,所以我们修改这两个配置就可以实现读写分离:

<default_write>
    <connection>
        <host><![CDATA[192.168.1.10]]></host>
        <username><![CDATA[magento]]></username>
        <password><![CDATA[root]]></password>
        <dbname><![CDATA[magento]]></dbname>
        <active>1</active>
    </connection>
</default_write>
<default_read>
    <connection>
        <host><![CDATA[192.168.1.20]]></host>
        <username><![CDATA[magento]]></username>
        <password><![CDATA[root]]></password>
        <dbname><![CDATA[magento]]></dbname>
        <active>1</active>
    </connection>
</default_read>

读操作全部到达192.168.1.20服务器,写操作全部在192.168.1.10进行。注意,不要在local.xml中修改这个配置。虽然local.xml的配置最优先,但是默认配置有use节点,只要有use节点,就使用use节点的适配器,所以需要在config.xml中直接修改(不要出现use节点)。

每个模块都可以指定自己的读写适配器,如果没有指定就使用默认的配置。这个为读压力的水平分解提供了内置支持。比如某个模块的读操作非常频繁,可以读定向到单独到一个服务器中。通过指定读写适配器,还可以为模块指定使用另一个库等等。

参考文章:http://blog.ifeeline.com/745.html

results matching ""

    No results matching ""