Hoppa till innehållet
Drift och självläkning

Maskinen stänger av det oviktiga innan det viktiga tar skada

Varje tjänst har en resursbudget, så att ingen kan äta någon annans. En vakt läser kärnans egen tryckmätning och fryser den lägsta nivån innan sajten blir onåbar. Kopiorna läses tillbaka varje månad på en annan maskin, och går det inte stoppas utrullningarna. Hela lagret ligger öppet, inklusive det det inte klarar.

3 nivåerResursbudgetar, och vakten rör bara den nederstaSkivorna i ops/sjalvlakning/README.md
9 kontrollerDriftgrinden, alla gröna innan något nytt får startaDeploygrinden i ops/sjalvlakning/README.md
40 MB/sLästak på nivå 2, det som ensamt hade räckt för att undvika avbrottetBandbreddstaket i ops/sjalvlakning/README.md
TJÄNSTINGET SVARVAKTHÄLSOFRÅGATIDEN GICK UTOMSTART12345PAUSEN VÄXERLARM, INGEN LOOP
Tre nivåer

Ingen tjänst kan äta någon annans utrymme

Ett avbrott börjar nästan aldrig med att något går sönder. Det börjar med att något oviktigt tar allt, och att det viktiga står och väntar på disken. Nivåerna gör den ordningen omöjlig, eftersom golvet under nivå 0 är hårt och nivå 2 inte har något golv alls.

Nivå 0

Det som aldrig får dö

Sajten, inloggningen, lastbalanseraren, vägen in och övervakningen. Nivån har ett hårt minnesgolv som kärnan aldrig återvinner under, ens när den är på väg att döda något.

CPUWeight 800, alltså 78 procent av fyra kärnor under full konkurrens. Minnesgolvet är hårt.

Nivå 1

Era tjänster och era databaser

Applikationerna, databaserna och köerna. Nivån har eget golv och egen broms, och tryckvakten rör den aldrig. Ett bygge som skenar kan därför inte ta databasen med sig.

CPUWeight 200, alltså 20 procent under full konkurrens. Eget minnesgolv, egen broms.

Nivå 2

Bygge, batch och kopiering

Det som får ta tid. Nivån har inget minnesgolv alls, ett lästak på disken och ett processortak även när maskinen står stilla i övrigt. Det är den här nivån som stängs av först.

CPUWeight 20 och CPUQuota 200 procent. Lästak 40 MB/s genom io.max, alltså oavsett schemaläggare.

NIVÅ 2BÄST MÖJLIGANIVÅ 1NORMALNIVÅ 0GARANTERADINGET GOLVHÅRT GOLVGÅR INTE ATT ÄTAMINNE PÅ VÄRDENRESERVERATNIVÅ 0NIVÅ 2 VÄXERSTOPPAD VID GOLVET

Vikterna och andelarna är räknade i ops/sjalvlakning/README.md under rubriken Aritmetiken, mot fyra kärnor under full konkurrens. Räkningen står utskriven där, så att den går att göra om för en annan maskinstorlek.

LÅGTHÖGTTRYCKFRYSSLÄPPNIVÅ 2 FRYSTNIVÅ 0 ORÖRDHYSTERESKÖRFRYST
Tryckvakten

Den mäter förlorad tid, inte hur många som köar

Vakten läser kärnans tryckmätning, alltså hur lång tid uppgifter blockeras. Skillnaden mot lasttalet är hela poängen. Ett högt lasttal kan komma från fyra tunga byggen som inte stör någon. Det som gör en sajt onåbar är att disktrycket ligger uppe mot hundra procent.

  1. 1

    Stoppar timrarna på nivå 2

    Inget nytt startar. Det som redan kör fortsätter, och ingenting avbryts. Steget är riskfritt och tas därför först.

  2. 2

    Fryser hela nivå 2

    Allt som kör pausas där det står. En frusen process kan tinas och fortsätta, så ingen byggkörning behöver börja om från början.

  3. 3

    Larmar till en människa

    Vakten dödar aldrig något, och den rör aldrig nivå 0 eller nivå 1. Det är inte en inställning, eftersom en inställning är något någon förr eller senare ändrar.

Hysteresen är avsiktligt bred

Tre mätningar över stopptröskeln räcker för att stoppa, men sextio mätningar under en lägre starttröskel krävs för att släppa på igen. Utan det gapet slår vakten av och på i takt med sin egen avstängning, och då blir den en vakt någon stänger av.

