2010-11-13 18 views
8

Estoy creando un sitio web y quiero distribuir mi tráfico para evitar bloqueos y asegurarme de que puedo ofrecer el 100% de disponibilidad. Haré esto teniendo 5 servidores diferentes y un servidor principal. Permíteme explicarte.Redirigir usuarios en función del tráfico del servidor con PHP

Tengo un sitio web (domain.com) y en la página de inicio de ese sitio hay un marco cURL que conecta a los usuarios con uno de los otros cinco servidores que tienen menos tráfico en él. Quiero que el script cambie el marco cURL para mostrar el servidor con menos tráfico.

¿Puede alguien ayudarme o sugerir cómo podría codificar esto como yo soy un principiante PHP.

Gracias de antemano, Callum

+0

Bastante avanzado para un principiante Yo diría, veamos qué puedo encontrar para ti. –

+0

Espero que la respuesta actual sea suficiente :) –

+1

Solo un pensamiento 'fuera de la cuestión': hay una palabra clave para esto: Balanceo de carga. Y para Loadbalancing ya hay software especial e incluso hardware que puede usar. No es necesario desarrollar esto por su cuenta. – ZeissS

Respuesta

10

Aquí vamos:

obtener el 5 servidores esclavos para actualizar una tabla en una base de datos en el servidor principal de la inserción de su carga cada X segundos/minutos. Luego, en el servidor principal, verifique cuál de ellos tiene la carga más baja y redirija al usuario a ese servidor en particular. alt text

¿Cómo cargar el servidor?

Hay una función llamada sys_getloadavg(); que devolverá tres muestras que representan la carga promedio del sistema (el número de procesos en la cola de ejecución del sistema) durante los últimos 1, 5 y 15 minutos, respectivamente, en una matriz.

esta manera, si la carga del sistema es más de un número determinado, se debe redireccionar al visitante a un servidor esclavo diferente. Por ejemplo:

$load = sys_getloadavg(); 
if ($load[0] > 80) { 
    //insert into database "I'm busy!!" 
    $query = "UPDATE `server_load` SET `load` = $load WHERE `server_id` = 1"; 
    mysql_query($query); 
} 

Nota del 0 en $load significa que se está haciendo la carga del servidor para el último minuto, utilizar 1 ó 2 para la carga promedio del sistema 5 y 15 minutos. La consulta estaría en una secuencia de comandos en los servidores esclavos y, cada vez que se ejecutara, actualizaría la carga promedio del servidor en la tabla server_load.

Cómo elegir el servidor principal

Una vez que hemos aislado la funcionalidad 'conseguir la carga del servidor de los servidores esclavos. Todo lo que necesita hacer desde el servidor principal es consultar la base de datos y obtener la carga más baja de la tabla server_load. La tabla mencionada, sería suficiente funcional con un campo de marca de tiempo, un campo de ID, y un campo de carga con la siguiente estructura:

`timestamp` int(11) not_null 
`id` int(1) not_null autoincrement 
`load` int(3) not_null 

Para un tutorial básico introducción de interacción MySQL y PHP Sugiero este link de phpsense. Si dedicas suficiente tiempo a leer la documentación con la que te he vinculado, deberías ser capaz de lograr tu objetivo. Asegúrese de hacer todas las siguientes preguntas como entidades independientes si ya no puede encontrarlas en este sitio. Lo más probable es que las personas que te precedieron te hayan preguntado una y otra vez. Espero haber sido de ayuda.

Fuentes:

+1

seguro, dame un minuto. –

+5

Gran respuesta. Pero creo que quizás debería volver a redactar "insertando su carga cada X segundos/minutos". – robinjam

+3

jajaja, no hay nada malo en eso, siempre y cuando tengas una mente limpia. –

1

Vas a necesitar algo para determinar el tráfico en cada servidor; esto debería dar como resultado una métrica con la que puedes comparar. Cada uno de los cinco servidores debe calcular su carga de tráfico de forma dinámica y actualizarla en alguna parte (sugiero una base de datos). Entonces, su servidor de aplicaciones para el usuario puede, cuando ingresa un usuario, consultar la base de datos del servidor con la menor carga y dirigirlos allí.

+0

@CallumWhyte: suenan como dos preguntas muy buenas para hacer en algún tipo de sitio de preguntas de programación. :-) –

+0

ya respondió allí –

0

Callum, soy nuevo aquí y no estoy muy seguro de si esto va en contra de las reglas, pero ya que no hay sistema de mensajería Estoy publicando esto aquí ... La respuesta a su pregunta que ha preguntado y eliminado sobre las esquinas redondeadas es agregar esto a su CSS: (Estaba averiguando cuando lo eliminó y luego no lo hizo) déjame publicar)

 
.result:first-child { 
      -moz-border-radius-topleft: 0px; 
      -moz-border-radius-topright: 10px; 
      -moz-border-radius-bottomright: 0px; 
      -moz-border-radius-bottomleft: 0px; 
      -webkit-border-radius: 0px 10px 0px 0px; 
      border-radius: 0px 10px 0px 0px; 
     } 
.result:last-child { 
      -moz-border-radius-topleft: 0px; 
      -moz-border-radius-topright: 0px; 
      -moz-border-radius-bottomright: 10px; 
      -moz-border-radius-bottomleft: 10px; 
      -webkit-border-radius: 0px 0px 10px 10px; 
      border-radius: 0px 0px 10px 10px; 
     } 
+0

puede sacar las líneas moz y webkit si esto es solo para iOS/Android – tsdexter

Cuestiones relacionadas