EntwicklerSkalierung
Skalierung
Eine App kann als mehrere Kopien auf mehreren Servern laufen. Das geht von Hand auf Servern, die du schon hast (Multi-Server), oder Hostwolf fügt je nach CPU-Last Server hinzu und entfernt sie wieder (Autoscaling). So oder so: Halte den Zustand von der eigenen Festplatte der App fern und lege Daten in eine verwaltete Datenbank, die jede Kopie erreicht.
Multi-Server#
Füge einer App einen weiteren deiner App-Server hinzu und deploye dann. Hostwolf baut das Image einmal, startet auf jedem Server eine Kopie, und der Hauptserver (primär) der App verteilt die Anfragen auf alle gesunden Kopien. Stoppt eine Kopie, gehen die Anfragen an die anderen.
# 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 ist eine server_uuid aus GET /hostwolf/servers. So stoppst du eine Kopie auf einem Server:
hw -X DELETE $API/applications/$APP/destinations/$DEST
- Jeder Server muss einer deiner Hostwolf App-Server sein. Der primäre lässt sich nicht entfernen; auf ihm wird die App gebaut.
- Während eines Deployments startet jeder Server seine Kopie neu, und die Anfragen gehen in der Zwischenzeit an die Kopien, die laufen.
- Volumes gibt es pro Server: Jede Kopie hat ihr eigenes. Gemeinsame Daten gehören in eine verwaltete Datenbank.
- Im SDK:
applications.addServer(appUuid, serverUuid); in MCP:add_app_server.
Autoscaling#
Autoscaling fügt einen App-Server hinzu, wenn die durchschnittliche CPU der App hoch bleibt, und entfernt ihn, wenn die Last sinkt. Neue Server kommen in die Stadt, aus der der meiste Traffic kommt, oder in die Städte, die du erlaubst. Jeder hinzugefügte Server hat dieselbe Größe wie der Hauptserver der 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
}
Schalte es mit PUT ein. Felder, die du weglässt, behalten ihren Wert:
hw -X PUT $API/applications/$APP/autoscaling -d '{"enabled": true, "max_copies": 4, "monthly_cap_usd": 40}'
| Feld | Bedeutung | Standard |
|---|---|---|
enabled | An oder aus | false |
min_copies / max_copies | Kopien, die immer laufen, und die Höchstzahl (1-100) | 1 / 2 |
monthly_cap_usd | Autoscaling fügt keine Server mehr hinzu, sobald die Autoscaling-Stunden dieses Monats diesen Betrag erreichen, und die Team-Admins bekommen eine E-Mail | 50 |
allowed_cities | Regions-IDs, in denen Server hinzugefügt werden dürfen; leer heißt in der Nähe deiner Besucher | [] |
scale_up_cpu / scale_up_minutes | Einen Server hinzufügen, wenn die CPU so lange über diesem Prozentwert liegt | 60 / 2 |
scale_down_cpu / scale_down_minutes | Einen entfernen, wenn die CPU so lange unter diesem Prozentwert liegt | 15 / 5 |
cooldown_minutes | Mindestzeit zwischen zwei Änderungen | 3 |
cities in derselben Antwort listet die Regions-IDs, die allowed_cities für diese App akzeptiert, die günstigste zuerst, mit dem Stundenpreis eines Servers dort. GET /hostwolf/regions?size=s listet jede Stadt mit dem Preis jeder Größe; autoscaling: true markiert die Städte, die das Autoscaling nutzen kann.
Abrechnung: Automatisch hinzugefügte Server kosten den regulären Preis pro Stunde (Monatspreis ÷ 730), aufgeschlagen auf deine nächste Serverrechnung. Sobald die Autoscaling-Stunden dieses Monats monthly_cap_usd erreichen, werden keine Server mehr hinzugefügt und die Team-Admins bekommen eine E-Mail. status.spend_usd zeigt die bisherigen Ausgaben dieses Monats, und status.copies listet die laufenden Kopien mit Stadt und CPU.
Wenn es sich nicht einschalten lässt, sagt blocker (und die 409-Antwort auf PUT), warum:
- der Hauptserver der App ist keiner deiner Hostwolf App-Server oder läuft nicht;
- die App hat keinen Port gesetzt (
ports_exposes); - dein Team hat kein aktives Server-Abo, auf das die Stunden kommen.
Ein neuer Server braucht etwa vier Minuten, bis er dabei ist; setze min_copies also vor einem Launch, von dem du weißt.
Push-Deployments mit mehreren Kopien#
Push-Deployments und CI-Deployments funktionieren mit mehreren Kopien genauso: ein Build, dann wird jede Kopie aktualisiert, auch auf Servern, die das Autoscaling hinzugefügt hat.