DesarrolladoresEscalado
Escalado
Una app puede ejecutarse como varias copias en varios servidores. Puedes hacerlo a mano en servidores que ya tienes (varios servidores), o dejar que Hostwolf añada y quite servidores según cambie la carga de CPU (autoescalado). En ambos casos, no guardes estado en el disco propio de la app: pon los datos en una base de datos gestionada, a la que llegan todas las copias.
Varios servidores#
Añade otro de tus servidores de aplicaciones a una app y despliega. Hostwolf hace el build de la imagen una vez, inicia una copia en cada servidor, y el servidor principal (primario) de la app reparte las peticiones entre todas las copias en buen estado. Si una copia se detiene, las peticiones van a las demás.
# The other server's destination (a Docker network on that server)
DEST=$(hw $API/servers/$OTHER_SERVER/destinations | jq -r '.[0].uuid')
hw -X POST $API/applications/$APP/destinations -d "{\"destination_uuid\": \"$DEST\"}"
hw -X POST $API/applications/$APP/start
hw $API/applications/$APP/destinations | jq # primary + copies
$OTHER_SERVER es un server_uuid de GET /hostwolf/servers. Para dejar de ejecutar una copia en un servidor:
hw -X DELETE $API/applications/$APP/destinations/$DEST
- Cada servidor debe ser uno de tus servidores de aplicaciones de Hostwolf. El principal no se puede quitar; es donde se hace el build de la app.
- Durante un despliegue cada servidor reinicia su copia, y mientras tanto las peticiones van a las copias que están activas.
- Los volúmenes son por servidor: cada copia tiene el suyo. Los datos compartidos van en una base de datos gestionada.
- En el SDK:
applications.addServer(appUuid, serverUuid); en MCP:add_app_server.
Autoescalado#
El autoescalado añade un servidor de aplicaciones cuando la CPU media de la app se mantiene alta, y lo quita cuando baja la carga. Los servidores nuevos se colocan en la ciudad que envía más tráfico, o en las ciudades que permitas. Cada servidor añadido tiene el mismo tamaño que el servidor principal de la app.
hw $API/applications/$APP/autoscaling | jq
{
"configured": false,
"blocker": null,
"policy": {
"enabled": false, "min_copies": 1, "max_copies": 2, "monthly_cap_usd": 50,
"allowed_cities": [], "scale_up_cpu": 60, "scale_up_minutes": 2,
"scale_down_cpu": 15, "scale_down_minutes": 5, "cooldown_minutes": 3
},
"cities": [{"id": "vultr:fra", "city": "Frankfurt", "country": "DE", "monthly_price": 18.79, "hourly_price": 0.0257}],
"status": null
}
Actívalo con PUT. Los campos que omitas conservan su valor:
hw -X PUT $API/applications/$APP/autoscaling -d '{"enabled": true, "max_copies": 4, "monthly_cap_usd": 40}'
| Campo | Significado | Por defecto |
|---|---|---|
enabled | Activado o desactivado | false |
min_copies / max_copies | Copias que siempre se ejecutan, y el máximo que puede haber (1-100) | 1 / 2 |
monthly_cap_usd | El autoescalado deja de añadir servidores cuando las horas autoescaladas de este mes llegan a esta cantidad, y los administradores del equipo reciben un email | 50 |
allowed_cities | Ids de región donde se pueden añadir servidores; vacío significa cerca de tus visitantes | [] |
scale_up_cpu / scale_up_minutes | Añade un servidor cuando la CPU supere este porcentaje durante este tiempo | 60 / 2 |
scale_down_cpu / scale_down_minutes | Quita uno cuando la CPU esté por debajo de este porcentaje durante este tiempo | 15 / 5 |
cooldown_minutes | Tiempo mínimo entre dos cambios | 3 |
cities, en la misma respuesta, lista los ids de región que acepta allowed_cities para esta app, de la más barata a la más cara, con el precio por hora de un servidor allí. GET /hostwolf/regions?size=s lista todas las ciudades con el precio de cada tamaño; autoscaling: true marca las ciudades que puede usar el autoescalado.
Facturación: los servidores autoescalados cuestan el precio normal por hora (precio mensual ÷ 730), añadido a tu próxima factura de servidores. Cuando las horas autoescaladas de este mes llegan a monthly_cap_usd, no se añaden más servidores y los administradores del equipo reciben un email. status.spend_usd muestra el gasto de este mes hasta ahora, y status.copies lista las copias en ejecución con su ciudad y CPU.
Cuando no se puede activar, blocker (y la respuesta 409 a PUT) dice por qué:
- el servidor principal de la app no es uno de tus servidores de aplicaciones de Hostwolf, o no está en marcha;
- la app no tiene ningún puerto definido (
ports_exposes); - tu equipo no tiene una suscripción de servidor activa a la que sumar las horas.
Un servidor nuevo tarda unos cuatro minutos en incorporarse, así que define min_copies antes de un lanzamiento que tengas previsto.
Despliegues por push con varias copias#
Los despliegues por push y los despliegues desde CI funcionan igual con varias copias: un solo build y luego se actualizan todas las copias, incluidos los servidores que añadió el autoescalado.