Trapporna, trösklarna och hysteresen står i ops/sjalvlakning/README.md under rubriken Vad tryckvakten faktiskt gör. Vakten går att köra en gång på begäran, så att ni kan kontrollera den utan att vänta på en incident.

Fällorna

Rader som ser rätt ut i filen och har noll verkan i maskinen

Den farligaste sortens skydd är det som ser ut att finnas. Raderna nedan låg i en konfiguration som hade granskats, och de begränsade ingenting. Därför kontrolleras varje tak efteråt i stället för att antas, och installationen säger till när kontrollen inte hittar något värde.

IOWeight utan bfq gör ingenting

Kärnans io-styrenhet fördelar bandbredd per vikt först när schemaläggaren stödjer det, och mq-deadline, som är standard för NVMe, gör inte det. Raden ser rätt ut och begränsar ingenting. Därför sätts bfq med en egen udev-regel, och lästaket sätts dessutom med io.max, som fungerar oavsett schemaläggare.

ops/sjalvlakning

En felskriven enhetssökväg accepteras tyst

Ett lästak som pekar på en enhet som inte finns ger inget fel vid start och ingen begränsning i drift. Installationen slår därför upp rotfilsystemets faktiska blockenhet och kontrollerar efteråt att taket verkligen fick ett värde. Är filen tom gäller inget tak, och då säger installationen det.

ops/sjalvlakning

Komprimerat minne som skrivs vidare till disk

En komprimerad sida i minnet är mycket billigare att hämta tillbaka än en sida från disk. Skrivs den vidare till samma disk som databaserna ligger på försvinner hela vinsten, och lasten hamnar i exakt den kö som redan är för lång. Skrivningen vidare är därför avstängd, och kärnparametrarna är satta för komprimerat minne i stället för för växling på disk.

ops/sjalvlakning

Ett lästak ensamt hade räckt

En kopiering läste omkring 366 megabyte i sekunden i över trettioåtta minuter och slog ut disken för alla andra. Med lästaket på 40 megabyte i sekunden tar samma kopia av en databas på 1,3 gigabyte trettiotre sekunder. Det är hela skillnaden mellan en säkerhetskopia och ett avbrott, och den ligger i en rad.

Mätvärdena och räkningen står i ops/sjalvlakning/README.md under rubriken Vad som gick sönder, och vilken rad som lagar det.

Säkerhetskopior

En kopia som aldrig har lästs tillbaka är inte en kopia

En frisk databas är inget bevis på att gårdagens fil går att öppna. Beviset är att någon faktiskt läser tillbaka den, på en annan maskin än den som skrev den, och att utrullningarna stoppas när det inte har gjorts.

  • Motorriktig kopiering, alltså inte en filkopia av en levande databas

  • Återställningsprov varje månad på en annan maskin

  • Utrullning stoppas när provet inte har körts

  • Kopiornas ålder syns i instrumentpanelen

Listan är tjänsten Säkerhetskopior som den står i app/lib/katalog.ts. Motorn är restic under BSD-2-Clause.

PRIMÄRSKRIVERLÄSEKOPIALÄSERWALVARJE ÄNDRING, I ORDNINGARKIV14:02:11FÖNSTRETS BÖRJANNUVILKEN SEKUND SOM HELST
KÄLLALÅSEN I TAGETÄGGKLOCKAAVBRYTER DEN SOM HÄNGERVÄXLINGI ETT STEGMÅLHALV FILNÅR ALDRIG MÅLETTRE SPÄRRAR I SAMMA BANA
URSPRUNGETRÖRS INTEARKIVLÄS TILLBAKAANNAN MASKINSUMMA I ARKIVET9c1f4a7eSUMMA EFTER LÄSNING9c1f4a7ePROVAD, INTE ANTAGEN

GDR-HOST-0607

Säkerhetskopian har inte kunnat läsas tillbaka i sitt senaste prov.

Kontakta supporten innan du gör något som skriver över data. Vi har spärrat utrullningar mot den här tjänsten tills provet går igenom.

Svarsstatus
409
Allvarlighetsgrad
critical
Grinden stänger vid
ett prov som är äldre än trettio dagar

Texten är hämtad ur packages/errors/src/catalog.ts. Koden ändras aldrig, eftersom den hamnar i supportärenden och i skärmbilder som kunder skickar in.

Motorriktig kopiering, inte en filkopia

