Question

Je construis une application avec plusieurs serveurs impliqués. (4 serveurs sur lesquels chacun possède une base de données et un serveur Web. 1 base de données maître et 3 esclaves + un équilibreur de charge)

Il existe plusieurs approches pour activer la mise en cache. À l'heure actuelle, c'est assez simple et pas efficace du tout. Toute la mise en cache est effectuée sur un partage de partition NFS entre tous les serveurs. NFS est le goulot d'étranglement de l'architecture.

  1. J'ai plusieurs idées à appliquer la mise en cache. Cela peut être fait sur un serveur niveau (système de fichiers local) mais le le problème est d'invalider un cache fichier lorsque le contenu a été mise à jour sur tout le serveur: ça peut être fait en ayant une petite cache durée de vie (pas efficace car le le cache sera rafraîchi plus tôt qu'il devrait être la plupart du temps)
  2. Cela peut aussi être fait par un message système (XMPP par exemple) où chaque serveur communiquent les uns avec les autres. Le serveur responsable de la invalidation de la cache envoyer un demander à tous les autres de les laisser savoir que la cache a été invalidée. La latence est probablement plus gros (prendre plus de temps pour tout le monde savoir que la cache a été invalidée) mais ma candidature ne nécessite pas de cache atomique invalidation.
  3. La troisième approche consiste à utiliser un nuage système pour stocker le cache (comme CouchDB) mais je n’ai aucune idée du performance pour celui-ci. Est-ce plus rapide que d'utiliser une base de données SQL?

J'avais prévu d'utiliser Zend Framework mais je ne pense pas que ce soit vraiment pertinent (sauf qu'un package existe probablement dans un autre Framework pour traiter XMPP, CouchDB)

Configuration requise: Cache persistant (si un serveur redémarre, vous ne devez pas perdre le cache pour éviter de le mettre hors tension pendant la recréation du cache)

Était-ce utile?

La solution 2

Je pense avoir trouvé une relativement bonne solution.

J'utilise Zend_Cache pour stocker localement chaque fichier de cache. J'ai créé un petit démon basé sur nanoserver qui gère également les fichiers de cache localement. Lorsqu'un serveur crée / modifie / supprime localement un fichier cache, il envoie la même action à tous les serveurs via le démon qui effectue la même action.

Cela signifie que j’ai des fichiers de mise en cache locaux et des actions distantes en même temps. Probablement pas parfait, mais devrait fonctionner pour le moment. CouchDB était trop lent et NFS n’est pas assez fiable.

Autres conseils

http://www.danga.com/memcached/

Memcached couvre la plupart des exigences que vous définissez - lecture, validation et invalidation à base de message. Haute disponibilité et grande vitesse, mais très peu de fiabilité atomique (sacrifiée pour la performance).

(En outre, memcached alimente des éléments tels que YouTube, Wikipedia, Facebook. Je pense donc qu'il peut être assez bien établi que les organisations disposant du temps, de l'argent et du talent nécessaires pour évaluer sérieusement de nombreuses options de mise en cache distribuée se contentent de memcached!)

Modifier (en réponse à un commentaire) L'idée d'un cache est qu'il soit relativement transitoire par rapport à votre magasin de sauvegarde. Si vous devez conserver les données en cache à long terme, je vous recommande de (a) dénormaliser votre niveau de données pour obtenir plus de performances ou (b) d'ajouter un serveur de base de données de niveau intermédiaire qui stocke des données à volume élevé tables de paires de valeurs, ou quelque chose qui se rapproche de cela.

Pour défendre memcached en tant que cache store, si vous souhaitez des performances élevées avec un impact faible sur le redémarrage du serveur, pourquoi ne pas disposer de 4 serveurs memcached? Ou 8? Chaque "redémarrage" aurait en conséquence moins d’effet sur le serveur de base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top