Respuestas:
Sospecho que están implementando la última versión de su código, lo que requiere que reinicien la aplicación (y con suerte ejecuten algunas pruebas antes de volver a habilitar el acceso). Desde ese punto de vista, es más un problema de StackOverflow y menos un problema de ServerFault.
Creo que es posible crear un sistema de parches en caliente, pero necesariamente sería increíblemente complicado. Por lo que entiendo, una "aplicación" del servidor MMO consta de varios componentes diferentes:
Servidor de inicio de sesión : maneja la autenticación y actúa como un "centro" entre los servidores de juego. Una vez que un cliente está en el juego, ya no interactúa con el servidor de inicio de sesión. En dicho sistema, podría aplicar parches y reiniciar el servidor de inicio de sesión sin interferir con el juego (aunque tendrá un período de tiempo en el que las personas no podrán iniciar sesión).
Servidores de juego : grupos de máquinas agrupadas en unidades lógicas independientes ("mundos", etc.). Se supone que cada grupo de juego utiliza algún tipo de protocolo de comunicación interna para corresponder el estado entre sí; probablemente tendrá que parchear cada grupo de una vez. Una posible forma de hacerlo es parchear una conmutación por error en caliente. Entonces necesitarías poder ambas
Servidores de bases de datos : algún tipo de almacén de datos persistente, como un RDBMS. Esperemos que no realice cambios en el almacén de datos con tanta frecuencia. Presumiblemente, cada servidor / clúster de juego tiene un almacén de datos independiente. Es posible que pueda usar el mismo truco con una conmutación por error cálida (y decirle a los servidores del juego que se desconecten, esperen a que se sincronicen las bases de datos antiguas y de conmutación por error, luego vuelva a conectarse a la conmutación por error), pero eso me parece bastante arriesgado.
Todos los casos anteriores agregan una increíble cantidad de complejidad a un sistema ya complejo e introducen un montón de lugares donde una falla en el código puede causar pérdida de datos o corrupción.
Otra solución es utilizar un lenguaje que esté diseñado para un tiempo de actividad del 100% y que tenga capacidades incorporadas para ejecutar código en caliente. Erlang es una buena opción ( ejemplo de hotpatching ), y Java tiene una funcionalidad similar .
¿Nadie más tiene experiencia realmente ejecutando algo como esto? Huh
Hay varias razones que unen tanto el código como los sistemas. Primero, recuerde que la mayoría de los motores MMO 'grandes' actuales se programaron hace varios años, y a pesar de las actualizaciones de gráficos y tecnología desde entonces, todavía dependen de la forma en que se escribieron muchos de estos sistemas en el año 2000 más o menos. Eve-Online, por ejemplo, todavía se ejecuta en una gran instancia de Microsoft SQL Server, por lo que siempre están tratando de sacar más provecho actualizando el hardware.
Un ejemplo de una mejora desde que WoW y EVE comenzaron es el trabajo realizado en bases de datos distribuidas de clave / valor como MapReduce de Google (y su implementación de código abierto, Hadoop), servicios de cola de procesamiento de respuesta afirmativa extremadamente rápidos (Amazon SQS) y otros " tecnologías orientadas a la nube ".
Tengo la mayor experiencia con EVE (soy más un tipo de láser que un tipo de hachas de batalla), por lo que algunos de estos ejemplos están más orientados a EVE.
En cuanto a las razones de los Sistemas:
En cuanto a las razones del software:
Manejar una economía con bucles cerrados y abiertos es un problema para los operadores de MMO: si no me cree, lea algunos de los documentos académicos que se han escrito sobre las economías de juegos y algunos de los estudios de juegos más antiguos como Ultima Online que tuvo economías relativamente primitivas. El análisis que debe realizarse para reponer los bucles abiertos e identificar trampas y otras actividades económicas negativas debe realizarse fuera de línea con una instantánea de los datos, que a veces solo se puede tomar mientras la base de datos está completamente bloqueada.
Si observa, el mantenimiento de Eve ocurre cuando es mediodía en Inglaterra, donde se encuentra el centro de datos principal.
Sospecho que el tiempo total que Blizzard (deduzco que dado que es un martes por la mañana que está publicando su pregunta) cotiza para el mantenimiento es para todo el clúster; No todos los servidores tardan tanto en realizar el trabajo.
Si bien es posible que los servidores individuales vuelvan a funcionar más rápidamente, eso provocaría gritos de favoritismo hacia los jugadores cuyos dominios cayeron antes en el calendario. Como tal, mantienen todo bajo hasta que se realiza todo el trabajo; Con cientos de reinos en los que trabajar, probablemente hagan gran parte del trabajo en paralelo, pero aún así serializan una verificación final antes de volver a poner las cosas en línea. Si está realizando una actualización de hardware, esto probablemente se serializa en tantos centros de datos como lo hayan hecho.
En cuanto a por qué realizan el mantenimiento, parte de esto podría ser solo un reinicio del rendimiento. Si bien sería genial si no se requirieran tales reinicios, el costo de hacerlo frente al impacto de no hacerlo podría estar dirigiendo su elección aquí.
Cuando observas por qué no pueden agrupar los procesos y realizar un mantenimiento continuo, lo que poca gente sabe de la infraestructura de WoW sugiere que varias máquinas brindan servicio para cada reino (es decir, una para el mundo, una para instancias y redadas, una para campos de batalla). , etc.) no utilizan una configuración de proceso activo-activo de estado compartido. No se comparte el estado en vivo, solo los datos persistentes a través de una base de datos.
Al final, la mecánica de proporcionar un servicio en línea con estado a una base de suscriptores tan grande desafía algunas de las mejores prácticas que podríamos adoptar al hablar de un sitio web u otro servicio tradicional basado en Internet.
Algunos de los tiempos de inactividad extendidos más recientes en EvE Online han sido sobre la instalación de nuevo hardware como una SAN más rápida. Si bien uno puede mover técnicamente la mayor parte de los datos creando un nuevo grupo de archivos en la nueva unidad y luego vaciando el principal, eso habría resultado en un período prolongado de rendimiento reducido debido a la constante E / S. Entonces optaron por separar la base de datos 1.1TB y moverla de una vez.
La respuesta a esta pregunta también se basa en la aplicación específica. Por ejemplo, un servidor que maneja un sistema estelar específico no se puede cambiar sin interrumpir el juego, por lo que el tiempo de inactividad se utiliza para reasignar servidores más potentes en puntos de acceso potenciales. Además, se calculan los cálculos de propiedad (soberanía) de los sistemas estelares. Esto depende de las decenas de diferentes variables, todas las cuales pueden cambiar según las acciones del jugador. No hace falta decir que hacer eso en vivo puede causar un bloqueo excesivo y / u otros problemas de concurrencia. Pero abordarlos es mejor dejarlo en stackoverflow .
En un tema reciente ¿Con qué frecuencia debo reiniciar los servidores de Linux? Se mencionó otro buen punto, verificando que todo se inicia correctamente en un reinicio o después de cualquier cambio de configuración (importante).
He implementado una arquitectura MMO en Erlang que admite actualizaciones y distribución de código activo. Por ejemplo, un "Servidor GamePlay" puede ejecutarse en un número arbitrario de máquinas, si uno necesita una actualización de hardware, sus objetos pueden transferirse (en tiempo real) a las otras máquinas. Esto permite actualizaciones en el hardware del software sin ningún tiempo de inactividad.
Puede visitar mi sitio en http://www.next-gen.cc .
Me hacen creer que la ventana de mantenimiento también permite el reemplazo de hardware de rutina para garantizar que los componentes no fallen.