2009-12-08 18 views
7

¿Qué debo hacer para hacer 20k insertos mysql por segundo posibles (durante las horas pico alrededor de 1k/seg durante tiempos más lentos)? He estado investigando un poco y he visto la sugerencia "INSERT DELAYED", escribiendo en un archivo plano, "fopen (file, 'a')", y luego ejecutando un trabajo crónico para volcar los datos "necesarios" en mysql, etc. También he escuchado que necesita varios servidores y "balanceadores de carga" de los que nunca he oído hablar, para hacer que algo así funcione. También he estado mirando estos thing-a-ma-jigs de "servidor en la nube" y su escalabilidad automática, pero no estoy seguro de qué es realmente escalable.Prácticas recomendadas, PHP, seguimiento de millones de impresiones por día

La aplicación es solo un script de seguimiento, por lo que si tengo 100 sitios web que obtienen 3 millones de páginas cargadas al día, habrá alrededor de 300 millones de inserts por día. Los datos se ejecutarán a través de un script que se ejecutará cada 15-30 minutos, lo que normalizará los datos e insertará en otra tabla mysql.

¿Cómo lo hacen los perros grandes? ¿Cómo lo hacen los perritos? No puedo permitirme un servidor enorme, así que de forma intuitiva, si hay varias maneras de hacerlo, la gente inteligente puede pensar ... por favor, hágamelo saber :)

+0

Soy un n00b, pero no veo por qué es necesario 20k ins/seg. ¿No puedes simplemente almacenar un montón de datos en matrices dentro de PHP, y luego insertar (n) filas a la vez con una cadena de consulta mysql looooooooooong? Eso reduciría la cantidad de inserciones en bruto. Supongo que el tiempo de procesamiento sigue siendo un problema. : -/ – Drew

+0

por lo que leí, no es 20K/seg en una secuencia de comandos. Pero, 20K/seg vinieron de solicitud múltiple. – ariefbayu

+0

Si no ha comenzado realmente a desarrollar el sitio y actualmente recibe una pequeña fracción del tráfico que está esperando, no se preocupe por los detalles sangrientos de la optimización hasta que comience a ver crecimiento y escala según sea necesario. Uno de los mayores escollos del desarrollo es la optimización antes de que realmente se necesite. La mayoría de los peces grandes comenzaron en un pequeño estanque. Solo mi recomendación. –

Respuesta

2

Eso es impresionante. La mayoría de mis datos provienen de inserciones masivas a la vez. Una cosa que encuentro es que los insertos a granel son mucho mejores que los insertos individuales. Además, el diseño de sus tablas, índices, etc. tiene mucho que ver con la velocidad de inserción. El problema con el uso de cron y la inserción masiva son los casos límite. (Cuando va a hacer los insertos).

Además con archivos flatfiles. Puede encontrar fácilmente problemas con la concurrencia al escribir las inserciones en el archivo. Si escribe 1k + inserta una s, se encontrará rápidamente con muchos conflictos y pérdidas cuando haya problemas con la escritura del archivo.

+0

Bueno, necesito hacerlos por separado en cualquier medio que lo haga tomarlos. Entonces necesito tomar esos datos, normalizarlos y ponerlos en una tabla mysql muy pequeña y ordenada. – Mickey

5

¿Cómo lo hacen los perros grandes?

Varios servidores. Balanceo de carga.

¿Cómo lo hacen los perros pequeños?

Varios servidores. Balanceo de carga.

Realmente desea guardar inserciones y enviarlas a la base de datos de forma masiva. 20k inserta un segundo por segundo y simplifica eso hasta una gran inserción cada segundo, elimina la mayor parte.

+1

Supongo que la pregunta es, "¿Cómo puedo guardarlos?". – Mickey

1

Este no es un problema que pueda manejar solo en PHP.

Si usted tiene 20 000 solicitudes de un golpear a su "bajo presupuesto" (como se entendía por el tono de su pregunta) servidor, entonces alcanzará su límite antes de la mayoría de ellos llegan al procesador de PHP segundo (y , eventualmente, MySQL).

Si tiene un script de seguimiento de tráfico, es muy probable que cause problemas para todos los sitios que rastrea.

+0

