Tout d’abord, bonne année à toutes & à tous, que 2009 soit une année meilleure que prévue, voire même excellente, soyons fous
Pour commencer l’année du bon pied, voici ce que nous avons en cour de gestation dans le labo NBS pour faire de Magento une architecture à peu prêt efficace. Une fois vos sites optimisés, le code retravaillé, vos requêtes sql allégées, vos Magento mis à jour, bref, une fois les 32 règles d’or respectées, que faire pour gagner encore un peu ?
Si vous en êtes là, vous avez le même problème que les autres : la charge CPU des serveurs Web Frontaux quand ils rendent des pages et la charge imposée au serveur de base de données lors de l’utilisation du backoffice (B.O).
François soulignait que l’utilisation d’une instance séparée de Magento pour le B.O pourrait améliorer l’affaire et je suis bien de son avis. A tel point qu’on a cogité une optimisation sur notre plateforme C1 dédiée à l’hébergement de sites Magento.
Voici la recette :
1°) On crée un cluster de Mysql avec deux lames blindée de RAM, ce cluster on le paramètre en Mysql Master
2°) On crée un mysql non cluster sur une lame et on le paramètre en Mysql Slave (Entre le cluster et le serveur standalone, on a donc une réplication des informations écrite sur le master vers le slave)
3°) On met les serveurs de Frontoffice, les Web frontaux, sur une instance Magento qui s’adresse au cluster de base de donnée en Master
4°) On crée une instance Magento sur un autre serveur (voir techniquement sur un apache dédié sur un seul coeur d’un processeur), qui va pointer sur le serveur Mysql slave
5°) Sur la deuxième instance Magento (celle de B.O qui pointe sur le slave) on patch le framework Zend pour qu’il fasse ses opérations de Read (select notamment) sur le serveur Slave et ses opérations de Write sur le serveur Master (qui répercutera tout seul ses Insert, alter, Update, etc… sur le slave)
6°) On apprécie le fait que l’utilisation du B.O n’impacte plus les perfs client et le gain de performances associé
my-connecteur-zend-DB
Work In Progress (W.I.P) :
- Le système de rendu des pages Web frontales pourrait être très optimisé en utilisant d’autres méthodes, on utilise Zend Optimiser et un (my)SQL analyzer pour jeter un oeil aux parties réellement trop consommatrices qui pourraient être patchées pour améliorer les performances et diminuer la pression de Magento sur les CPU.
- Une réflexion de fond est menée sur le fait que Zend permet l’interception de presque toutes les requêtes, méthodes, fonctions etc… à presque tous les niveaux. Vu que Magento repose dessus, il serait possible, sans toucher à Magento directement, d’optimiser ou repenser certaines fonctions. C’est principalement vrai pour les requêtes de bases de données puisque le reste de la page est conçu et “rendu” par Magento, mais il subsiste des pistes pour pouvoir remplacer certains appel à des fonctions lourdes par d’autres qui le sont moins, de manière transparente pour Magento, sans patcher son code source.
Bruno du labo vous présente ses voeux et offre le snippet de code (my-connecteur-zend-DB) qui permet l’arbitrage des DBs, pour l’utiliser, il suffit d’extraire le contenu du fichier « My.zip » en pièce jointe dans un dossier de l’include_path de PHP. La class My_Db_Statement_Clustered doit doc se trouver dans un dossier « My/Db/Statement/Clustered.php ». Si la fonction d’autoload de la class Zend_Loader n’a pas été activée, il faudra inclure ce fichier à la main (require_once()). Ceci fait, pour utiliser la classe, il suffit de placer le code suivant après l’instanciation des connections au base de données (Zend_Db_Adapter) comme ceci :
<?php
/**
* Redirige toutes les requêtes SQL de type INSERT, DELETE et UPDATE
* vers la connexion $myClusterDb
*
* @var Zend_Db_Adapter_Abstract $myClusterDb
*/
My_Db_Statement_Clustered::setWriteDatabase( $myClusterDb );
/**
* Redirige tous les autres types de requêtes SQL (SELECT, DESCRIBE, …)
* vers la connexion $mySlaveDb
*
* @var Zend_Db_Adapter_Abstract $mySlaveDb
*/
My_Db_Statement_Clustered::setReadDatabase( $mySlaveDb );
?>
Gilles nous explique aussi que des connecteurs natifs existent dans Magento, ca se règle dans app/etc/local.xml (voir le lien ici)
Commentaires récents