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}'
FeldBedeutungStandard
enabledAn oder ausfalse
min_copies / max_copiesKopien, die immer laufen, und die Höchstzahl (1-100)1 / 2
monthly_cap_usdAutoscaling fügt keine Server mehr hinzu, sobald die Autoscaling-Stunden dieses Monats diesen Betrag erreichen, und die Team-Admins bekommen eine E-Mail50
allowed_citiesRegions-IDs, in denen Server hinzugefügt werden dürfen; leer heißt in der Nähe deiner Besucher[]
scale_up_cpu / scale_up_minutesEinen Server hinzufügen, wenn die CPU so lange über diesem Prozentwert liegt60 / 2
scale_down_cpu / scale_down_minutesEinen entfernen, wenn die CPU so lange unter diesem Prozentwert liegt15 / 5
cooldown_minutesMindestzeit zwischen zwei Änderungen3

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.

Kommst du nicht weiter, oder fehlt ein Endpunkt? Sag es uns unter app.hostwolf.net/contact oder [email protected].