Temos uma experiência bastante vasta de clusters MySQL - e a Percona trabalhou conosco em várias ocasiões ao ultrapassar os limites de configurações complexas.
O Magento pode lidar nativamente com escravos somente leitura
O Magento é nativamente capaz de separar leituras / gravações em diferentes servidores de banco de dados (com exceção de algumas versões quebradas, por exemplo, EE 1.11) - permitindo compensar a select
carga em um ou mais servidores; e encaminhando todas as update/write
consultas para um único mestre.
Quando devo fazê-lo
Esta é uma pergunta mais apropriada. Com sistemas operacionais Magento dedicados, como o MageStack - é cada vez mais comum que as técnicas avançadas de armazenamento em cache do lado do servidor estejam disponíveis e sejam facilmente usadas (como o cache de front-end do Varnish e o cache de back-end do Redis).
Historicamente, o Magento nunca foi vinculado pelo MySQL - mas pelo PHP. Porém, à medida que o Varnish e o Full Page Caching (FPC) são usados com mais freqüência, o ônus de tarefas repetidas (cargas de categoria / produto, pesquisas frequentes) é subitamente absorvido e o PHP se torna um fardo menor. De fato, ele só entra em jogo para gerar o conteúdo inicialmente ou para completar cenários não capturáveis (adicionar ao carrinho, concluir o pedido etc.); para fins de explicação, ignoramos deliberadamente a carga administrativa .
Sempre defendemos o fato de o MySQL não ser uma área de preocupação para a maioria dos varejistas, como visto aqui e aqui . Mas se você estiver na região de processar centenas de pedidos por hora, e não um dígito ou dois dígitos - em breve se tornará uma área de otimização.
Por fim, para lojas menores (<25k visitantes únicos diários)
Seus esforços seriam muito mais concentrados em simplesmente encontrar um host apropriado que possa sugerir o hardware certo a partir do offset e que tenha configurado a máquina da maneira mais ideal para sua loja . Não perca seu tempo buscando configurações Master / Slave ou Master / Master - que não trarão benefícios de desempenho e acabarão exigindo atenção contínua e conhecimento avançado do MySQL.
Por fim, o dimensionamento e a seleção de hardware terão um papel maior do que a otimização do MySQL.
Mas para lojas maiores
À medida que sua loja começa a crescer, a carga transacional ou de conversão se torna um fardo com a tarefa repetida de concluir tarefas complexas inserts
e updates
. A adição de cada novo pedido acionará a diminuição do estoque do catálogo, retornos de chamada dos gateways de pagamento e atualizações dos sistemas EPOS / ERP. Combine isso com a limpeza de cache associada dos respectivos produtos / categorias e em breve você verá o carregamento do MySQL aumentar desproporcionalmente.
O mestre múltiplo nunca é uma solução que recomendamos ou consideramos uma opção viável, mas o Mestre / Escravo pode gerar benefícios (enfatizamos, em lojas de tamanho Enterprise), compensando a carga de leitura para os nós secundários / terciários.
Mas eu ainda quero fazer isso
Primeiro configure seus escravos. Somos grandes defensores dos utilitários Percona e dos ramos do MySQL - eles têm uma ferramenta ideal para fazer backups quentes do seu banco de dados existente - innobackupex. Há uma boa redação aqui .
No mestre
Substitua $ TIMESTAMP ou guia concluída.
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
No escravo
/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;
Então, quando o seu escravo estiver operacional, na prática, serão necessárias apenas algumas linhas de código adicionais.
Em ./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>
Fontes