En filkopia av en databas som skrivs ger en fil som öppnas utan fel och saknar de sista skrivningarna, alltså den farligaste sortens trasig kopia. SQLite kopieras därför genom databasen själv, och Postgres kopieras per databas plus rollerna, som ligger utanför varje databas.

En återställning utan roller och rättigheter ger tabeller som ingen har rätt att läsa.

En trasig kopia får aldrig skriva över en hel

Varje kopia skrivs till en tillfällig fil, kontrolleras, och växlas in först därefter. Halvvägs genom en kopiering finns alltså alltid den förra kopian kvar, orörd.

En halvskriven målfil som ser ut som en säkerhetskopia är den vanligaste vägen till att båda kopiorna är borta.

Jobbet kan inte starta ovanpå sig självt

Varje jobb tar ett lås och har en tidsgräns. Ett jobb som hänger blockerar därför nästa körning i stället för att lägga sig ovanpå den, och det avbryts när tiden är slut.

Samma jobb startat på sig självt var en av sex orsaker bakom avbrottet som paketet är skrivet ur.

Övervakning

Tystnad är larmet

En maskin som ligger nere kan inte berätta att den ligger nere. Därför skickar den en puls varje minut till en annan maskin, och det är uteblivna pulser som larmar. Kontrollen utifrån går dessutom samma väg som en besökare, och inte genom vårt eget nät.

  • Larmvägen går aldrig genom vår egen mejl

  • Kontroll utifrån, alltså samma väg som en besökare

  • Puls från maskinen, där tystnaden är larmet

  • Koppling till Gaddr Log utan egen agent

Larmvägen går aldrig genom vår egen mejl

Ligger mejlen nere är det precis då larmet behövs. Larmet går därför en egen väg, och når det inte fram läggs det i en kö som skickas när vägen är tillbaka. Ett larm som försvann för att larmvägen delade öde med det som larmade är inget larm.

Motorerna är Prometheus (Apache-2.0), VictoriaMetrics (Apache-2.0), OpenTelemetry Collector (Apache-2.0). Grafana körs som en egen opåverkad tjänst och vävs aldrig in i vår kod, eftersom den ligger under AGPL. Källa: app/lib/katalog.ts.

MASKINENANNAN MASKINTYSTNADPULS VAR FEMTE SEKUNDTRE UTEBLIVNA PULSERLARMET GÅR FRÅN DEN ANDRA MASKINEN, INTE FRÅN DEN TYSTALARM
Kylanläggning och kraftmatning i ett datorhall, det som ligger under varje löfte om drift
Driftgrinden

13 kontroller mellan bygget och starten

En utrullning på en maskin som redan är trång gör felet värre. Grinden kör därför 13 kontroller innan något nytt får starta, och alla 13 måste vara gröna. Den första är att grinden själv är oförändrad, eftersom de övriga bara är värda något om koden som kör dem är den vi installerade. Säger en av dem nej fortsätter den gamla versionen köra och utrullningen svarar med en kod ni kan söka på.

  1. 1

    Lagret självt är oförändrat, kontrollerat mot ett manifest med summa, rättighet och ägare.

  2. 2

    Trycket ligger under stopptrösklarna.

  3. 3

    Tryckvakten har inte redan stängt av nivå 2.

  4. 4

    Ingen process har väntat på disken i över en minut.

  5. 5

    Över tolv procent ledigt utrymme och över tio procent lediga inoder.

  6. 6

    Ingen strypning och ingen underspänning sedan start.

  7. 7

    Inga trasiga systemtjänster.

  8. 8

    Nivå 0 svarar på sina portar, alltså att tjänsten svarar och inte att behållaren kör.

  9. 9

    Vägen in är uppe, så maskinen går att nå när något går fel.

  10. 10

    Maskinen har inte just startat om utan att någon vet varför.

  11. 11

    Växlingsutrymmet är inte fullt, alltså kastar inte varje ny allokering något annat först.

  12. 12

    Tryckvakten kör och mäter. En vakt som är aktiverad men står stilla är en vakt som saknas.

  13. 13

    Kopiorna är inom sin ålder och återställningsprovet har körts.

GDR-HOST-0603

Driftgrinden stoppade utrullningen.

Läs vilken av kontrollerna som sa nej i utrullningsloggen. En utrullning under lagringstryck gör felet värre, inte bättre.

