Abbiamo un'esperienza abbastanza vasta di cluster MySQL e Percona ha lavorato con noi in diverse occasioni spingendo i confini di configurazioni complesse.
Magento può gestire nativamente gli schiavi di sola lettura
Magento è in grado di suddividere nativamente letture / scritture su diversi server di database (ad eccezione di alcune versioni non funzionanti, ad esempio EE 1.11) - che consente di spostare il select
carico su un (o più) server (i) aggiuntivo; e inoltrando tutte le update/write
query a un unico master.
Quando dovrei farlo
Questa è una domanda più appropriata. Con i sistemi operativi Magento dedicati come MageStack , sta diventando sempre più comune la disponibilità e l'utilizzo di tecniche di caching avanzate integrate sul lato server (come la cache front-end Varnish e la cache back-end Redis).
Storicamente, Magento non è mai stato vincolato da MySQL, ma piuttosto da PHP. Ma poiché Varnish e Full Page Caching (FPC) vengono utilizzati più frequentemente, l'onere di attività ripetute (categoria / carichi di prodotto, ricerche frequenti) viene improvvisamente assorbito e PHP diventa meno oneroso. In effetti, entra in gioco solo per generare inizialmente il contenuto o completare scenari non memorizzabili (aggiungi al carrello, completamento dell'ordine ecc.); ai fini della spiegazione stiamo deliberatamente ignorando il carico amministrativo .
Abbiamo sempre sostenuto il fatto che MySQL non è motivo di preoccupazione per la maggior parte dei rivenditori, come visto sia qui che qui . Ma se ti trovi nella zona di elaborazione di centinaia di ordini all'ora, non di singole o doppie cifre, diventerà presto un'area di ottimizzazione.
In definitiva per negozi più piccoli (<25.000 visitatori unici giornalieri)
I tuoi sforzi si concentrerebbero molto meglio sulla semplice ricerca di un host appropriato che possa suggerire l'hardware giusto per essere attivato dall'offset e che abbia configurato la macchina nel modo più ottimale per il tuo negozio . Non perdere tempo a cercare configurazioni Master / Slave o Master / Master, che non produrranno alcun vantaggio in termini di prestazioni e richiederanno in definitiva attenzione continua e conoscenza avanzata di MySQL.
In definitiva, il dimensionamento e la selezione dell'hardware avranno un ruolo maggiore rispetto all'ottimizzazione di MySQL.
Ma per i negozi più grandi
Man mano che il tuo negozio inizia a crescere, il carico di conversione o transazionale diventa più un peso con il compito ripetuto di completare complessi inserts
e updates
. L'aggiunta di ogni nuovo ordine attiverà il decremento delle scorte di catalogo, i callback dai gateway di pagamento e gli aggiornamenti dai sistemi EPOS / ERP. Combinalo con l'eliminazione della cache associata dei rispettivi prodotti / categorie e vedrai presto aumentare il carico di MySQL in modo sproporzionato.
Il multi-master non è mai una soluzione che raccomandiamo o consideriamo come un'opzione praticabile, ma Master / Slave può produrre vantaggi (sottolineiamo, su negozi di dimensioni Enterprise) spostando il carico di lettura su nodi secondari / terziari.
Ma voglio ancora farlo
Per prima cosa configura i tuoi schiavi. Siamo grandi sostenitori delle utility Percona e delle filiali MySQL - hanno uno strumento ideale per eseguire backup a caldo del tuo database esistente - innobackupex. C'è una buona scrittura qui .
Sul maestro
Sostituisci $ TIMESTAMP o scheda completa.
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
Sullo schiavo
/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;
Quindi, una volta che lo slave è operativo, in pratica, bastano poche righe di codice aggiuntive per raggiungere.
Nel ./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>
fonti