Pregunta

Estoy creando una aplicación con varios servidores involucrados. (4 servidores donde cada uno tiene una base de datos y un servidor web. 1 base de datos maestra y 3 esclavos + un equilibrador de carga)

Hay varios enfoques para habilitar el almacenamiento en caché. En este momento es bastante simple y nada eficiente. Todo el almacenamiento en caché se realiza en una partición NFS compartida entre todos los servidores. NFS es el cuello de botella en la arquitectura.

  1. Tengo varias ideas para implementar almacenamiento en caché Se puede hacer en un servidor nivel (sistema de archivos local) pero el el problema es invalidar un caché archivo cuando el contenido ha sido actualización en todos los servidores: puede ser hecho por tener un pequeño caché vida útil (no eficiente porque el caché se actualizará antes de que debería ser la mayor parte del tiempo)
  2. También se puede hacer mediante un mensaje sytem (XMPP por ejemplo) donde cada El servidor se comunica entre sí. El servidor responsable de invalidación de la memoria caché enviar un pedir a todos los demás que les dejen saber que el caché ha sido invalidado La latencia es probablemente más grande (toma más tiempo para todos saber que el caché ha sido invalidado) pero mi solicitud no requiere caché atómica invalidación.
  3. El tercer enfoque es usar una nube sistema para almacenar el caché (como CouchDB) pero no tengo idea de la rendimiento para este. Lo es más rápido que usar una base de datos SQL?

Planeaba usar Zend Framework pero no creo que sea realmente relevante (excepto que probablemente exista algún paquete en otro Framework para tratar con XMPP, CouchDB)

Requisitos: caché persistente (si se reinicia un servidor, no se debe perder el caché para evitar la caída del servidor mientras se vuelve a crear el caché)

¿Fue útil?

Solución 2

Creo que encontré una solución relativamente buena.

Utilizo Zend_Cache para almacenar localmente cada archivo de caché. He creado un pequeño demonio basado en nanoservidor que también administra los archivos de caché localmente. Cuando un servidor crea / modifica / elimina un archivo de caché localmente, envía la misma acción a todos los servidores a través del demonio que realiza la misma acción.

Eso significa que tengo archivos de caché locales y acciones remotas al mismo tiempo. Probablemente no sea perfecto, pero debería funcionar por ahora. CouchDB era demasiado lento y NFS no es lo suficientemente confiable.

Otros consejos

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

Memcached cubre la mayoría de los requisitos que usted establece: lectura basada en mensajes, confirmación e invalidación. Alta disponibilidad y alta velocidad, pero muy poca confiabilidad atómica (sacrificada por el rendimiento).

(Además, memcached potencia cosas como YouTube, Wikipedia, Facebook, por lo que creo que puede estar bastante bien establecido que las organizaciones con el tiempo, el dinero y el talento para evaluar seriamente muchas opciones de almacenamiento en caché distribuidas se asienten con memcached!)

Editar (en respuesta al comentario) La idea de un caché es que sea relativamente transitorio en comparación con su tienda de respaldo. Si necesita conservar los datos de la memoria caché a largo plazo, le recomiendo que busque (a) desnormalizar su nivel de datos para obtener más rendimiento, o (b) agregar un servidor de base de datos de nivel medio que almacene datos de gran volumen en clave directa. tablas de pares de valores, o algo muy parecido a eso.

En defensa de memcached como almacén de caché, si desea un alto rendimiento con bajo impacto de reinicio de un servidor, ¿por qué no solo tiene 4 servidores memcached? O 8? Cada 'reinicio' tendría un efecto correspondientemente menor en el servidor de la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top