Supongo que esa es otra pregunta entonces. El servidor podrá manejar la carga del php que hará que esto suceda 20,000 veces por segundo :( – Mickey

+1

Caché, Caché, Caché. Y si puede, ponga la base de datos en un servidor y el php en el otro. solo tienes que poner el dinero para tirar cosas más grandes con la esperanza de que ganarás lo suficiente cuando crezca para cubrirlo. –

5

Un par de maneras:

En primer lugar, se llega a un punto donde es necesario particionar o fragmentar los datos que dividirlo entre varios servidores. Esto podría ser tan simple como A-C en el servidor 1, D-F en el servidor 2 y así sucesivamente.

En segundo lugar, difiera la escritura en la base de datos. En su lugar, escriba en una tienda de memoria rápida utilizando beanstalkd o memcached directamente.Haga que otro proceso recopile esos estados y escriba datos agregados en la base de datos. Periódicamente amalgame esos registros en datos resumidos.

+1

Las 20k inserciones por segundo son solo datos temporales. Una vez que se hayan recopilado, ejecutaré un script en Intervalos de 15-30 minutos que toman todos los datos, normalícenlos (por ejemplo, si la misma IP visita la misma página web 100 veces) habrá 100 filas de datos en la tabla temporal, y en la tabla normalizada solo actualizará una fila para reflejar las 100 visitas adicionales. – Mickey

1

PHP no es muy adecuado para el tráfico web de alto volumen en mi humilde opinión. Sin embargo, es probable que la base de datos lo empantane antes del rendimiento de PHP, especialmente con el modelo de conexión de PHP (abre una nueva conexión para cada necesidad).

Tengo dos sugerencias para usted:

  1. Dale SQL Relay un vistazo: http://sqlrelay.sourceforge.net/
  2. la salida algunos aceleradores de PHP: http://en.wikipedia.org/wiki/List_of_PHP_accelerators

SQL Relay permite efectivamente PHP para aprovechar TKE de conexión agrupación y que proporcionará un rendimiento mucho mejor para una aplicación de base de datos de gran volumen.

Acceleradores de PHP (en general) almacenan en caché los códigos de operación PHP, lo que ahorra la sobrecarga de interpretar el código PHP con cada solicitud.

¡Buena suerte!

+0

La persona podría haber comentado al menos por qué pensaban que esta era una mala sugerencia, parece una gran información, ¡gracias! – Mickey

+1

Probablemente, el "PHP no es muy adecuado para la alta vo lume web traffic ", que sitios como Facebook refutan. – ceejayoz

+0

Para ser justos, dije que era solo mi opinión. Debería haber sido más específico sin embargo. PHP no es tan eficiente como algunos otros lenguajes y por lo tanto no es adecuado para tráfico web de alto volumen (no es que no funcione o no funcione, simplemente no es la mejor herramienta para el trabajo en mi opinión). http://slashdot.org/story/09/12/20/1433257/The-Environmental-Impact-of-PHP-Compared-To-C-On-Facebook – jckdnk111

0

Escribir en un archivo es excelente, pero igual necesita sincronizar las escrituras de sus archivos, lo que lo coloca nuevamente en el punto de partida.

Sugerencias:

  • sistema MQ, aunque a veces la base de datos puede ser más rápido,
  • Sobre la idea de MQ: cola en memoria. Sé que dijiste PHP, pero he visto esto bastante bien en Java/Servlets,
  • Dependiendo de lo que estés rastreando, puedes implementar un archivo estático en una CDN (la nube de la que hablaste) y agregue los registros de acceso en lote. Le permite alquilar la ampliación,
  • INSERTAR RETRASADA buena idea, pero no sé cuál es el tamaño de la cola/retraso para eso en MySQL? (cualquiera)
+0

Gracias por el comentario. Voy a ver esto. – Mickey

1

Recomendaría también el almacenamiento en memoria caché.

Escriba sus datos en un Memcache y haga que un trabajo que se ejecuta periódicamente lo agregue y haga las inserciones.

Escribir en un archivo real probablemente REDUCIRÁ su rendimiento ya que el acceso al sistema de archivos es en su mayoría más lento que hablar con una base de datos que puede manejar el acceso de escritura de manera mucho más eficiente.

0

Dado que realiza un seguimiento de las impresiones, ¿qué ocurre si intenta guardar solo, por ejemplo, una de cada 5. Entonces, todavía tiene una muestra completamente "aleatoria" y puede aplicar los porcentajes al conjunto de datos más grande.

Cuestiones relacionadas