Estoy tratando de lograr implementaciones de tiempo de inactividad cero para poder implementar menos durante las horas libres y más durante las horas "más lentas", o en cualquier momento, en teoría.
Mi configuración actual, algo simplificada:
- Servidor web A (aplicación .NET)
- Servidor web B (aplicación .NET)
- Servidor de bases de datos (SQL Server)
Mi proceso de implementación actual:
- "Detener" los sitios en el servidor web A y B
- Actualice el esquema de la base de datos para la versión de la aplicación que se está implementando
- Actualizar el servidor web A
- Actualizar el servidor web B
- Vuelva a poner todo en línea
Problema actual
Esto lleva a una pequeña cantidad de tiempo de inactividad cada mes, aproximadamente 30 minutos. Hago esto durante las horas libres, por lo que no es un gran problema, pero es algo de lo que me gustaría escapar.
Además, no hay forma de volver realmente 'atrás'. Por lo general, no hago scripts de DB de reversión, solo scripts de actualización.
Aprovechando el equilibrador de carga
Me encantaría poder actualizar un servidor web a la vez. Saque el servidor web A del equilibrador de carga, actualícelo, vuelva a ponerlo en línea y luego repita para el servidor web B.
El problema es la base de datos. Cada versión de mi software deberá ejecutarse en una versión diferente de la base de datos, por lo que estoy "atascado".
Solución posible
Una solución actual que estoy considerando es adoptar las siguientes reglas:
- Nunca elimine una tabla de base de datos.
- Nunca elimine una columna de base de datos.
- Nunca cambie el nombre de una columna de base de datos.
- Nunca reordene una columna.
- Todos los procedimientos almacenados deben ser versionados.
- Significado: 'spFindAllThings' se convertirá en 'spFindAllThings_2' cuando se edite.
- Luego se convierte en 'spFindAllThings_3' cuando se edita nuevamente.
- La misma regla se aplica a las vistas.
Si bien, esto parece un poco extremo, creo que resuelve el problema. Cada versión de la aplicación llegará a la base de datos de manera ininterrumpida. El código espera ciertos resultados de las vistas / procedimientos almacenados, y esto mantiene válido ese 'contrato'. El problema es que simplemente parece descuidado. Sé que puedo limpiar viejos procedimientos almacenados después de que la aplicación se implemente por un tiempo, pero se siente sucia. Además, depende de que todos los desarrolladores sigan estas reglas, lo que sucederá principalmente, pero imagino que alguien cometerá un error.
Finalmente: mi pregunta
- ¿Es esto descuidado o hacky?
- ¿Alguien más lo está haciendo de esta manera?
- ¿Cómo están resolviendo este problema otras personas?