Koden är densamma i loggen, i instrumentpanelen och i supportärendet, så att alla tre tittar på samma händelse. Så ser utrullningen ut.

Kontroll sju är den som kostade mest att lära sig

Grinden kontrollerar att tjänsten svarar på sin port, inte att behållaren kör. Den skillnaden är precis vad som gjorde att en hälsokontroll lyste grönt framför en död väg. En kontroll som mäter processen och inte svaret är en kontroll som ljuger.

Provet körs efter varje ändring

Fjorton fall, utan root och utan att röra en riktig tjänst. Ett av fallen är de exakta mätvärdena från den natt paketet skrevs ur, så att just den kombinationen aldrig ska kunna passera vakten tyst igen. Provet kontrollerar också att varje starttröskel ligger under sin stopptröskel, och att ingen tjänst står på två nivåer samtidigt.

Provet står i ops/sjalvlakning/README.md under Provet.

Ärligt om gränserna

En maskin är en felzon, och ingen självläkning ändrar det

Går kortet, strömmen eller nätanslutningen sönder finns ingen andra maskin som tar över. Varje påstående om hög tillgänglighet kräver en andra felzon, ett mätt återställningsmål och en övervakning som inte står på samma maskin. Paketet ger de två sista. Den första köper ni.

Vad Gaddr Hosting kan säga i dag på en felzon, och vad som krävs för att säga mer.
VadVad vi kan säga i dagVad som krävs för mer
TillgänglighetVi mäter den och publicerar mätningen på statussidan.En andra felzon och en väg in som växlar över av sig själv.
Dataförlust, nivå 0Högst ett dygn tillbaka, och det är mätt och inte uppskattat.WAL-arkivering, som tar samma tal till under en minut.
Dataförlust, nivå 1Högst ett dygn tillbaka, mätt på samma sätt.WAL-arkivering, som ingår i tjänsten Databaser.
Tid till återställningTimmar, med en människa som gör arbetet.En varm reserv, som tar samma tal till minuter.
Kopiorna går att läsa tillbakaBevisat varje månad, på en annan maskin än den som skrev dem.Oftare, och utan att någon startar provet.

Tabellen är skriven för att kunna klistras in i ett avtal, och den står ordagrant i ops/sjalvlakning/README.md under rubriken Vad vi kan lova, och vad vi inte kan. Ett tal som 99,99 är ett avtalsvillkor med ett skadestånd i andra änden, och därför står inget sådant tal på den här sidan utan mätningen bakom sig.

Vägen till en andra felzon

Ordningen är vald så att varje steg ger nytta ensamt. Ni behöver inte gå hela vägen för att få något av den.

  1. 1

    Arkivera skrivloggen till en annan plats

    Ger återställning till vilken sekund som helst i stället för till senaste natten. Det kräver ingen ny maskin, och det ingår i tjänsten Databaser.

  2. 2

    En andra maskin som bara tar emot

    En maskin som tar kopiorna och skrivloggen. Den ger en plats att återställa till, och den gör det månatliga provet möjligt att köra utan att någon startar det.

  3. 3

    Läskopia av databaserna på den maskinen

    Strömmande replikering. Nu ligger data på två ställen i samma stund och inte en gång per natt.

  4. 4

    En väg in som kan peka om

    Först här får ordet redundans användas. Det är en annan produkt och ett annat pris, och det står i avtalet innan ni skriver på.

Steg ett ligger i tjänsten Databaser: WAL-arkivering, alltså återställning till vilken sekund som helst. Steg två och tre kräver en maskin till, och steg fyra är en egen produkt med ett eget pris. Läs om databaserna.

Per plan

Vad drift betyder i pengar

Självläkningen körs på varje maskin, i varje plan. Det som skiljer planerna åt är hur snabbt ni når en människa när maskinen har gjort allt den kan göra själv.

Svarstid, kvarhållning av loggar och pris per plan i Gaddr Hosting.
PlanVad ni får när det brinnerFör vemPris
FriForum och dokumentation, och samma självläkning som alla andraDen som provar, den som bygger på fritiden, och studenten.0 kr
UtvecklareSvarstid 8 arbetstimmar, larm till chatt eller webhook, kopior med bevisat återställningsprovDen som har något i drift och vill kunna nå en människa.19 € per månad
TeamSvarstid 1 timme, dygnet runt, jour med telefonnummer och namn, kvarhållning 90 dagarEtt företag med kunder som märker när något ligger nere.99 € per månad
SuveränAvtalad svarstid med kompensation om vi missar den, och utpekad maskinvaraMyndighet, koncern och den som har ett säkerhetsskyddsavtal.Offert

