Need help writing to multiple database through single Magento installation

Deadly 提交于 2020-01-03 05:34:11

问题


I'm new to Magento (I am loving it) and developing a desktop application to run side-by-side with our Magento CE 1.7 store. The desktop application will have it’s own database but we need to fetch almost all information from magento.

So, I have already copied the whole database of magento and used it in the application’s database. What I need is to write in the application’s database too when there is something written in the magento’s database through magento’s site. We do not need to read from application’s database, only write.

What changes will I need to do and where? I would really appreciate if someone can provide me some in-depth guide. Please help me.

Thank you.


回答1:


Can Magento natively handle read-only slaves

Magento is natively capable of splitting off reads/writes to different database servers (with the exception of a few broken releases, eg. EE 1.11) - allowing you to offset select load to an additional (or more) server(s); and forwarding all the update/write queries to a single master.

Configuring the slaves

First configure your slaves. We're big advocates of the Percona utilities and MySQL branches - they have an ideal tool for taking hot backups of your existing DB - innobackupex. There is a good write up here.

On the master

Replace $TIMESTAMP or tab complete.

mysql
> GRANT REPLICATION SLAVE ON *.*  TO 'repl'@'$slaveip' IDENTIFIED BY '$slavepass';
> quit;
innobackupex --user=username --password=password /path/to/backupdir
innobackupex --user=username --password=password /
       --apply-log /path/to/backupdir/$TIMESTAMP/

rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP TheSlave:/path/to/mysql/
scp /etc/mysql/my.cnf TheSlave:/etc/mysql/my.cnf

On the slave

/etc/init.d/mysql stop
mv /path/to/mysql/datadir /path/to/mysql/datadir_bak
mv /path/to/mysql/$TIMESTAMP /path/to/mysql/datadir
chown -R mysql:mysql /path/to/mysql/datadir
sed -i 's#server-id=1#server-id=2#g' /etc/mysql/my.cnf
/etc/init.d/mysql start
cat /var/lib/mysql/xtrabackup_binlog_info
> TheMaster-bin.000001     481

mysql
> CHANGE MASTER TO MASTER_HOST='$masterip', MASTER_USER='repl', MASTER_PASSWORD='$slavepass', MASTER_LOG_FILE='TheMaster-bin.000001', MASTER_LOG_POS=481;
> START SLAVE;

Then once your slave is operational, in practice, it only takes a few additional lines of code to achieve.

In ./app/etc/local.xml

<default_read>
  <connection>
    <use/>
    <host><![CDATA[host]]></host>
    <username><![CDATA[username]]></username>
    <password><![CDATA[password]]></password>
    <dbname><![CDATA[dbname]]></dbname>
    <type>pdo_mysql</type>
    <model>mysql4</model>
    <initStatements>SET NAMES utf8</initStatements>
    <active>1</active>
  </connection>
</default_read>

Sources




回答2:


To handle more than one database you should do the following :

1°) Create the database connection in /app/etc/local.xml :

You have something like :

        <default_setup>
            <connection>
                <host><![CDATA[localhost]]></host>
                <username><![CDATA[user]]></username>
                <password><![CDATA[password]]></password>
                <dbname><![CDATA[dbname]]></dbname>
                <active>1</active>
            </connection>
        </default_setup>

To handle your mysql db. Add another node here to handle the new connexion

 <mysetup>
<connection>
<host>192.168.5.10</host> <!-- host of my local server -->

<username>user</username>
<password>passwd</password>
<dbname>d:\pathtomydb\bin\dbname.FDB</dbname>
<active>1</active>
   </connection>
   </mysetup>

Now you have another connexion.

Mine is a firebird, so you may adapt some changes to this, but here is how I handle it :

Connexion :

 $config = Mage::getConfig()->getResourceConnectionConfig('mysetup');

        $dbConfig = array(
        'host'      => $config->host,
        'username'  => $config->username,
        'password'  => $config->password,
        'dbname'    => $config->dbname
    );
        $connexion = Zend_Db::factory('Firebird', $dbConfig);

Replace Firebird with the kind of connexion you need (like Pdo_Mysql or something like that). Queries :

 $connexion->fetchAll($request);
 $connexion->update('table',array('field'=>'value'),$where);

etc.




回答3:


If your DNS supports, you can create a record set using weighted routing policy. Like AWS Route 53. And to avoid downtimes you can associate with health checks.

One example: https://aws.amazon.com/pt/blogs/aws/domain-name-health-checks-for-route-53/



来源:https://stackoverflow.com/questions/14775114/need-help-writing-to-multiple-database-through-single-magento-installation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!