Svarstiderna och beloppen läses ur HOSTING_PLANS i packages/pricing, och de står i samma fil som kassan läser. Hela prislistan.

Det som håller igång

Fyra saker som avgör om maskinen står kvar i morgon

Drift är inte en lovad siffra, den är fyra fysiska beroenden. Kylan fallerar först, kraften näst, disken tredje, och maskinen själv sist. Vi mäter dem i den ordningen.

  • Kylan är det som fallerar först när något går fel.
  • Kraften har två vägar in, inte en.
  • Kopian prövas genom att läsas tillbaka, inte genom att finnas.
  • Maskinen mäter sig själv och fryser sin lägsta nivå.
Frågor

Det ni vill veta innan ni flyttar in något viktigt

Vanliga frågor

Vad gör tryckvakten med mina tjänster?

Ingenting, om de ligger på nivå 0 eller nivå 1. Vakten stoppar timrarna på nivå 2, fryser den nivån om trycket står kvar, och larmar. Den dödar aldrig en process och den rör aldrig de två övre nivåerna. Ett bygge som frystes kan tinas och fortsätta där det stod.

Kan ett bygge ta ned vår databas?

Nej. Bygget ligger på nivå 2 med ett processortak, ett lästak på disken och inget minnesgolv. Databasen ligger på nivå 1 med eget golv. Under full konkurrens får nivå 2 två procent av kärnorna, och det taket gäller även när maskinen står stilla i övrigt.

Vad händer om en säkerhetskopia inte går att läsa tillbaka?

Provet körs på en annan maskin varje månad. Går det inte svarar vi GDR-HOST-0607 och spärrar utrullningar mot den tjänsten. Kontakta supporten innan du gör något som skriver över data. Vi har spärrat utrullningar mot den här tjänsten tills provet går igenom.

Varför stoppas vår utrullning ibland?

Driftgrinden kör 13 kontroller innan något nytt får starta, och svarar GDR-HOST-0603 när en av dem säger nej. Läs vilken av kontrollerna som sa nej i utrullningsloggen. En utrullning under lagringstryck gör felet värre, inte bättre. Kontrollerna står utskrivna längre upp på den här sidan.

Ger ni ett tal för tillgänglighet?

Vi mäter tillgängligheten och publicerar mätningen på statussidan. Ett tal som 99,99 är ett avtalsvillkor med ett skadestånd i andra änden, och ett sådant villkor skrivs i avtalet i planen Suverän och inte i en rubrik på en säljsida.

Hur mycket data kan vi förlora i värsta fall?

Med kopior en gång per dygn är svaret högst ett dygn, och det talet är mätt. Med arkiverad skrivlogg blir samma tal under en minut, och det ingår i tjänsten Databaser. Tabellen ovanför säger vilket som gäller för vad.

Kör ni allt på en maskin?

Nej, men varje enskild maskin är en felzon, och det är den punkt som avgör vad som får lovas. Ni väljer region när projektet skapas, och en tjänst som ska överleva att en hel region faller kräver att den ligger i två. Se regionerna.

Får vi läsa hur självläkningen fungerar?

Ja. Lagret ligger i ops/sjalvlakning tillsammans med sin beskrivning, sina trösklar, sin räkning och sitt prov. Där står också vad det inte klarar, eftersom ett skydd som beskrivs utan sina gränser är ett skydd ingen kan planera runt.

Larmar ni oss, eller får vi upptäcka det själva?

Larmet går ut ur maskinen och aldrig genom vår egen mejl, eftersom mejlen kan ligga nere av samma orsak. Planen Utvecklare har larm till chatt, Slack, Teams eller webhook, och planen Team har jour dygnet runt med telefonnummer och namn.

Kan vi stänga av självläkningen på våra maskiner?

Nivåerna sätts per tjänst, så ni väljer själva vad som ligger var. Det som inte går att stänga av är att en tjänst måste ligga på exakt en nivå. Två nivåer för samma tjänst betyder att radordningen avgör, och den som läser filen ser inte vilken rad som vann.

Flytta in något litet först, och läs mätningen i en vecka

Planen Fri kostar 0 kr och har samma självläkning som varje annan plan. Taket står på noll från början, så det finns ingenting att ångra.